被另一个进程使用(在file.openread()之后,然后是.Close())

时间:2011-03-04 21:18:34

标签: c# fileinfo

首先 - 不要看代码并说它太长了 它看起来就是这样。

我正在编写一个程序,它将搜索我的计算机并根据其MD5值删除文件(为了加快速度,我不想搜索所有文件,只是那些具有特定文件名的文件)。

我正在向一个名为ConditionalDeleteNotWantedFile的方法发送一个FileInfo,然后它将该文件的名称和trys在字典中找到它 - 检索该文件的MD5并计算当前的FileInfo MD5以查看它们是否相同。 如果是 - 删除文件。

问题是什么?当我尝试删除时抛出异常...即使没有其他进程使用它。当我尝试使用Windows资源管理器删除文件时,它说vshost(意思是:VS ...)

我错过了什么?

public static bool ConditionallyDeleteNotWantedFile(FileInfo fi)
{
  string dictMD5;
  if (NotWanted.TryGetValue(fi.Name, out dictMD5))
  {
    string temp = ComputeMD5Hash(fi.FullName);
    // temp will only be null if we couldn't open the file for 
    // read in the md5 calc operation. probably file is in use.
    if (temp == null) 
      return false; 
    if (temp == dictMD5)
    {
      try
      {
        fi.Delete();
      }
      catch { fi.Delete();   // this exception is raised with 
                             // "being used by another process"
      }
      return true;
    }
  }
  return false;
}

public static string ComputeMD5Hash(string fileName)
{
  return ComputeHash(fileName, new MD5CryptoServiceProvider());
}

public static string ComputeHash(string fileName, HashAlgorithm
    hashAlgorithm)
{
  try
  {
    FileStream stmcheck = File.OpenRead(fileName);
    try
    {
      stmcheck = File.OpenRead(fileName);
      byte[] hash = hashAlgorithm.ComputeHash(stmcheck);
      string computed = BitConverter.ToString(hash).Replace("-", "");
      stmcheck.Close();
      return computed;
    }
    finally
    {
      stmcheck.Close();
    }
  }
  catch
  {
    return null;
  }
}

1 个答案:

答案 0 :(得分:3)

我不知道这是否是关键,但你在ComputeHash中打开了两次流,并且有一条路径没有关闭它。我可以建议一下:

public static string ComputeHash(string fileName, HashAlgorithm hashAlgorithm)
{
    string hashFixed = null;
    try
    {
        using (FileStream stmcheck = File.OpenRead(fileName))
        {
            try
            {
                byte[] hash = hashAlgorithm.ComputeHash(stmcheck);
                hashFixed = BitConverter.ToString(hash).Replace("-", "");
            }
            catch
            {
                //logging as needed
            }
            finally
            {
                stmcheck.Close();
            }
        }
    }
    catch
    {
        //logging as needed
    }
    return hashFixed;
}