سؤال

في ListView أعرض الصور المصغرة للصور الصغيرة في مجلد معين. أقوم بإعداد ListView على النحو التالي:

var imageList = new ImageList();
foreach (var fileInfo in dir.GetFiles())
{
    try
    {
        var image = Image.FromFile(fileInfo.FullName);
        imageList.Images.Add(image);
    }
    catch
    {
        Console.WriteLine("error");
    }
}

listView.View = View.LargeIcon;
imageList.ImageSize = new Size(64, 64);
listView.LargeImageList = imageList;

for (int j = 0; j < imageList.Images.Count; j++)
{
    var item = new ListViewItem {ImageIndex = j, Text = "blabla"};
    listView.Items.Add(item);
}

يمكن للمستخدم الانتعاش الصحيح على صورة في ListView لإزالتها. أقوم بإزالته من ListView ثم أريد حذف هذه الصورة من المجلد. الآن أحصل على خطأ في استخدام الملف. بالطبع هذا منطقي لأن The Imagelist يستخدم الملف.

حاولت أولاً إزالة الصورة من The ImageList ، لكني أستمر في الحصول على قفل الملف.

هل يمكن لأحد أن يخبرني بما أفعله خطأ؟

شكرًا!

هل كانت مفيدة؟

المحلول

تحتاج إلى تحميل الملف في MemoryStream ، مثل هذا:

var image = Image.FromStream(new MemoryStream(File.ReadAllBytes(fileInfo.FullName)));

وبهذه الطريقة ، سيتم قراءة الملف مرة واحدة فقط ، ولن يظل مغلقًا.

تعديل

أنت تقوم بتحميل الصور في تصوير.
نظرًا لأن The Imagelist يصنع نسخًا من صوره ، يجب عليك ببساطة التخلص من النسخ الأصلية على الفور ، مثل هذا:

using (var image = Image.FromFile(fileInfo.FullName))
    imageList.Images.Add(image);

نصائح أخرى

ستحتاج الصورة إلى التخلص منها قبل إلغاء قفل الملف. حاول الاتصال Dispose على كائن الصورة بعد إزالته من قائمة الصور.

طالما أن لديك إشارة إلى كائن الصورة ولم يجمعها GC ، فسيحتفظ بالقفل. الدعوة Dispose يجب إجباره على التخلي عن مقبضه ويتسبب في فتح الملف.

عليك أيضًا التأكد من أن التطبيق لم يفعل CopyHandle أو احصل على إشارة ثانية إلى مورد الصورة قبل القيام بذلك.

يستخدم GetThumbnailImage ثم التخلص من الصورة:

var image = Image.FromFile(fileN);

Image imgThumb = image.GetThumbnailImage(100, 100, null, new IntPtr());

imageList1.Images.Add(imgThumb);

image.Dispose();

listView1.LargeImageList = imageList1;

الآن يمكنك حذف الملف:

File.Delete(FileN);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top