Страница: 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 практически все что нужно под рукой.