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

0 c# filestream

我正在尝试创建一个程序,将某种数据写入 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台会写这个

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
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 5

你的过程是自相矛盾

您在这里打开它(顺便说一下File.CreateText,以一种更简单的方式) - 但从未真正使用您创建的编写器:

FileStream stream = new FileStream("DATA.txt", FileMode.Create, FileAccess.Write);
StreamWriter writer = new StreamWriter(stream);
Run Code Online (Sandbox Code Playgroud)

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

File.AppendAllText("DATA.txt", studentID + Environment.NewLine);
Run Code Online (Sandbox Code Playgroud)

选择一种写入文件的方式,并坚持使用。就我个人而言,我建议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);
}
Run Code Online (Sandbox Code Playgroud)

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