FileStream 一直说文件忙,而根本没有被任何应用程序打开

FileStream keeps saying that the file is busy while it's not opened by any application at all

我正在尝试创建一个程序,用 C# 将某种数据写入文件。当我尝试 运行 代码时,控制台显示文件正忙,即使我根本没有打开它。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace databaseProject
{
    public class Program
    {
        static void Main(string[] args)
        {
            Functions F = new Functions();

            string studentID;
            string studentName;
            string subjectA;
            string subjectB;


            Console.WriteLine("Please enter the student's ID.");
            studentID = Console.ReadLine();

            Console.WriteLine("Please enter the student's name.");
            studentName = Console.ReadLine();

            Console.WriteLine("Please enter the student's score for subject A");
            subjectA = Console.ReadLine();

            Console.WriteLine("Please enter the student's score for subject B");
            subjectB = Console.ReadLine();

            Functions.saveFile(studentID, studentName, subjectA, subjectB);
        }
    }

    public class Functions
    {


        public static void saveFile(string studentID, string studentName, string subjectA, string subjectB)
        {
            FileStream stream = new FileStream("DATA.txt", FileMode.Create, FileAccess.Write);
            StreamWriter writer = new StreamWriter(stream);

            Console.WriteLine(studentID);
            Console.WriteLine(studentName);
            Console.WriteLine(subjectA);
            Console.WriteLine(subjectB);

            File.AppendAllText("DATA.txt", studentID + Environment.NewLine);
            File.AppendAllText("DATA.txt", studentName + Environment.NewLine);
            File.AppendAllText("DATA.txt", subjectA + Environment.NewLine);
            File.AppendAllText("DATA.txt", subjectB + Environment.NewLine);

            writer.Close();
            stream.Close();
        }
    }
}

控制台会改为这样写

Unhandled exception. System.IO.IOException: The process cannot access the file 'C:\Users\User\Documents\codes\C#\databaseProjectCSlash\databaseProjectCSlash\bin\Debug\net6.0\DATA.txt' because it is being used by another process.
   at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
   at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize)
   at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize)
   at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize)
   at System.IO.Strategies.FileStreamHelpers.ChooseStrategy(FileStream fileStream, String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, Int64 preallocationSize)
   at System.IO.StreamWriter.ValidateArgsAndOpenPath(String path, Boolean append, Encoding encoding, Int32 bufferSize)
   at System.IO.File.AppendAllText(String path, String contents)
   at databaseProject.Functions.saveFile(String studentID, String studentName, String subjectA, String subjectB) in C:\Users\User\Documents\codes\C#\databaseProjectCSlash\databaseProjectCSlash\Program.cs:line 52
   at databaseProject.Program.Main(String[] args) in C:\Users\User\Documents\codes\C#\databaseProjectCSlash\databaseProjectCSlash\Program.cs:line 34

发送该消息后,文件中的所有数据都将被清除。

谢谢你的帮助,我真的很感激。

您的进程与自身冲突

您在此处打开它(顺便说一下,使用 File.CreateText 会更简单)- 但从未真正使用您创建的编写器:

FileStream stream = new FileStream("DATA.txt", FileMode.Create, FileAccess.Write);
StreamWriter writer = new StreamWriter(stream);

...那么你 单独 试图在此处附加它,即使 stream 已经打开:

File.AppendAllText("DATA.txt", studentID + Environment.NewLine);

选择一种写入文件的方式,并坚持使用。就个人而言,我建议为您要编写的所有行创建一个 List<string> 或一个数组,然后只调用 File.WriteAllLines 一次,但您 可以 继续使用作者方法或 File.AppendAllText 方法...只是不要像这样在一起。

下面是您的 saveFile 方法的一个更简单的实现(重命名以遵循正常的命名约定):

public static void SaveFile(string studentId, string studentName, string subjectA, string subjectB)
{
    var lines = new[] { studentId, studentName, subjectA, subjectB };
    // (Write the lines to the console here if you want.)
    File.WriteAllLines("DATA.txt", lines);
}

如果您想附加数据而不是重新创建文件,只需使用 File.AppendAllLines 即可。