2011-01-13 12 views
45

Estoy usando System.IO.File.Create para crear un archivo. No estoy escribiendo con un escritor de secuencias, simplemente creándolo.System.IO.File.Create locking a file

Aparece un error del servidor en la interfaz cuando la aplicación intenta abrir el archivo recién creado, que el archivo está en uso. La recolección de basura parece venir y unos minutos más tarde todo está bien.

Ahora sé que si estuviera usando Streamwriter tendría que cerrarlo. ¿Se aplica lo mismo a la creación?

He leído que abrir una secuencia de escritura en el archivo y cerrarlo inmediatamente lo arreglará, pero parece complicado. ¿Hay alguna forma más simple?

+0

vamos a ver su código – Kev

Respuesta

64

File.Create devuelve un FileStream. Debe usarlo así:

using (FileStream fs = File.Create(path)) 
{ 
    //you can use the filstream here to put stuff in the file if you want to 
} 
+1

Tendría que nunca esperaba. – Traubenfuchs

11

Al crear el archivo se abre un FileStream, por lo tanto, al bloquearlo (File.Create se devuelve el FileStream).

Debe cerrar esta secuencia para acceder al archivo. Esto se hace mejor con un comunicado using:

using(FileStream fs = File.Create(path)) 
{ 
} 
1

El método Create devolverá un identificador de archivo. El identificador de archivo debe cerrarse antes de volver a usar el archivo. Consulte los detalles en el artículo de MSDN File.Create Method (String).

Resumen:

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

8

Al usar File.Create se obtiene un FileStream devuelto. Hasta que cierre la secuencia o hasta que el objeto FileStream sea eliminado (por el finalizador del recolector de basura) permanecerá abierto y bloqueado.

FileStream implementa IDisposable por lo que puede hacer lo siguiente:

using(FileStream fs = File.Create(filename)) 
{ 
    // Do stuff like write to the file 
} 

La declaración using es "azúcar sintáctico" y hace que el compilador para generar código que es funcionalmente equivalente a:

FileStream fs = File.Create(filename) 
try 
{ 
    // Do stuff like write to the file 
} 
finally 
{ 
    fs.Dispose(); 
} 

El El método Dispose llama internamente al Close.

1

que estaba usando: System.IO.File.Create(sFullFileName);

El .Create método anterior no estaba cerrando el archivo

Ahora uso: System.IO.File.WriteAllText(sFullFileName, "Uploading");

Este método crea y cierra el archivo (nota: Me puso una cadena "Uploading" en el archivo, pero estoy seguro de que string.Empty también funcionará.

80

Prueba esto:

System.IO.File.Create(FullFName).Close(); 
+1

Esto es perfecto para cuando solo quiere crear un archivo en blanco. – TTT

+1

¡Eso es tan cierto! "No estoy escribiendo con un escritor de secuencias, simplemente creándolo". –

+0

Esto era lo que estaba buscando también. Funciona con encanto con un archivo en blanco. Gracias. –