【问题标题】:Error: The process cannot access the file because it is being used by another process错误:该进程无法访问该文件,因为它正被另一个进程使用
【发布时间】:2012-01-25 07:07:23
【问题描述】:

我正在使用 ASP.NET 应用程序并读取管道分隔的文本文件。当我尝试重命名文件(通过使用“移动”功能)读取文件后,我收到错误消息:“该进程无法访问该文件,因为它正在被另一个进程使用。”。在重新启动 Windows 之前,我无法手动重命名或删除文件。 我的代码如下:

   FileStream fileStream = new FileStream(file, FileMode.Open);
               try
               {
                   readImport(file);
               }
               finally
               {
                   fileStream.Close();
               }
                 File.Move(file, Path.Combine(fullFolderPath, fullNewFileName));

处理文件的函数是:

 private void readImport(string fullFileName)
{
    try
    {
           TextFieldParser parser = new TextFieldParser(fullFileName);

            parser.Delimiters = new string[] { "|" };
            parser.TrimWhiteSpace = true;
            parser.ReadLine();

            while (!(parser.EndOfData == true))
            {
               // dt.Rows.Add(parser.ReadFields());
            }
   }
        }

【问题讨论】:

    标签: asp.net exception file-io


    【解决方案1】:

    Kevin 是正确的,File TextFieldParser 没有被正确处理会锁定文件,使得 file.move 抛出异常。在 VB 中:

        Dim TextParser As New FileIO.TextFieldParser("C:\Users\Smith\Desktop\example.txt")
        TextParser.textFieldType = FileIO.FieldType.Delimited
        TextParser.SetDelimiters(",")
    
        While Not TextParser.EndOfData
            'process input
            'x = TextParser.ReadFields()
        End While
    
        TextParser.Dispose()
    

    现在以下行将正常工作

    File.Move("C:\Users\Smith\Desktop\example.txt", "C:\Users\Smith\Desktop\Archive\example.txt")
    

    【讨论】:

      【解决方案2】:

      首先,您需要确保 fileStream 已被释放:

      using (FileStream fileStream = new FileStream(file, FileMode.Open))
      {
          readImport(file);
      }
      
      File.Move(file, Path.Combine(fullFolderPath, fullNewFileName));
      

      请参阅 MSDN regarding the using statement 代替 try/finally

      顺便说一句——fileStream 在这里做什么???没什么,好像。改用这个:

      readImport(file);
      File.Move(file, Path.Combine(fullFolderPath, fullNewFileName));
      

      你也应该处理TextFieldParser

      private void readImport(string fullFileName)
      {
          using (TextFieldParser parser = new TextFieldParser(fullFileName))
          {
              parser.Delimiters = new string[] { "|" };
              parser.TrimWhiteSpace = true;
              parser.ReadLine();
      
              while (!(parser.EndOfData == true))
              {
                  // dt.Rows.Add(parser.ReadFields());
              }
          }
      }
      

      【讨论】:

      • 凯文你是对的。 FileStream 不可用,并且正在使用 TextFiledParser 所需的块。谢谢。
      • @hotcoder 基本上,错误是告诉您文件未关闭。我一直在尝试更多地使用 using 语句来确保处置/最终确定。 :)
      猜你喜欢
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多