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

我试图检测一个文件是否在运行时存在,如果不存在,就创建它。然而,当我尝试写入它时,我得到了这个错误:

该进程无法访问文件“ 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
}

有什么办法吗?

198507 次浏览

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

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

使用注释中的代码。您创建的文件(流)必须关闭。档案。创建将文件流返回到刚刚创建的文件:

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
}

File.Create方法创建文件并在文件上打开一个 FileStream。你的档案已经打开了。你不需要那份文件。创建方法:

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

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

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

可以使用 using 自动关闭文件。

我用代码片段更新了你的问题。在适当缩进之后,问题立即显现出来: 您使用的是 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
}

它使用 这个 StreamWriter构造函数

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

我想更新一下这个答案,说明这并不是写所有文本的最有效方法。只有在您需要一些快速和肮脏的代码时,才应该使用此代码。

当我回答这个问题的时候,我还是一个年轻的程序员,当时我觉得自己是某种天才,能想出这样的答案。

这个问题已经得到了回答,但是这里有一个现实世界的解决方案 检查目录是否存在,并在文本文件的末尾添加一个数字 我使用它在我编写的 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();
}
}

尝试这样做: 它在任何情况下都可以工作,如果文件不存在,它将创建它,然后写入它。如果已经存在,它将打开并写入:

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

我知道这是一个老问题,但我只是想抛出这一点,你仍然可以使用 File.Create("filename")",只需添加 .Dispose()到它。

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

这样,它创建并关闭文件,以便下一个进程使用它。

我想我知道这个异常的原因。您可能在多个线程中运行这个代码片段。

您可以使用文件周围的关键字。创建(路径)来完成该过程 using(File.Create(path));