لا يمكن للعملية الوصول إلى الملف لأنه يتم استخدامه بواسطة عملية أخرى
-
25-09-2019 - |
سؤال
أقوم بإضافة صور إلى عنصر تحكم 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.حمل(اسم ملف الصورة مع المسار الكامل)