在使用File.Create()后,另一个进程正在使用的文件

我试图检测一个文件是否存在运行时,如果没有,创build它。 不过,当我尝试写入该错误时,出现此错误:

该进程无法访问文件“myfile.ext”,因为正在被另一个进程使用。

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 } 

任何想法如何解决它?

File.Create方法创build文件并在文件上打开一个FileStream 。 所以你的文件已经打开了。 你根本不需要这个文件。创build方法:

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

如果文件存在,则StreamWriter构造函数中的布尔值将导致内容被追加。

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

创build文本文件时,可以使用以下代码:

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

使用您的评论中的代码。 您创build的文件(stream)必须closures。 File.Create返回文件stream到刚刚创build的文件:

 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返回一个FileStream。 当您写入文件时,您需要closures该文件:

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

您可以使用自动closures文件。

我用代码片段更新了你的问题。 在正确的缩进之后,马上清楚问题是什么:使用File.Create()但不closures它返回的FileStream

这样做是不必要的, StreamWriter已经允许追加到现有的文件, 创build一个新的文件,如果它还不存在。 喜欢这个:

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

它使用这个StreamWriter构造函数 。

这个问题已经被回答了,但是这里是一个真实世界的解决scheme,它检查目录是否存在,如果文本文件存在,就在最后添加一个数字。 我用这个在我写的Windows服务上创build日志文件。 我希望这可以帮助别人。

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

试试这个:它在任何情况下工作,如果文件不存在,它会创build它,然后写入它。 如果已经存在,没有问题,它会打开并写入:

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