2011-03-01 21 views
54

puedo comprobar para ver si existe un archivo conCierre de un archivo después de File.Create

if(!File.Exists(myPath)) 
{ 
    File.Create(myPath); 
} 

Sin embargo, cuando voy a crear un StreamReader con este nuevo archivo, me sale un error diciendo que

El proceso no puede acceder al archivo '[mi ruta de archivo aquí]' porque está siendo utilizado por otro proceso.

No hay una File.Close(myPath) que puedo llamar de modo que se cierra después de haber sido creado, así que ¿cómo puedo liberar este recurso para que pueda abrirlo más adelante en mi programa?

Respuesta

116

File.Create(string) devuelve una instancia del FileStream class. Usted puede llamar al método Stream.Close() en este objeto con el fin de cerrarlo y liberar recursos que está utilizando:

var myFile = File.Create(myPath); 
myFile.Close(); 

Sin embargo, desde FileStream implementa IDisposable, se puede aprovechar el using statement (generalmente la forma preferida de manejar una situación como esta). Esto asegurará que la corriente está cerrado y eliminado adecuadamente cuando haya terminado con él:

using (var myFile = File.Create(myPath)) 
{ 
    // interact with myFile here, it will be disposed automatically 
} 
4

File.Create devuelve un objeto FileStream que puede llamar en Close().

33

La función devuelve un objeto FileStream. Lo que podría utilizar su valor de retorno para abrir o cerrar su StreamWriter usando el método apropiado del objeto:

File.Create(myPath).Close(); 
+0

Y lo que sucederá, si su camino es equivocado y crea un error, nunca se cerrar el archivo. y luego tuviste problemas, o estoy equivocado ?. –

+0

@JuanRuizdeCastilla si su ruta es incorrecta, no se creará ningún archivo y no se abrirá ninguna secuencia. – LINQ

2

La razón se debe a un FileStream se devuelve desde el método para crear un archivo. Debería devolver FileStream a una variable o llamar directamente al método de cierre después de File.Create.

Es una buena práctica dejar que el bloque de uso lo ayude a implementar el patrón de ID de destino para una tarea como esta. Tal vez lo que podría funcionar mejor sería:

if(!File.Exists(myPath)){ 
    using(FileStream fs = File.Create(myPath)) 
    using(StreamWriter writer = new StreamWriter(fs)){ 
     // do your work here 
    } 
} 
2
File.WriteAllText(file,content) 

crear escritura cerca

File.WriteAllBytes-- type binary 

:)

+0

Solución excelente y de moda mi amigo. Saca mis 5 líneas de código por una ... gracias –

Cuestiones relacionadas