2011-05-20 13 views
32

La siguiente inicia una excepción "The process cannot access the file 'D:\MyDir\First.txt' because it is being used by another process."¿Por qué es necesario cerrar File.Create?

static void Main(string[] args) 
{ 
    Directory.CreateDirectory(@"D:\MyDir"); 
    File.Create(@"D:\MyDir\First.txt"); 
    File.WriteAllText(@"D:\MyDir\First.txt", "StackOverflow.com"); 
} 

Sin embargo siguientes obras:

using (File.Create(@"D:\MyDir\First.txt")) 
{ 
} 

o

File.Create(@"D:\MyDir\First.txt").Close(); 

¿Por qué? ¿Qué se debe cerrar en el File.Create?

+0

posible duplicado de [Archivo utilizado por otro proceso después de usar File.Create()] (http://stackoverflow.com/questions/2781357/file-being-used-by-another-process-after-using- file-create) – bluish

Respuesta

45

File.Create está haciendo más de lo que piensa aquí. No solo se trata de crear el archivo, también está devolviendo una secuencia activa al archivo. Sin embargo, no estás haciendo nada con esa transmisión. El bloque using en su último ejemplo cierra esa secuencia deshaciéndose de ella.

Tenga en cuenta también que se trata de una pista significativa sobre el valor de retorno:

File.Create(@"D:\MyDir\First.txt").Close(); 

(En realidad, no era intuitivo para mí cuando leí por primera vez su pregunta, pero mirando hacia atrás en esta línea de código en realidad lo dice todo.)

Su siguiente paso, llamar al File.WriteAllText también hace más de lo que cree. De acuerdo con the documentation, esto:

Crea un nuevo archivo, escribe la cadena especificada en el archivo y luego cierra el archivo.

Parece que su llamada File.Create no es realmente necesaria aquí de todos modos.

+5

+1 Por mencionar que devuelve un 'FileStream' y es redundante. –

22

Porque abre un flujo de archivos, que es una clase que gestiona algunos recursos de bajo nivel del sistema operativo y debe liberarse para permitir que otras operaciones en otros hilos, e incluso en otras aplicaciones, accedan al archivo.

10

Los docs MSDN para File.Create() explican esto:

El objeto FileStream creado por este método tiene un valor predeterminado FileShare de Ninguna; ningún otro proceso o código puede acceder al archivo creado hasta que se cierre el identificador de archivo original .

Básicamente, hasta que se cierre la creación del archivo, no se podrá acceder al archivo mediante otro proceso (en este caso, intentar escribir en él).

10

No necesita llamar al File.Create() para poder llamar al File.WriteAllText().

File.WriteAllText() creará un nuevo archivo y escribirá en él y luego cerrará el archivo todo en un método práctico.

Si el archivo ya existe, se sobrescribirá.

7

File.Create(string) devuelve un objeto FileStream que mantiene el archivo abierto. Aunque no mantiene una referencia al objeto FileStream en una variable, todavía existe.El objeto es eligable para la recolección de basura, y cuando eso sucede, el archivo se cerrará, pero no se puede predecir cuándo se realizará la recolección de basura.

Cuestiones relacionadas