Search code examples
c#filestream

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


I am trying to create a program that writes some kind of data to a file in C#. when I tried running the code, the console said that the file is busy even though I am not opening it at all.

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

the console will write this instead

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

after sending that message, the file would be wiped out of any data.

Thank you for your help, I really appreciate that.


Solution

  • Your process is conflicting with itself.

    You're opening it here (in a way that would be simpler with File.CreateText, by the way) - but never actually using the writer you've created:

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

    ... then you're separately trying to append to it here, even though stream is already open:

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

    Pick one way of writing to the file, and stick to it. Personally, I'd suggest creating a List<string> or an array for all the lines you want to write, and just call File.WriteAllLines once, but you could continue to use either the writer approach or the File.AppendAllText approach... just not together like this.

    Here's a simpler implementation of your saveFile method (renamed to follow normal naming conventions):

    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);
    }
    

    If you want to append data instead of recreating the file, just use File.AppendAllLines instead.