используется другим процессом (после file.openread (), но затем .Close ()) - PullRequest
0 голосов
/ 05 марта 2011

прежде всего - не смотрите на код и говорите, что он слишком длинный это выглядит только так.

Я пишу программу, которая будет выполнять поиск на моем компьютере и удалять файлы, основываясь на их значении MD5 (и чтобы ускорить процесс, я не хочу искать все файлы, только те, которые имеют определенные имена файлов).

Я отправляю FileInfo в метод с именем ConditionallyDeleteNotWantedFile, затем он берет имя этого файла и пытается найти его в словаре - получить 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 Ответ

3 голосов
/ 05 марта 2011

Я не знаю, является ли это ключом, но вы дважды открываете поток в 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;
}
...