Страница: 1 |
Страница: 1 |
Вопрос: Проблема удаление файла
Добавлено: 29.11.08 01:31
Автор вопроса: Медведь
Уважаемые знатоки и профессионвалы!
Такая проблема:
Имеется массив
в каждый элемент загружено изображение:
Задача в том что бы удалить файл картинки при удалении элемента массива.Делаю так :
My.Computer.FileSystem.DeleteFile(C:\n.gif )
НО! тут выходит сообщение, что файл используется программой
Пробую так :
My.Computer.FileSystem.DeleteFile(C:\n.gif )
Та же самая проблема
Помогите! Заранее благодарен!!!
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 29.11.08 09:14
Это происходит потому что ты использовал не тот конструктор Bitmap (либо файл на самом деле открыт где то еще)
Надо просто использовать другой конструктор.
примерно так..
С#
При таком подходе Stream будет гарантированно закрыт и ты сможешь спокойно удалить файл
Номер ответа: 2
Автор ответа:
Медведь
Вопросов: 3
Ответов: 7
Профиль | | #2
Добавлено: 29.11.08 09:30
Ок,спасибо,буду попробовать интерпритировать код в VB.NET
Номер ответа: 3
Автор ответа:
Медведь
Вопросов: 3
Ответов: 7
Профиль | | #3
Добавлено: 30.11.08 02:14
Спасибо! Всё получилось!
Коротко для VB.NET :
...
...
Dim fs as FileStream = File.OpenRead(imagePath)
Object.Image = new Bitmap(fs)
fs.Close()
Удаляем imagePath без проблем
Работает !
Номер ответа: 4
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #4
Добавлено: 01.12.08 02:52
EROS, вы хотите сказать, что конструктор New (String) оставляет файл заблокированым? Это как минимум странно
Номер ответа: 5
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #5
Добавлено: 01.12.08 07:48
Именно это я и хочу сказать... Это известные грабли..
Номер ответа: 6
Автор ответа:
Фeнягz
Вопросов: 2
Ответов: 62
Web-сайт:
Профиль | | #6
Добавлено: 01.12.08 08:21
Да. Если забыть вызвать Dispose (либо End Using) - файл остается открытым до завершения программы.
Ну, например, многостраничным файлам (TIFF либо GIF нужен постоянный доступ к файлу). В память не грузятся полностью. Для смены активной страницы нужно прочесть из открытого файла. Очевидно - одна логика для всех изображений.
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 01.12.08 10:57
Это справедливо при использовании конструктора со Stream'om, но в нашем случае речь идет о баге при использовании конструктора которому передается путь к файлу(тут мы не имеем доступа к потоку). В этом случае открытие и закрытие потока при создании объекта Bitmap происходит в недрах FW и корректно закрывать поток должны были разработчики этого класса. Но по всей видимости они этого не сделали.
Номер ответа: 8
Автор ответа:
Фeнягz
Вопросов: 2
Ответов: 62
Web-сайт:
Профиль | | #8
Добавлено: 03.12.08 01:14
Не! :d
Call IO.File.Delete("c:\1.bmp" ' Ошибка
Если между строками 1 и 2 вставить
Тогда все нормально.
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 03.12.08 08:04
да это все понятно, но довольно часто бывают ситуации когда объект Bitmap должен остаться в "живых" для каких то манипуляций.. В любом случае (имхо) держать поток открытым на все время работы программы - это зло и это не правильно.
Номер ответа: 10
Автор ответа:
Фeнягz
Вопросов: 2
Ответов: 62
Web-сайт:
Профиль | | #10
Добавлено: 03.12.08 08:58
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 03.12.08 10:00
ну и? что ты хотел этим показать? Что для "отвязки" от файла надо создавать 2 битмапа? Жжошь! )) А чего мелочиться? давай уж сразу пяточек.. ну так, про запас..
Мне тут не так давно пришлось писать что то типа image viewer(дерево каталогов + миниатюры + инфа о картинке + поворот,ресайз и т.д..) с примитивными файловыми операциями (удаление, перемещение, переименование и т.д..), а теперь прикинь.. я открываю папку с сотней картинок и чтобы не блокировать файлы я должен создать в 2 раза больше объектов? ))))
з.ы. stream однозначно рулит.. а конструктор с путем - это для подростковой группы дет.сада "Солнышко"
Номер ответа: 12
Автор ответа:
Фeнягz
Вопросов: 2
Ответов: 62
Web-сайт:
Профиль | | #12
Добавлено: 04.12.08 01:31
А ты если работал с графикой - должен знать - в любом случае придется работать с копией. Ведь дело не только в невозможности удаления открытого конструктором New файла. ... разрешающая способность! ... глубина цвета... для проведения дальнейших графических операций.
Да, даже сотенку изображений, например 1680х1050 с глубиной цвета 32 бита на пиксел - легко можно держать в памяти, даже если это занимает в памяти 100 * ((1680 * 1050) * 4) = 705600000 байт = 689062,5 килобайт = 675 мегабайт. Все равно графика списывается в файл подкачки.
Но опять таки, ты работаешь с ескизами и адресами файлов, а не изображениями. Я вот пишу сейчас редактор-генератор многостраничных TIFF.
Номер ответа: 13
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #13
Добавлено: 04.12.08 08:05
Эти фичи юзаются при конкретной обработке изображения.. например, если делать полноценный редактор,конвертер и т.д. Согласись, что в 95% случаях максимум, что бывает необходимо, так это тупо считать картинку, возможно отресайзить ее динамически и сохранить в другом формате.. ну и файловые операции с ней. И на этом все! Для обычных программ этих операций более чем достаточно. Полноценные редакторы,конвертеры .. написание такого рода программ - это узкоспециализированная задача и выполняется она, как правило, не на NET.
Номер ответа: 14
Автор ответа:
Фeнягz
Вопросов: 2
Ответов: 62
Web-сайт:
Профиль | | #14
Добавлено: 04.12.08 08:46
Почему. Все вовременные программы не только умные, но и красивые. :d А тут хотя бы без простой графической обработки - не обойтись. Тем более, GDI+ предоставляет в твое распоряжение кучу возможностей.
Однако, что значит прорисовать изображение с разрешающей способностью 72х72 dpi на графической поверхности с оной в 96x96 dpi. Или постараться создать графическую поверхность для изображения с индексированным цветом. Хочешь не хочеш - лучше работать с предварительно откорректированной копией изображения.
Почему, можна и для Net делать. Я нормальные программы для работы с графикой даже на vb6 делал. А в Net практически все что нужно под рукой.