Tino Fourie Ответов: 2

Процесс не может получить доступ к файлу xxxxxx, поскольку он используется другим процессом


Я пишу приложение WinForm, используя VS2010 & VS2012 с. Net4.

В приложении я загружаю отдельные изображения в pictureboxes, а затем удаляю те изображения, которые пользователь не хочет сохранять.

Каждый раз, когда я пытаюсь удалить эти "нежелательные" изображения, я получаю приведенное выше сообщение об ошибке:
"Процесс не может получить доступ к файлу xxxxxx, потому что он используется другим процессом"

Следующее используется для загрузки изображения в динамически создаваемый picturebox вместе с кодом для удаления нежелательных изображений.

Вариант 1:
загруженное изображение:
picBox.Image = Image.FromFile(imgInfo.FullName).GetThumbnailImage(128, 128, Nothing, Nothing)

Удалить Изображение:
For Each imgFile As String In Directory.GetFiles(imgSharedFolder)
   File.Delete(imgFile)
Next imgFile


Вариант 2:
После загрузки файл изображения в элемент управления PictureBox будет "блокировка" файл изображения я пробовал следующие, прочитав файл изображения в FileStream и затем закройте FileStream после загрузки изображения в элемент управления PictureBox

Загрузка:
fs = New System.IO.FileStream(imgInfo.FullName, IO.FileMode.Open, IO.FileAccess.Read)
picBox.Image = System.Drawing.Image.FromStream(fs).GetThumbnailImage(128, 128, Nothing, Nothing)
fs.Close()

Удалить:
Dim picList As String() = Directory.GetFiles(imgSharedFolder, "*.jpg")
For Each f As String In picList
   File.Delete(f)
Next f

Я получаю то же самое сообщение об ошибке.

Вариант 3:
После еще нескольких поисков, чтения и попыток я наткнулся на это предложение создать объект изображения, а затем избавиться от объекта изображения, как только изображение будет загружено в picturebox:

Загрузка:
Dim newImage As Image
newImage = Image.FromFile(imgInfo.FullName).GetThumbnailImage(128, 128, Nothing, Nothing)
picBox.Image = newImage


К сожалению, я только что получил то же самое сообщение об ошибке.

Есть ли какое-то другое возможное решение этой проблемы, что-то, что я, возможно, упустил из виду ?

2 Ответов

Рейтинг:
2

Member 7676097

У меня была аналогичная проблема, когда мне нужно было удалить файл изображения после отображения изображения в элементе управления picturebox.
Он всегда работал с framework 3.5, а затем стал проблемой с framework 4.0
Мы решили эту проблему, заставив сборку мусора после установки изображения picturebox в ничто
Пример:
пикфото.Изображение = Ничего
пикфото.Освежить()
GC.Collect()


Richard Deeming

ЧЕТЫРЕ ГОДА слишком поздно. И эта проблема существует уже с .NET 1.0:
Файл образа заблокирован, когда вы выберите элемент управления PictureBox свойство изображения в файл[^]

Рейтинг:
18

OriginalGriff

Изображение.Из файла и образа.FromStream требует, чтобы файл / поток были доступны в течение всего срока службы образа, созданного из них, - в результате они удерживают дескриптор файла до тех пор, пока образ не будет удален.

Самый простой способ сделать это-загрузить изображение, скопировать его в новое изображение, а затем избавиться от оригинала. Это код, который я использую для C#:

/// <summary>
/// Get an Image without locking the file.
/// </summary>
/// <remarks>
/// Image.FromFile and Image.FromStream have problems in that the first
/// locks the file until the Image is Disposed, and teh latter requires
/// the stream to be opena nd available until the Image is Disposed, which
/// effectively locks the file as well.
/// This doesn't, because it uses a copy of the image.
/// </remarks>
/// <param name="path"></param>
/// <returns></returns>
public static Image GetImage(string path)
    {
    Image img;
    using (Image temp = Image.FromFile(path))
        {
        img = new Bitmap(temp);
        }
    return img;
    }

К сожалению, онлайн-переводчик, которым я пользуюсь, в данный момент не отвечает, так что...
Dim img As Image
Dim tmp as Image = Image.FromFile(path)
img = new BitMap(tmp)
tmp.Dispose()
Это должно быть сделано, но это не проверено.


Tino Fourie

ОГ, вариант 3 кода, который я опубликовал, касается того, что вы дали, но не является таким же тихим, как ваш. Я обязательно попробую ваш код (даже переведенный код выглядит довольно хорошо). Я отправлю ответ через минуту !!

Tino Fourie

К сожалению, это не может сделать мат. Что мне действительно интересно, так это то, что из 7 файлов изображений, которые я загружаю, только последнее загруженное изображение выдает сообщение об ошибке.

Я перепробовал все виды возможностей как в VS2010, так и в VS2012 как на Vista, так и на Win 7, и это всегда последнее чтение файлов изображений, которое заблокировано.

Может быть, существует другой способ применения того же кода, но с другой логикой ?

Tino Fourie

В настоящее время я изучаю сообщение о StackOverFlow, которое очень всеобъемлюще и подробно касается "заблокированных" файлов изображений.
Вот ссылка (http://stackoverflow.com/questions/18250848/how-to-prevent-the-image-fromfile-method-to-lock-the-file) для тех из вас, кто также застрял на подобном вопросе.