我正在尝试检测运行时是否存在文件,如果没有,请创建它。但是,当我尝试写入时,我收到此错误:
该进程无法访问文件'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
}
关于如何修复它的任何想法?
答案 0 :(得分:130)
File.Create(FilePath).Close();
File.WriteAllText(FileText);
我想更新这个答案,说这不是写入所有文本的最有效方法。 如果您需要快速而肮脏的东西,则应该只使用此代码。
当我回答这个问题时,我是一个年轻的程序员,当时我认为我是一个天才,想出这个答案。
答案 1 :(得分:104)
File.Create
方法创建文件并在文件上打开FileStream
。所以你的文件已经打开了。你根本不需要file.Create方法:
string filePath = @"c:\somefilename.txt";
using (StreamWriter sw = new StreamWriter(filePath, true))
{
//write to the file
}
如果文件存在,StreamWriter
构造函数中的布尔值将导致附加内容。
答案 2 :(得分:24)
创建文本文件时,您可以使用以下代码:
System.IO.File.WriteAllText("c:\test.txt", "all of your content here");
使用评论中的代码。必须关闭您创建的文件(流)。 File.Create将文件流返回到刚创建的文件。:
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
}
答案 3 :(得分:16)
FileStream fs= File.Create(ConfigurationManager.AppSettings["file"]);
fs.Close();
答案 4 :(得分:9)
File.Create返回一个FileStream。您需要在写入文件时关闭它:
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);
}
您可以使用use来自动关闭文件。
答案 5 :(得分:8)
我使用代码段更新了您的问题。在适当缩进后,立即清楚问题是什么:您使用File.Create()
但不要关闭它返回的FileStream
。
这样做是不必要的,StreamWriter
已经允许附加到现有文件和创建新文件(如果它尚不存在)。像这样:
string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre);
using (StreamWriter sw = new StreamWriter(filePath, true)) {
//write my text
}
答案 6 :(得分:1)
这个问题已经得到解答,但这是一个现实世界的解决方案 检查目录是否存在,并在文本文件的末尾添加一个数字 存在。我使用它来创建我写的Windows服务上的每日日志文件。一世 希望这有助于某人。
// 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();
}
}
答案 7 :(得分:1)
我知道这是一个老问题,但我只是想把它扔出去,你仍然可以使用File.Create("filename")"
,只需添加.Dispose()
即可。
File.Create("filename").Dispose();
这样它就会创建并关闭文件,以便下一个进程使用它。
答案 8 :(得分:1)
我想我知道这种例外的原因。您可能正在多个线程中运行此代码段。
答案 9 :(得分:-1)
试试这个:它在任何情况下都有效,如果文件不存在,它会创建它然后写入它。如果已经存在,那么它就会打开并写入它没问题:
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();
}