59 votos

Archivo siendo usado por otro proceso después de usar File.Create()

Intento detectar si un archivo existe en tiempo de ejecución, si no, crearlo. Sin embargo, estoy recibiendo este error cuando intento escribir en él:

El proceso no puede acceder al archivo 'myfile.ext' porque está siendo utilizado por otro proceso.

string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre); 
if (!File.Exists(filePath)) 
{ 
    File.Create(filePath); 
} 

using (StreamWriter sw = File.AppendText(filePath)) 
{ 
    //write my text 
}

¿Alguna idea de cómo arreglarlo?

62voto

Chris Dunaway Puntos 3880

El File.Create crea el archivo y abre una FileStream en el archivo. Así que tu archivo ya está abierto. Realmente no necesitas el archivo. Crea el método en absoluto:

string filePath = @"c:\somefilename.txt";
using (StreamWriter sw = new StreamWriter(filePath, true))
{
    //write to the file
}

El booleano en el StreamWriter constructor hará que el contenido se adjunte si el archivo existe.

55voto

if(!File.Exists(FilePath)){
    File.Create(FilePath).Close();}
    File.WriteAllText(FileText);

17voto

Ralf de Kleine Puntos 5476

Cuando se crea un archivo de texto se puede utilizar el siguiente código:

System.IO.File.WriteAllText("c:\test.txt", "all of your content here");

Usando el código de tu comentario. El archivo(s) que ha creado debe ser cerrado. Archivo.Crear devolver el flujo de archivos al archivo recién creado.:

string filePath = "filepath here";
if (!System.IO.File.Exists(filePath))
{
    System.IO.FileStream f = System.IO.File.Create(filePath);
    f.Close();
}
using (System.IO.StreamWriter sw = System.IO.File.AppendText(filePath))
{ 
    //write my text 
}

8voto

kimtiede Puntos 127

File.Create devuelve un FileStream. Necesitas cerrarlo cuando hayas escrito en el archivo:

using (FileStream fs = File.Create(path, 1024)) 
        {
            Byte[] info = new UTF8Encoding(true).GetBytes("This is some text in the file.");
            // Add some information to the file.
            fs.Write(info, 0, info.Length);
        }

Puedes usar para cerrar el archivo automáticamente.

7voto

Hans Passant Puntos 475940

Actualizé tu pregunta con el fragmento de código. Después de una correcta sangría, queda inmediatamente claro cuál es el problema: usas File.Create() pero no cierras el FileStream que devuelve.

Hacerlo así es innecesario, StreamWriter ya permite agregar a un archivo existente y creando un nuevo archivo si aún no existe. Como este:

  string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre); 
  using (StreamWriter sw = new StreamWriter(filePath, true)) {
    //write my text 
  }

Que utiliza este constructor de StreamWriter .

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X