2013-09-10 6 views
0

C#/.NET 3.5, WindowsForms.Исключение IO - файл, используемый другим способом

У меня есть этот вид Windows, который отображает изображение из файла, и всякий раз, когда пользователь сохраняет запись этого кода:

    string oldLoc = itemsBO.ImageLoc; 
        if (oldLoc != SystemSettings.NoImageLocation) 
        { 
         if (File.Exists(oldLoc)) 
         { 
          try { File.Delete(oldLoc); } 
          catch (IOException ex) 
          { 
           MessageBox.Show("1 - " + ex.GetType().ToString() + " " + ex.Message); 
          } 
         } 
        } 

        string saveLoc = itemsBO.ImageSearchLoc + ".jpg"; 
        if (File.Exists(saveLoc)) 
        { 
         try { File.Delete(saveLoc); } 
         catch (IOException ex) 
         { 
          MessageBox.Show("2 - " + ex.GetType().ToString() + " " + ex.Message); 
         } 
        } 

        try 
        { 
         if (pictureBox2.Image != null) 
          pictureBox2.Image.Save(saveLoc, System.Drawing.Imaging.ImageFormat.Jpeg); 
        } 
        catch (IOException ex) 
        { 
         MessageBox.Show("3 - " + ex.GetType().ToString() + " " + ex.Message); 
        } 

Игнорирование бедных MessageBox сообщений, но ошибки в каждом Выгода заявлении. Он не может удалить «существующее» изображение, потому что он говорит, что он используется другим процессом. Не удается сохранить, потому что файл существует по тому же пути, потому что он не удаляется.

Это код, который устанавливает изображение при попытке добавить новое изображение;

  Image clipImage = Clipboard.GetImage(); 

      if (tabControl2.SelectedTab == tabPage5) 
      { 
       pictureBox1.Image = clipImage; 
       itemsBO.IsDirtyImage = true; 
      } 
      else if (tabControl2.SelectedTab == tabPage6) 
      { 
       pictureBox2.Image = clipImage; 
       itemsBO.IsDirtyImage2 = true; 
      } 

Затем, когда форма загружает существующую запись с изображением, это код, используемый для получения/отобразить его:

  byte[] bits = File.ReadAllBytes(imgfil); 
      msImage = new MemoryStream(bits, 0, bits.Length); 

      if (tabControl2.SelectedTab == tabPage5) 
       pictureBox1.Image = Image.FromStream(msImage); 
      else if (tabControl2.SelectedTab == tabPage6) 
       pictureBox2.Image = Image.FromStream(msImage); 

imgfil быть путь к изображению, конечно.

Абсолютно не знаю, с чего начать ...

+0

Вы читаете файл в этом месте где-то в своих кодах itemsBO.ImageLoc? – Gaurav

+0

ImageLoc - это путь к файлу, да. – user1096207

+0

Я имею в виду, что вы загружаете файл в этом месте itemsBO.ImageLoc в ваше приложение? Если да, как вы его загружаете – Gaurav

ответ

0

Я эту форму для Windows, который отображает изображение из файла, и всякий раз, когда пользователь сохраняет запись

Если вы все еще отображения изображение, когда они сохраняют файл, приложение все равно будет обращаться к файлу, если я не ошибаюсь. Сначала попробуйте удалить файл, возможно, установив изображение (или все, что вы используете для отображения изображения) на нуль, или загрузите пустой рисунок перед выполнением операции.

+0

Попробовал сменить его, чтобы поместить изображение изображения в временный объект Image, а затем установить для поля изображения значение null, чтобы я мог сохраните темп вместо окна изображения, но это даст те же результаты :( – user1096207

+0

@ user1096207 использует метод File.ReadAllBytes (imgfil) для загрузки изображения. Этот метод открывает файл, считывает содержимое файла в массив байтов , а затем закрывает файл. Так что это не так. – Gaurav

0

Если он говорит файл используется другим процессом, а затем он должен быть другим процессом :)

Пытались ли вы мониторинг блокировки файлов с помощью Process Explorer. Как только вы определили, что держит ваш файл, закройте этот дескриптор файла, используя Process Explorer, а затем попробуйте запустить ваш код.

Это может Помощь- How to find out what processes have folder or file locked?

0

Так я унаследовал это приложение от другого пользователя, оказываюсь, PictureBoxes были иметь их изображения, установленные в другом куске коды не зависит от этого третьего блока кода в исходном сообщении. Именно из-за этого произошло событие IOException :(

Смежные вопросы