我已经创建了一个循环和删除给定目录中两个相似图像的函数。 (甚至多个目录):
public void DeleteDoubles()
{
SHA512CryptoServiceProvider sha1 = new SHA512CryptoServiceProvider();
string[] images = Directory.GetFiles(@"C:\" + "Gifs");
string[] sha1codes = new string[images.Length];
GifImages[] Gifs = new GifImages[images.Length];
for (int i = 0; i < images.Length; i++)
{
sha1.ComputeHash(GifImages.ImageToByteArray(Image.FromFile(images[i])));
sha1codes[i] = Convert.ToBase64String(sha1.Hash);
Gifs[i] = new GifImages(images[i], sha1codes[i]);
}
ArrayList distinctsha1codes = new ArrayList();
foreach (string sha1code in sha1codes)
if (!distinctsha1codes.Contains(sha1code))
distinctsha1codes.Add(sha1code);
for (int i = 0; i < distinctsha1codes.Count; i++)
if (distinctsha1codes.Contains(Gifs[i].Sha1Code))
{
for (int j = 0; j < distinctsha1codes.Count; j++)
if (distinctsha1codes[j] != null && distinctsha1codes[j].ToString() == Gifs[i].Sha1Code)
{
distinctsha1codes[j] = Gifs[i] = null;
break;
}
}
try
{
for (int i = 0; i < Gifs.Length; i++)
if (Gifs[i] != null)
File.Delete(Gifs[i].Location);
}
catch (IOException)
{
}
}
问题是,在我离开了我要删除的文件列表后,我无法删除它们,因为我得到“另一个进程正在使用System.IO.IOException文件......”
我尝试使用procexp查看哪些进程正在使用我的文件,而MyApplication.vshost.exe似乎正在使用这些文件。它开始使用该行上的文件:
sha1.ComputeHash(GifImages.ImageToByteArray(Image.FromFile(图像[1])));
含义Image.FromFile(images [i])打开文件但从不关闭它。
答案 0 :(得分:3)
documentation告诉你:
文件保持锁定状态,直到图像被丢弃。
因此,您需要在尝试删除图像之前处置该图像。只需在最短的时间内保持它,如下:
for (int i = 0; i < images.Length; i++)
{
using( var img = Image.FromFile( images[i] ) )
{
sha1.ComputeHash(imageToByteArray(img));
}
sha1codes[i] = Convert.ToBase64String(sha1.Hash);
Gifs[i] = new GifImages(images[i], sha1codes[i]);
}