2012-08-08 16 views
8

Una aplicación necesita crear un archivo en un directorio, hacer algo en el directorio y luego eliminar el archivo. Por ejemplo, el código fuente a continuación:Crear y eliminar las causas de archivo IOException

File.Create("textfile.txt"); 
// Do something here 
File.Delete("textfile.txt"); 

Si "algo" es un proceso que sólo necesita un lapso muy corto de tiempo, File.Delete tirará IOException (archivo está siendo utilizado por otro proceso). De acuerdo con otra publicación de SO: Cannot delete directory with Directory.Delete(path, true), llamar a Thread.Sleep (0) debería permitir que termine el proceso anterior. Sin embargo, incluso con

File.Create("textfile.txt"); 
// Do something here 
Thread.Sleep(0); 
File.Delete("textfile.txt"); 

, se sigue lanzando la misma excepción IOException.

La solución que obtuve es un ciclo while que intenta eliminar el archivo repetidamente hasta que se elimina. Pero me pregunto si hay una mejor solución.

+1

Gracias por las respuestas rápidas (y señalando que está en MSDN. En este momento no me siento muy brillante). Voy a ir con @usr porque él es el primero. Pero acepte el +1 como mi agradecimiento. – Jim

Respuesta

16

File.Create le devuelve un FileStream que representa un identificador abierto para ese archivo. Envuelva el resultado de esa llamada en un bloque de uso para cerrar el identificador deterministically.

21

El método File.Create creará un flujo de archivos, que tendrá que deshacerse correctamente. Sugiero el siguiente código:

using(FileStream fs = File.Create("textfile.txt")) 
{ 
    // Do something here. 
} 
File.Delete("textfile.txt"); 

Tenga en cuenta que este código es exactamente como se sugiere en la documentación de MSDN ...

3

File.Create devuelve un FileStream que es un identificador abierto a ese archivo. Use este lugar:

using(FileStream fs = File.Create("textfile.txt")) 
{} 

File.Delete("textfile.txt"); 
4

También tenga en cuenta: Si no desea escribir nada en el archivo, se puede evitar el "uso" de dos maneras:

(1) File.WriteAllText("textfile.txt", string.Empty); 
(2) File.Create("textfile.txt").Dispose(); 

En el caso (2) es seguro evitar el uso porque no está haciendo nada que pueda arrojar una excepción entre crearlo y eliminarlo.

Cuestiones relacionadas