Tesouro Ответов: 1

Удалите файл, который я ранее назначил в качестве фонового изображения панели


Привет,

Я делаю это в начале своей программы VB, чтобы разместить логотип на панели:

пнлого.BackgroundImage = Изображение.FromFile(ProgramDataPath & "\logo.jpg")

Но пользователь также должен иметь возможность выбрать другое изображение в качестве логотипа в любое время. Как только он это сделает, программа удалит старое logo.jpg на его ProgramDataPath и скопируйте новое изображение на его место.

Однако, когда я пытаюсь удалить текущий logo.jpg, я получаю исключение, говорящее, что файл открыт процессом и не может быть удален.

Кто-нибудь знает, как закрыть этот файл, чтобы его можно было удалить?
Заранее спасибо

Что я уже пробовал:

Я попробовал установить пнлого.BackgroundImage = Nothing, попробовал избавиться от панели pnLogo, попробовал установить переменную для изображения вместо этого (Public LogoImage As System.Рисование.Изображение = Изображение.FromFile(ProgramDataPath & "\logo.jpg"))... но ничего не получается.

1 Ответов

Рейтинг:
8

Peter Vegter

Обычно данное решение состоит в том, чтобы сделать копию изображения (память) перед использованием его с picturebox, например

Dim bmp as Bitmap = Nothing
Using img as Image = Image.FromFile(fileName)
    bmp = new Bitmap(img)
End Using
pnLogo.BackgroundImage = bmp

Но если вы хотите сохранить код, который у вас уже есть, просто поместите изображение в picturebox, чтобы разблокировать файл:
pnLogo.BackgroundImage.Dispose()
pnLogo.BackgroundImage = Nothing


Richard Deeming

NB: Как Конструктор растровых изображений[^] и то же самое Изображение.Метод FromStream[^] имейте предупреждение в замечаниях:
- Вы должны держать поток открытым в течение всего времени существования растрового изображения."

Кроме того, звоню pnLogo.BackgroundImage.Dispose не снимет низкоуровневую блокировку, которую GDI+ ставит на файл.

Peter Vegter

Я проверил оба своих примера, и они оба работали так, как ожидалось: файл был выпущен (с помощью Dispose()) и удален (с помощью File.Удалить()). Разве это не работает на вас?

Tesouro

Спасибо Питер, 1-й код, который вы опубликовали, работал отлично! Второй здесь не сработал. Файл.Delete() все равно выдаст исключение "файл открыт", если я сделаю pnLogo.Фоновое изображение.Dispose() и pnLogo.BackgroundImage=ничего перед ним.

Peter Vegter

Добро пожаловать, и спасибо за ваш ответ и голосование. Странно, что второй код хорошо работает в моем тестовом приложении, а не в вашем. Я еще раз взгляну на него... - тоже спасибо Ричарду.