File utilizzato da un altro processo dopo aver utilizzato File.Create ()

Sto cercando di rilevare se un file esiste in fase di runtime, in caso contrario, crearlo. Tuttavia sto ricevendo questo errore quando provo a scriverlo:

Il processo non può accedere al file “myfile.ext” perché è utilizzato da un altro processo.

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 } 

Qualche idea su come aggiustarlo?

Il metodo File.Create crea il file e apre un FileStream sul file. Quindi il tuo file è già aperto. Non hai proprio bisogno del metodo file.Create:

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

Il booleano nel costruttore StreamWriter farà sì che il contenuto venga aggiunto se il file esiste.

  File.Create(FilePath).Close(); File.WriteAllText(FileText); 

Quando crei un file di testo puoi usare il seguente codice:

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

Usando il codice dal tuo commento. Il file (stream) che hai creato deve essere chiuso. File.Create restituisce il filestream al file appena creato .:

 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 } 
 FileStream fs= File.Create(ConfigurationManager.AppSettings["file"]); fs.Close(); 

File.Create restituisce un FileStream. Devi chiuderlo quando hai scritto sul file:

 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); } 

È ansible utilizzare utilizzando per chiudere automaticamente il file.

Ho aggiornato la tua domanda con lo snippet di codice. Dopo il rientro appropriato, è immediatamente chiaro qual è il problema: si utilizza File.Create() ma non si chiude il FileStream restituito.

In questo modo non è necessario, StreamWriter consente già di aggiungere un file esistente e creare un nuovo file se non esiste ancora. Come questo:

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

Che utilizza questo costruttore StreamWriter .

Questa domanda ha già avuto risposta, ma qui è una soluzione reale che controlla se la directory esiste e aggiunge un numero alla fine se il file di testo esiste. Lo uso per creare file di registro giornalieri su un servizio Windows che ho scritto. Spero che questo aiuti qualcuno.

 // How to create a log file with a sortable date and add numbering to it if it already exists. public void CreateLogFile() { // filePath usually comes from the App.config file. I've written the value explicitly here for demo purposes. var filePath = "C:\\Logs"; // Append a backslash if one is not present at the end of the file path. if (!filePath.EndsWith("\\")) { filePath += "\\"; } // Create the path if it doesn't exist. if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } // Create the file name with a calendar sortable date on the end. var now = DateTime.Now; filePath += string.Format("Daily Log [{0}-{1}-{2}].txt", now.Year, now.Month, now.Day); // Check if the file that is about to be created already exists. If so, append a number to the end. if (File.Exists(filePath)) { var counter = 1; filePath = filePath.Replace(".txt", " (" + counter + ").txt"); while (File.Exists(filePath)) { filePath = filePath.Replace("(" + counter + ").txt", "(" + (counter + 1) + ").txt"); counter++; } } // Note that after the file is created, the file stream is still open. It needs to be closed // once it is created if other methods need to access it. using (var file = File.Create(filePath)) { file.Close(); } } 

So che questa è una vecchia domanda, ma voglio solo lanciarlo qui che puoi ancora usare File.Create("filename")" , aggiungi semplicemente .Dispose() .

File.Create("filename").Dispose();

In questo modo crea e chiude il file per il successivo processo per usarlo.

Infine, penso di conoscere la ragione di questa eccezione. Potresti eseguire questo snippet di codice in più thread.

Prova questo: funziona in ogni caso, se il file non esiste, lo creerà e poi scriverà su di esso. E se già esiste, nessun problema si aprirà e scriverà ad esso:

 using (FileStream fs= new FileStream(@"File.txt",FileMode.Create,FileAccess.ReadWrite)) { fs.close(); } using (StreamWriter sw = new StreamWriter(@"File.txt")) { sw.WriteLine("bla bla bla"); sw.Close(); }