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