首先 - 不要看代码并说它太长了 它看起来就是这样。
我正在编写一个程序,它将搜索我的计算机并根据其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;
}
}
答案 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;
}