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

时间:2010-05-06 13:15:50

标签: c# file-io

我正在尝试检测运行时是否存在文件,如果没有,请创建它。但是,当我尝试写入时,我收到此错误:

  

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

关于如何修复它的任何想法?

10 个答案:

答案 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 
  }

使用this StreamWriter constructor

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