程序因 IOException 而崩溃

Program crashing due to IOException

我是 C# 的新手,我正在尝试创建一个简单的程序,要求用户输入文件名和一些文本,然后将其保存到新创建的文件中。也许我走得太快了,没有学到我应该掌握的关于文件操作的一切。任何帮助将不胜感激。

Console.WriteLine("Enter name of file then add .txt");
var fileName = Console.ReadLine();

var folderPath = @"C:\Users\Treppy\Desktop\Megatest\";
var filePath = folderPath + fileName;
File.Create(filePath);


Console.WriteLine(filePath);

Console.WriteLine("Enter the text you want to save to that file");
var inputTextUser = Console.ReadLine();

File.AppendAllText(filePath, inputTextUser);

当应用程序在第 29 行崩溃时,我收到此消息:

System.IO.IOException the process cannot access the file because it is being used by another process.

第 29 行,即 AppendAllText 行。

像这样重写你的代码

Console.WriteLine("Enter name of file then add .txt");
            var fileName = Console.ReadLine();

            var folderPath =  @"C:\Users\Treppy\Desktop\Megatest\";
            var filePath = folderPath + fileName;


            Console.WriteLine(filePath);

            Console.WriteLine("Enter the text you want to save to that file");
            string[] lines = new string[1];
            var inputTextUser = Console.ReadLine();
            lines[0] = inputTextUser;

            //File.AppendAllText(filePath, inputTextUser);
            File.WriteAllLines(filePath, lines);

不用数组也可以写

File.WriteAllText(filePath, inputTextUser);

您需要 close/dispose 访问文件的前一个流,因为 File.Create 保持文件打开并且 returns 一个 FileStream 对象。

我检查了你的代码,这个解决方案有效。

File.Create(filePath).Close();

OR/AND

File.Create(filePath).Dispose();

问题是 File.Create 方法使文件保持打开状态,因此操作系统锁定了它。方法 returns 一个 FileStream 对象,可用于 read/write 访问。在您可以使用不同的方法(例如 File.WriteAllText - 此方法将尝试打开一个已打开的文件)写入该文件之前,必须首先释放 FileStream 对象。看到这个 MS reference.

只需注释掉该行代码即可修复 IOException

总的来说,File.Create不是很常用的方法,一般用在比较特殊的情况下。如果可能,首选方法是使用 stringStringBuilder 在内存中构建文本文件,然后将内容输出到文件。就您而言,这绝对是您想要采用的方法。正如其他人提到的,您将使用 File.WriteAllText。如果文件不存在,它将创建该文件,或者替换已存在文件的内容。如果您想保留以前的内容,请像您在问题中所做的那样使用 File.AppendAllText 。如果文件不存在,此方法将创建文件或将文本附加到先前内容的末尾。

这里的问题是您(您的应用程序)仍然"hold"那个文件。实际上,在向其写入内容之前,您不需要创建该文件。如前所述 here AppendAllText 将创建一个文件,如果它不存在,所以只需删除该行,其中 File.Create(filePath);

试试这个:

Console.WriteLine("Enter name of file then add .txt");
var fileName = Console.ReadLine();

var folderPath = @"C:\Users\Treppy\Desktop\Megatest\";

var filePath = System.IO.Path.Combine(folderPath, fileName);

if (!File.Exists(filePath))
{
    File.WriteAllText(filePath, "");
}

Console.WriteLine(filePath);

Console.WriteLine("Enter the text you want to save to that file");
var inputTextUser = Console.ReadLine();

File.AppendAllText(filePath, inputTextUser);

这将停止 File.Create 使用 OS 打开文件。