【问题标题】:Can't use program because file is already in use [duplicate]无法使用程序,因为文件已在使用中[重复]
【发布时间】:2018-07-24 12:40:10
【问题描述】:

我试图在没有创建 Data.txt 的情况下运行我的程序,但每次我这样做时都会显示错误:“进程无法访问文件‘路径’,因为它正被另一个进程使用。”

这里是代码有错误的区域,要清楚的是,它在“StreamWriter Data = new StreamWriter("Data.txt")'的行上

dataCheck = @"Data.txt";
dataExists = File.Exists(dataCheck);

if (dataExists)
{
    StreamReader Data = new StreamReader(@"Data.txt");

    for (i = 0; i < 5; i++)
    {
        //takes lines from text file and stores them in an array
        activities[i] = Data.ReadLine();
    }

    for (i = 0; i < 5; i++)
    {
        try { activityTimes[i] = Int32.Parse(Data.ReadLine()); }
        catch {

            StreamWriter DataWrite = new StreamWriter("Data.txt");

            DataWrite.Write(activities[0] + "\r\n");
            DataWrite.Write(activities[1] + "\r\n");
            DataWrite.Write(activities[2] + "\r\n");
            DataWrite.Write(activities[3] + "\r\n");
            DataWrite.Write(activities[4] + "\r\n");

            DataWrite.Write(activityTimes[0] + "\r\n");
            DataWrite.Write(activityTimes[1] + "\r\n");
            DataWrite.Write(activityTimes[2] + "\r\n");
            DataWrite.Write(activityTimes[3] + "\r\n");
            DataWrite.Write(activityTimes[4] + "\r\n");

            DataWrite.Close();
    }

    }
}
else
{ 
    //creates data file with activities and times
    File.Create(dataCheck);
    StreamWriter DataWrite = new StreamWriter("Data.txt");


    DataWrite.Write(activities[0] + "\r\n");
    DataWrite.Write(activities[1] + "\r\n");
    DataWrite.Write(activities[2] + "\r\n");
    DataWrite.Write(activities[3] + "\r\n");
    DataWrite.Write(activities[4] + "\r\n");

    DataWrite.Write(activityTimes[0] + "\r\n");
    DataWrite.Write(activityTimes[1] + "\r\n");
    DataWrite.Write(activityTimes[2] + "\r\n");
    DataWrite.Write(activityTimes[3] + "\r\n");
    DataWrite.Write(activityTimes[4] + "\r\n");

    DataWrite.Close();
            }

如果有人能解释错误/为我提供解决方案,我将不胜感激!

【问题讨论】:

  • Data 和 DataWrite 指向同一个文件。我怀疑你想在尝试写入文件之前Data.Close()。
  • superuser.com/questions/117902/… 也可能感兴趣。
  • 如果你的意思是在 for 循环中的活动 [i] 行之后使用 Data.Close(),它仍然给我同样的错误信息。
  • 有没有办法检查哪个进程正在使用该文件?我真的需要解决这个问题,但我被困住了。
  • 您可以使用 StreamReader.BaseStream 来检查您的流阅读器对象正在使用什么资源。但我认为如果你在第一个 for 循环之后使用 data.close() 并且文件不是处于只读模式,那么应该不会有任何错误。

标签: c# winforms


【解决方案1】:

您在文件不存在的情况下遇到的问题是您调用File.Create,它会创建文件并在其上打开一个流。这会阻止您在同一文件上使用 StreamWriter。删除 File.Create,因为它不是必需的:StreamWriter 将创建文件。

其他一些提示:StreamReader 和 StreamWriter 都是 IDisposable,所以每个都应该在 using 块中。作为奖励,这避免了您需要调用Close,这是由隐式Dispose 完成的。您应该将这些using 块视为文件打开的时间段,因此由于它们正在访问文件,因此它们不需要重叠。

考虑使用DataWrite.WriteLine(activities[0]);,而不是DataWrite.Write(activities[0] + "\r\n");。

您已经声明了一个变量来保存文件名,因此请使用该变量,而不是在多个位置复制文件名。

有两个相同的大代码块创建文件。将其重构为一个方法,并从两个地方调用该方法。

【讨论】:

    【解决方案2】:

    您正在尝试创建一个StreamReader,然后通过指定文件名来创建一个指向同一个文件的StreamWriter(并且在打开第二个之前不关闭第一个)。你不能那样做。例如,此代码将给出相同的结果:

    public static void Main()
    {
        StreamWriter sw = new StreamWriter("data.txt");
        StreamReader sr = new StreamReader("data.txt"); //: 'The process cannot access the 
                                                        // file 'data.txt' because it is being used 
                                                        // by another process.'
    
    }
    

    相反,您可以创建一个FileStream,然后从那个FileStream 创建一个StreamWriter 和StreamReader。见下文:

    public static void Main()
    {
        using (var fs = new FileStream("data.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            using (var sw = new StreamWriter(fs, Encoding.ASCII, 1024, true))
            using (var sr = new StreamReader(fs, Encoding.ASCII, false, 1024, true))
            {
                sw.WriteLine("Hi");
                sw.Flush();           //Make sure everything is fully written to the file.
                fs.Position = 0;      //Go back to the beginning of the file, so we can read it.
                Console.WriteLine(sr.ReadLine()); //Hi
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多