c# – 使用C1ZipFile后为什么不能删除此文件?

下面的代码给了我一个System.IO.IOException,消息’进程无法访问该文件’.

private void UnPackLegacyStats()
{
  DirectoryInfo oDirectory;
  XmlDocument oStatsXml;

  //Get the directory
  oDirectory = new DirectoryInfo(msLegacyStatZipsPath);

  //Check if the directory exists
  if (oDirectory.Exists)
  {
    //Loop files
    foreach (FileInfo oFile in oDirectory.GetFiles())
    {
      //Check if file is a zip file
      if (C1ZipFile.IsZipFile(oFile.FullName))
      {
        //Open the zip file
        using (C1ZipFile oZipFile = new C1ZipFile(oFile.FullName, false))
        {
          //Check if the zip contains the stats
          if (oZipFile.Entries.Contains("Stats.xml"))
          {
            //Get the stats as a stream
            using (Stream oStatsStream = oZipFile.Entries["Stats.xml"].OpenReader())
            {
              //Load the stats as xml
              oStatsXml = new XmlDocument();
              oStatsXml.Load(oStatsStream);

              //Close the stream
              oStatsStream.Close();
            }

            //Loop hit elements
            foreach (XmlElement oHitElement in oStatsXml.SelectNodes("/*/hits"))
            {
              //Do stuff
            }                
          }

          //Close the file
          oZipFile.Close();
        }
      }

      //Delete the file
      oFile.Delete();
    }
  }
}

我很难看到文件仍然可以锁定的位置.可以保留到文件句柄的所有对象都在使用块并显式关闭.

是否与使用FileInfo对象而不是静态GetFiles方法返回的字符串有关?

有任何想法吗?

最佳答案
我假设您在oFile.Delete调用上遇到错误.我能够重现这个错误.有趣的是,只有当文件不是zip文件时才会出现错误.这是你看到的行为吗?

看来,当它不是zip文件时,C1ZipFile.IsZipFile调用不会释放该文件.通过使用FileStream而不是将文件路径作为字符串传递(IsZipFile函数接受),我能够避免此问题.

因此,对您的代码进行以下修改似乎有效:

if (oDirectory.Exists)
{
    //Loop files
    foreach (FileInfo oFile in oDirectory.GetFiles())
    {
        using (FileStream oStream = new FileStream(oFile.FullName, FileMode.Open))
        {
            //Check if file is a zip file
            if (C1ZipFile.IsZipFile(oStream))
            {
            // ...
            }
        }
        //Delete the file
        oFile.Delete();
    }
}    

回答主题中的原始问题:我不知道是否可以在不尝试删除文件的情况下删除文件.您总是可以编写一个尝试删除文件的函数,如果不能,则捕获错误,然后返回一个指示删除是否成功的布尔值.

转载注明原文:c# – 使用C1ZipFile后为什么不能删除此文件? - 代码日志