Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Проблема удаление файла Добавлено: 29.11.08 01:31  

Автор вопроса:  Медведь
Уважаемые знатоки и профессионвалы!
Такая проблема:
Имеется массив

dim Maps(6) as PictureBox


в каждый элемент загружено изображение:

Maps(n).Image= New Bitmap(C:\n.gif)


Задача в том что бы удалить файл картинки при удалении элемента массива.Делаю так :

Maps(n).Image=nothing
My.Computer.FileSystem.DeleteFile(C:\n.gif )

НО! тут выходит сообщение, что файл используется программой
Пробую так :
Maps(n).Dispose()
My.Computer.FileSystem.DeleteFile(C:\n.gif )

Та же самая проблема

Помогите! Заранее благодарен!!!

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 29.11.08 09:14
выходит сообщение, что файл используется программой

Это происходит потому что ты использовал не тот конструктор Bitmap (либо файл на самом деле открыт где то еще)
Надо просто использовать другой конструктор.
примерно так..
С#

  1.  
  2. using System.IO;
  3. using System.Drawing;
  4.  
  5. // ...
  6.  
  7.         /// <summary>
  8.         ///
  9.         /// </summary>
  10.         /// <param name="imagePath">path to image file</param>
  11.         /// <returns>bitmap</returns>
  12.         public static Bitmap GetImage(string imagePath)
  13.         {
  14.             /* check input parameter */
  15.             if (string.IsNullOrEmpty(imagePath)) throw new ArgumentNullException();
  16.             if (!File.Exists(imagePath)) throw new FileNotFoundException();
  17.  
  18.             Bitmap retval = null;
  19.             try
  20.             {
  21.                 using (FileStream fs = File.OpenRead(imagePath))
  22.                 {
  23.                     retval = new Bitmap(fs);
  24.                 }
  25.             }
  26.             catch (Exception ex)
  27.             {
  28.                 throw ex;
  29.             }
  30.             return retval;
  31.         }



При таком подходе Stream будет гарантированно закрыт и ты сможешь спокойно удалить файл

Ответить

Номер ответа: 2
Автор ответа:
 Медведь



Вопросов: 3
Ответов: 7
 Профиль | | #2 Добавлено: 29.11.08 09:30
Ок,спасибо,буду попробовать интерпритировать код в VB.NET

Ответить

Номер ответа: 3
Автор ответа:
 Медведь



Вопросов: 3
Ответов: 7
 Профиль | | #3 Добавлено: 30.11.08 02:14
Спасибо! Всё получилось!
Коротко для VB.NET :

Imports System.IO
...
...
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
EROS, вы хотите сказать, что конструктор New (String) оставляет файл заблокированым?

Именно это я и хочу сказать... Это известные грабли..

Ответить

Номер ответа: 6
Автор ответа:
 Фeнягz



Вопросов: 2
Ответов: 62
 Web-сайт: atauenis.narod.ru
 Профиль | | #6
Добавлено: 01.12.08 08:21
Да. Если забыть вызвать Dispose (либо End Using) - файл остается открытым до завершения программы.

Ну, например, многостраничным файлам (TIFF либо GIF нужен постоянный доступ к файлу). В память не грузятся полностью. Для смены активной страницы нужно прочесть из открытого файла. Очевидно - одна логика для всех изображений.

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 01.12.08 10:57
Если забыть вызвать Dispose (либо End Using)

Это справедливо при использовании конструктора со Stream'om, но в нашем случае речь идет о баге при использовании конструктора которому передается путь к файлу(тут мы не имеем доступа к потоку). В этом случае открытие и закрытие потока при создании объекта Bitmap происходит в недрах FW и корректно закрывать поток должны были разработчики этого класса. Но по всей видимости они этого не сделали.

Ответить

Номер ответа: 8
Автор ответа:
 Фeнягz



Вопросов: 2
Ответов: 62
 Web-сайт: atauenis.narod.ru
 Профиль | | #8
Добавлено: 03.12.08 01:14
Не! :d

Dim bm As New Bitmap("c:\1.bmp";)
Call IO.File.Delete("c:\1.bmp";) ' Ошибка


Если между строками 1 и 2 вставить

Call bm.Dispose()


Тогда все нормально.

Ответить

Номер ответа: 9
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 03.12.08 08:04
да это все понятно, но довольно часто бывают ситуации когда объект Bitmap должен остаться в "живых" для каких то манипуляций.. В любом случае (имхо) держать поток открытым на все время работы программы - это зло и это не правильно.

Ответить

Номер ответа: 10
Автор ответа:
 Фeнягz



Вопросов: 2
Ответов: 62
 Web-сайт: atauenis.narod.ru
 Профиль | | #10
Добавлено: 03.12.08 08:58
  1. Dim bm As New Bitmap("c:\1.bmp")
  2. Dim bm2 As New Bitmap(bm.width, bm.height, Imaging.PixelFormat.Format32bppArgb)
  3. Call bm.SetResolution(bm2.HorizontalResolution, bm2.VerticalResolution)
  4. Using g As Graphics = Graphics.FromImage(bm2)
  5.    Call g.DrawImage(bm, 0, 0)
  6. End Using
  7. Call bm.dispose()
  8. Call IO.File.Delete("c:\1.bmp")
  9. ' используем bm2

Ответить

Номер ответа: 11
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #11 Добавлено: 03.12.08 10:00
ну и? что ты хотел этим показать? Что для "отвязки" от файла надо создавать 2 битмапа? Жжошь! )) А чего мелочиться? давай уж сразу пяточек.. ну так, про запас..
Мне тут не так давно пришлось писать что то типа image viewer(дерево каталогов + миниатюры + инфа о картинке + поворот,ресайз и т.д..) с примитивными файловыми операциями (удаление, перемещение, переименование и т.д..), а теперь прикинь.. я открываю папку с сотней картинок и чтобы не блокировать файлы я должен создать в 2 раза больше объектов? ))))
з.ы. stream однозначно рулит.. а конструктор с путем - это для подростковой группы дет.сада "Солнышко"

Ответить

Номер ответа: 12
Автор ответа:
 Фeнягz



Вопросов: 2
Ответов: 62
 Web-сайт: atauenis.narod.ru
 Профиль | | #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-сайт: atauenis.narod.ru
 Профиль | | #14
Добавлено: 04.12.08 08:46
Почему. Все вовременные программы не только умные, но и красивые. :d А тут хотя бы без простой графической обработки - не обойтись. Тем более, GDI+ предоставляет в твое распоряжение кучу возможностей.

Однако, что значит прорисовать изображение с разрешающей способностью 72х72 dpi на графической поверхности с оной в 96x96 dpi. Или постараться создать графическую поверхность для изображения с индексированным цветом. Хочешь не хочеш - лучше работать с предварительно откорректированной копией изображения.

Полноценные редакторы,конвертеры .. написание такого рода программ - это узкоспециализированная задача и выполняется она, как правило, не на NET.


Почему, можна и для Net делать. Я нормальные программы для работы с графикой даже на vb6 делал. А в Net практически все что нужно под рукой.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам