Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Не могу удалить файл.


Автор: ZneP 6.2.2009, 17:02
Добрый день!

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

На форме есть элемент 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();                               /*Удаляем запись из списка*/
            }
        }




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


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

Автор: PashaPash 6.2.2009, 19:14
ZneP, ответ находится в MSDN, в статье про Image.FromFile, в секции Remarks.

Автор: emmanuil 6.2.2009, 21:07
В 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
    }


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

Автор: ZneP 7.2.2009, 09:23
Это я знаю и гуглил это тоже.

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

А были моменты, когда без обнуления image файлы нормально удалялись. Файл уже был физически удален, а в PictureBox`е изображение отображалось.

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

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

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

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

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

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

Автор: ZneP 9.2.2009, 13:45
Спасибо Вам за помощь. Все работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)