写入文本文件时出现“正在使用文件”错误

时间:2013-10-28 17:37:50

标签: c# .net winforms file save

当我尝试创建文件然后写入文件时,我收到错误The process cannot access the file 'C:\Users\Ryan\Desktop\New folder\POSData.txt' because it is being used by another process.。什么进程正在使用该文件?我在创建文件后检查了file.close,但它不存在。我如何通过这个?谢谢!

继承我的代码:

MessageBox.Show("Please select a folder to save your database to.");
        this.folderBrowserDialog1.RootFolder = System.Environment.SpecialFolder.Desktop;
        DialogResult result = this.folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            databasePath = folderBrowserDialog1.SelectedPath;
            if (!File.Exists(databasePath + "\\POSData.txt"))
            {
                File.Create(databasePath + "\\POSData.txt");
            }

            using (StreamWriter w = new StreamWriter(databasePath + "\\POSData.txt", false))
            {
                w.WriteLine(stockCount);
            }
        }

编辑:仅在创建文件时发生。如果它已经存在,则不会发生错误。

5 个答案:

答案 0 :(得分:2)

实际上,甚至不用使用File.Create。您收到该错误的原因是File.Create正在该文本文件上打开一个流。

string filePath = "databasePath + "\\POSData.txt"";
using (StreamWriter sw = new StreamWriter(filePath, true))
{
    //write to the file
}

答案 1 :(得分:0)

File.Create返回可能需要关闭的FileStream对象。

  

此方法创建的FileStream对象具有默认的FileShare   无价值;没有其他进程或代码可以访问创建的文件   直到原始文件句柄关闭。

        using (FileStream fs = File.Create(databasePath + "\\POSData.txt"))
        {
             fs.Write(uniEncoding.GetBytes(stockCount), 0, uniEncoding.GetByteCount(stockCount));
        }

答案 2 :(得分:0)

您在致电File.Create时保持文件处于打开状态(即您永远不会关闭该文件)。

StreamWriter会为您创建文件(如果它不存在),所以我不打算自己检查。您可以删除检查其是否存在的代码,如果不存在则创建它。

if (result == DialogResult.OK)
{
    databasePath = folderBrowserDialog1.SelectedPath;

    using (StreamWriter w = new StreamWriter(databasePath + "\\POSData.txt", false))
    {
        w.WriteLine(stockCount);
    }
 }

请注意,如果该文件不存在,则忽略bool构造函数中的第二个StreamWriter参数。

答案 3 :(得分:0)

File.Create还会打开文件进行读/写。因此,当您使用File.Create时,您将离开一个打开的FileStream。

假设覆盖是可以的,那么你可能想要做这样的事情:

        using (var fs = File.Create(databasePath + "\\POSData.txt"))
        using (StreamWriter w = new StreamWriter(fs))
        {
            w.WriteLine(stockCount);
        }

给出File.Create:

  

创建或覆盖指定路径中的文件。

答案 4 :(得分:0)

我用了它,而且效果很好

`File.AppendAllText(fileName,"");`

这将创建一个新文件,不写入任何内容,然后为您关闭该文件。