После нескольких испытаний мне, наконец, удалось понять, что происходит.
Без клонирования изображения оно было бы удалено и дескриптор файла был освобожден, но его стало бы невозможно отобразить, потому что ImageListпотерял первоначальный источник.
Согласно комментариям Джими, я мог использовать Image.Clone()
в своем блоке использования, и это работало, даже если я хочу удалить изображение из своего кода.Исходное изображение будет удалено, но клонированное не будет.
Но тогда я не смог удалить изображение из Windows Explorer, сказав, что этот процесс уже используется другим процессом.
Image.Clone()
, очевидно, сохраняет дескриптор исходного файла и не сохраняет его внутри.
Поэтому я использовал MemoryStream
для копирования содержимого файла изображения, и мое изображение имеет дескриптор на MemoryStream
.Теперь я могу удалять изображения по своему усмотрению, и еще проще написать:
private void LoadImages()
{
lv_Images.LargeImageList = new ImageList();
lv_Images.LargeImageList.ImageSize = new Size(64, 64);
DirectoryInfo di = new DirectoryInfo(initialDirectory);
foreach (FileInfo file in di.EnumerateFiles())
{
if (isImage(file)) //Simply checks the file extension
{
//File.ReadAllBytes will release the handle when the byte array is constructed.
lv_Images.LargeImageList.Images.Add(file.Name, Image.FromStream(new MemoryStream(File.ReadAllBytes(file.FullName))));
int index = lv_Images.LargeImageList.Images.IndexOfKey(file.Name);
lv_Images.Items.Add(file.Name, file.Name, index);
}
}
}
Спасибо за ваши советы в любом случае.