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


Автор: NilovSerge 20.7.2008, 22:05
Всем привет!
У меня есть листбокс со списком файлов и обьект pictureBox для просмотра выбранного файла. Выбранный файл можно в том числе и удалить с диска.
Проблема в том, что что при попытке удалить файл с диска я получаю ошибку:
Код

        string FileToDelete = this.SelectedImage._Value;          // Сохранить имя удаляемого файла
        lbImagesOfDir.Items.RemoveAt(lbImagesOfDir.SelectedIndex); // Из списка удалить имя файла
        pictureBox.Image = null;                                   // в pictureBox убрать изображения
        lbImagesOfDir.SelectedIndex = 0;                           // Перевести фокус на 1й элемент в списке
        lbImagesOfDir.Focus();
        FileInfo fInfo = new FileInfo(FileToDelete);               // Если файл существует на диске его удалить
        if (fInfo.Exists)
        {
          fInfo.Delete(); // The process cannot access the file 'D:\\CSharpProjects\\DirsView\\DirsView\\Images\\HelpLibs\\Common\\simpl.JPG' because it is being used by another process
        }



  Непонятно что держит этот файл?
Картинка при выборе элемента в списке выводится на экран отдельной функцией, 
в которой  создается битмап и цепляется к pictureBox и возвращает строковое описание картинки:


 
Код

   public static string ShowFileNameImageinPicureBox(PictureBox pictureBox, string FullFileName)
    {
      FileInfo fInfo = new FileInfo(FullFileName);
      if (!fInfo.Exists) return "";

      string Res =  FullFileName;
      Image Img;
      string FileName = fInfo.Name;
      try
      {
        Img = new Bitmap(FullFileName);
      }
      catch
      {
        return "";
      }

      pictureBox.Image = Img;
      long FileLength = fInfo.Length;
      Res+= Utils.GetText("File length") + " : " + NLib.FileSystemUtils.GetFileSizeNamed(FileLength, true);
      Res+= " "+Utils.GetText("Width") + " : " + Img.PhysicalDimension.Width.ToString() + ",  " + Utils.GetText("Height") +
          " : " + Img.PhysicalDimension.Height.ToString() + ".  ";

      return Res;
    }

Ресурсы Bitmap и FileInfo на выходе из ShowFileNameImageinPicureBox освобождаются сами? Их вроде явно освобождать не надо ?
В чем может быть проблема?


   Заранее спасибо

Автор: mihryak 20.7.2008, 23:17
http://msdn.microsoft.com/en-us/library/0cbhe98f.aspx
Цитата

The file remains locked until the Bitmap is disposed. 


Код

pictureBox.Image = null; 

здесь вызывай Dispose image'у

Автор: NilovSerge 21.7.2008, 18:59
Не получается ...
если писать 
Код

        pictureBox.Image = null;
        pictureBox.Image.Dispose();


то получаю "Object reference not set to an instance of an object."  на Image.Dispose(); так как pictureBox.Image равен null
Если без присваивания null - То тоже ошибка...

Автор: Idsa 21.7.2008, 19:08
Цитата(NilovSerge @  21.7.2008,  22:59 Найти цитируемый пост)
Если без присваивания null - То тоже ошибка... 

Какая?

Автор: mihryak 21.7.2008, 20:24
Цитата(NilovSerge @  21.7.2008,  19:59 Найти цитируемый пост)
Не получается ...
если писать  
        pictureBox.Image = null;
        pictureBox.Image.Dispose();
то получаю "Object reference not set to an instance of an object."  на Image.Dispose(); так как pictureBox.Image равен null
Если без присваивания null - То тоже ошибка... 

а строчки местами менять не пробовал? ;) ты ж null диспозить пытаешься
а если только диспозить без сброса - то при следующей отрисовке будет исключение

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