لا يمكن للعملية الوصول إلى الملف لأنه يتم استخدامه بواسطة عملية أخرى

StackOverflow https://stackoverflow.com/questions/4010025

سؤال

أقوم بإضافة صور إلى عنصر تحكم FlowLayoutPanel عبر الكود التالي

Dim WithEvents Pedit As DevExpress.XtraEditors.PictureEdit

Private Sub LoadImagesCommon(ByVal fi As FileInfo)
        Pedit = New DevExpress.XtraEditors.PictureEdit
        Pedit.Width = 133
        Pedit.Height = 98
        Pedit.Image = Image.FromFile(fi.FullName)
        Pedit.Properties.SizeMode = DevExpress.XtraEditors.Controls.PictureSizeMode.Zoom
        Pedit.ToolTip = fi.Name
        AddHandler Pedit.MouseClick, AddressOf Pedit_MouseClick
        AddHandler Pedit.MouseEnter, AddressOf Pedit_MouseEnter
        AddHandler Pedit.MouseLeave, AddressOf Pedit_MouseLeave
        FlowLayoutPanel1.Controls.Add(Pedit)
    End Sub

المشكلة هي أنني أحصل على الخطأ التالي The process cannot access the file xxxx because it is being used by another process. عندما أحاول حذف الصور التي قمت بتحميلها في الخطوة السابقة.

                    FlowLayoutPanel1.Controls.Clear()
                    FlowLayoutPanel1.Refresh()
                    For Each fi As FileInfo In New DirectoryInfo(My.Settings.TempDirectory).GetFiles
                        RemoveHandler Pedit.MouseClick, AddressOf Pedit_MouseClick
                        RemoveHandler Pedit.MouseEnter, AddressOf Pedit_MouseEnter
                        RemoveHandler Pedit.MouseLeave, AddressOf Pedit_MouseLeave
                        File.Delete(fi.FullName)
                    Next

إذن ما الخطأ الذي أفعله هنا؟

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

المحلول

Image.FromFile في الواقع يغلق الملف الذي يتم تحميله وتصدر القفل فقط بمجرد التخلص منه.

الحل هو رسم الصورة إلى سياق رسومات صورة أخرى (وبالتالي نسخها بفعالية) والتخلص من الصورة الأصلية.

نصائح أخرى

آها! شكرا لك كونراد.

بعد بعض القراءة ، وجدت حلًا آخر أيضًا.

Dim fs As System.IO.FileStream
fs = New System.IO.FileStream(fi.FullName, IO.FileMode.Open, IO.FileAccess.Read)
Pedit.Image = System.Drawing.Image.FromStream(fs)
fs.Close() 

تحديث:وهنا ما اقترحه كونراد. لجميع المبتدئين هناك ، مثلي تمامًا :)

 Dim imgTemp As System.Drawing.Image  
 imgTemp = System.Drawing.Image.FromFile(strFilename, True)  
 Pedit.Image = New System.Drawing.Bitmap(imgTemp)  
 imgTemp.Dispose()  
 Pedit.Image.Save(strFilename)

وهو أفضل لأن كائن الصورة لا يمكن أن يكون له طريقة حفظها تسمى بعد إغلاق filestream.

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

pictuboxname.حمل(اسم ملف الصورة مع المسار الكامل)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top