Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу удалить файл. Файл занят другим процессом. 
:(
    Опции темы
ZneP
Дата 6.2.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 15.7.2008
Где: Россия, Москва

Репутация: нет
Всего: нет



Добрый день!

Я сделал форму для печати изображений. Можно добавлять и удалять изображения, но при удалении сразу кричит, что файл занят другим процессом.

На форме есть элемент ListView (в нем названия добавленных изображений) и PictureBox (для отображения текущего изображения)

Вот мой код:

Код

private void PrintDog_Load(object sender, EventArgs e)
        {
            listview.Clear();   /*Очищаем список. Дальше в коде я буду вызывать ф-ю PrintDog_Load для перезаполнения списка*/

            string[] file = Directory.GetFiles("D:\\Images\\", "*.jpg");     /*Получаем список файлов*/
            if (file.Length <= 0)
                return;

            for (int i = 0; i < file.Length; i++)
            {
                listview.Items.Add("Изображение " + Convert.ToString(i + 1));         /*Добавляем запись в список*/
                listview.Items[i].Tag = file[i];             /*Св-ву Tag присваиваем полный путь к файлу*/
            }

            listview.Items[0].Selected = true;         /*Выбираем первую запись*/
        }


/*Обработчик события нажатия кнопки "Добавить". Выбранные изображения я копирую в папку "D:\Images\" со своим именем файла (так надо по задумке)*/
private void b_add_Click(object sender, EventArgs e)
        {
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string[] files = dlg.FileNames;

                for (int i = 0; i < files.Length; i++)
                {
                    string path = "D:\\Images\\" + DateTime.Now.ToShortDateString() + 
                        "_" + DateTime.Now.Hour.ToString() + 
                        "-" + DateTime.Now.Minute.ToString() + 
                        "-" + DateTime.Now.Second.ToString() + "_" + i.ToString() + ".jpg";

/*Изменяю размеры выбранных файлов на свои*/
                    Image img = Image.FromFile(files[i]);

                    int W = 794;
                    int H = 1123;

                    if (img.Width < W)
                        W = img.Width;

                    if (img.Height < H)
                        H = img.Height;

                    Bitmap bmp = new Bitmap(img, new Size(W, H));
                    bmp.SetResolution(96, 96);
                    bmp.Save(path, ImageFormat.Jpeg);

                    bmp.Dispose();
                    img.Dispose();
                }

                PrintDog_Load(null, null);     /*Перезаполняем список*/
            }
        }

/*Обработка события при выборе строки из списка*/
private void listview_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            image.Image = Image.FromFile((string)listview.SelectedItems[0].Tag);      /*Отображаем изображение в PictureBox`е*/
        }


/*Обработка нажатия на кнопку "Удалить"*/
private void b_del_Click(object sender, EventArgs e)
        {
            image.Image = null;     //Обнуляем PictureBox

            for(int i = 0; i < listview.SelectedItems.Count; )
            {
                File.Delete(listview.SelectedItems[i].Tag.ToString());      /*Удаляем файл*/
                listview.SelectedItems[i].Remove();                               /*Удаляем запись из списка*/
            }
        }




При попытке удалить первый файл из выбранных происходит ошибка "Файл занят другим процессом...", но если проигнорировать ее, то все остальные выбранные изображения удаляться нормально.


Я уже не знаю что и делать. Подскажите пожалуйста.

Это сообщение отредактировал(а) ZneP - 6.2.2009, 17:08
PM MAIL ICQ Skype   Вверх
PashaPash
Дата 6.2.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: нет
Всего: 49



ZneP, ответ находится в MSDN, в статье про Image.FromFile, в секции Remarks.


--------------------
PM MAIL WWW   Вверх
emmanuil
Дата 6.2.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



В MSDN:
Цитата(PashaPash @  6.2.2009,  17:14 Найти цитируемый пост)
ZneP, ответ находится в MSDN, в статье про Image.FromFile, в секции Remarks.

А потом добавь Dispose.
Код

private void b_del_Click(object sender, EventArgs e)        {
    if (image.Image != null) {
        image.Image.Dispose();
        image.Image = null;     //Обнуляем PictureBox
    }



Это сообщение отредактировал(а) emmanuil - 6.2.2009, 21:08
PM MAIL   Вверх
PashaPash
Дата 6.2.2009, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: нет
Всего: 49



emmanuil, ну зачем ты так, не интересно же. Тем более что ошибка вполне гуглимая


--------------------
PM MAIL WWW   Вверх
ZneP
Дата 7.2.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 15.7.2008
Где: Россия, Москва

Репутация: нет
Всего: нет



Это я знаю и гуглил это тоже.

До этого я делал так, как emmanuil написал, но ошибка все равно вылетала.

А были моменты, когда без обнуления image файлы нормально удалялись. Файл уже был физически удален, а в PictureBox`е изображение отображалось.
PM MAIL ICQ Skype   Вверх
PashaPash
Дата 7.2.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: нет
Всего: 49



ZneP, Dispose надо вызывать везде, не только в b_del_Click. В listview_SelectedIndexChanged_1 надо старый image.Image диспозить, если есть.


--------------------
PM MAIL WWW   Вверх
emmanuil
Дата 8.2.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Цитата(PashaPash @  6.2.2009,  19:26 Найти цитируемый пост)
emmanuil, ну зачем ты так, не интересно же. Тем более что ошибка вполне гуглимая

PashaPash, так видишь и MSDN и гугл не помог. 
Цитата(ZneP @  7.2.2009,  07:23 Найти цитируемый пост)
Это я знаю и гуглил это тоже. До этого я делал так, как emmanuil написал, но ошибка все равно вылетала.А были моменты, когда без обнуления image файлы нормально удалялись. Файл уже был физически удален, а в PictureBox`е изображение отображалось.

Если так судить, то вообще на вопросы отвечать не нужно, тут наверное половино ответов есть в гугле. smile 

PM MAIL   Вверх
PashaPash
Дата 8.2.2009, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: нет
Всего: 49



emmanuil, прямой ответ тоже оказался не эффективен. Тем более что топикастер не заметил Dispose, и списал все на "обнуление image" smile


--------------------
PM MAIL WWW   Вверх
emmanuil
Дата 9.2.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Цитата(PashaPash @  8.2.2009,  18:53 Найти цитируемый пост)
emmanuil, прямой ответ тоже оказался не эффективен. Тем более что топикастер не заметил Dispose, и списал все на "обнуление image" 
 Ну дык я и с намеком на то, что если пример не помог (в этом конкретном случае), то и MSDN и гугл не поможет. smile Тут уже конкретно указать и показать надо. (Только без обид, все когда-то начинали, всё бывает...)

PM MAIL   Вверх
ZneP
Дата 9.2.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 15.7.2008
Где: Россия, Москва

Репутация: нет
Всего: нет



Спасибо Вам за помощь. Все работает.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.