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