Процесс не может получить доступ к файлу, потому что он используется другим процессом - PullRequest
3 голосов
/ 24 октября 2010

Я добавляю изображения в элемент управления 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

Так что я здесь не так делаю?

Ответы [ 3 ]

5 голосов
/ 25 октября 2010

Aha!Спасибо, Конрад.

после некоторого прочтения я тоже нашел другой обходной путь.

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)

, что лучше, поскольку объект Image не может вызывать свой метод Save после закрытия FileStream.

5 голосов
/ 24 октября 2010

Image.FromFile фактически блокирует загружаемый файл и снимает блокировку только после его удаления.

Решение состоит в том, чтобы нарисовать изображение в графическом контексте другого изображения (таким образом, эффективно копируяэто) и распоряжаться исходным изображением.

0 голосов
/ 25 декабря 2012

Я нашел, что это решение лучше всего разблокировать файл изображения после его загрузки в PictureBox:

PictureBoxName .LOAD ( имя файла изображения с полным путем )

...