2016-07-09 5 views
0

Мне нужно переместить/переименовать некоторые изображения, которые загружаются внутри изображений, изображения хранятся в папке в исполняемом пути приложения. Прежде чем я смогу переместить/переименовать какое-либо изображение, я должен убедиться, что он не используется, поэтому я попытался загрузить другое изображение из исполняемого пути приложения в этот графический ящик, а также попытался «обнулить» свойство изображения в виде изображения.Невозможно разблокировать изображение, используемое в ящике изображений

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

protected virtual bool IsFileLocked(FileInfo file) 
    { 
     FileStream stream = null; 

     try 
     { 
      stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None); 
     } 
     catch (IOException) 
     { 
      return true; 
     } 
     finally 
     { 
      if (stream != null) 
       stream.Close(); 
     } 
     return false; 
    } 

Я также попытался использовать код отсюда: What process locks a file?

Какие вернул мне следующее: System.Collections.Generic.List'1 [System.Diagnostics.Process]

Я должен сказать вам, что я также борюсь с AccessViolationException, используя те же изображения и методы. Я не совсем уверен, что это одна и та же проблема ... так, как я сохранил изображения неправильно или как я их использую? Дайте мне знать, если вам нужно больше кода или информации!

EDIT:

И связь с TAW и ответ от Anon Трус не работает для меня, и я действительно старался изо всех сил, чтобы заставить его работать, я пытался распоряжаться и обнулить PictureBox, изображение и т.д. .Я нашел решение, смешанный с вашим предложением, но это очень грязная ...

var image2 = Image.FromFile(infos[i].FullName); 
           MemoryStream ms = new MemoryStream(); 
           if (ImageFormat.Jpeg.Equals(image2.RawFormat)) 
           { 
            // JPEG 
            image2.Save(ms, ImageFormat.Jpeg); 
           } 
           else if (ImageFormat.Png.Equals(image2.RawFormat)) 
           { 
            // PNG 
            image2.Save(ms, ImageFormat.Png); 
           } 
           else if (ImageFormat.Gif.Equals(image2.RawFormat)) 
           { 
            // Bitmap 
            image2.Save(ms, ImageFormat.Bmp); 
           } 
           else if (ImageFormat.Icon.Equals(image2.RawFormat)) 
           { 
            // Icon 
            image2.Save(ms, ImageFormat.Icon); 
           } 
           image2.Dispose(); 

           System.GC.Collect(); 
           System.GC.WaitForPendingFinalizers(); 

           System.IO.File.Delete(infos[i].FullName); 

           Image newImg = Image.FromStream(ms); 
           newImg.Save(neuer_name2); 
           newImg = null; 

Я знаю, что с помощью GarbageCollection не правильный путь, но я понятия не имею, какие блоки образы .. .so Я все еще ищу реальное решение здесь.

+1

код, который нагрузки и которые пытаются изменить/переместить их, будут еще интереснее, чем тот, который пытается разблокировать. Пожалуйста, покажите все .. Вы видели [это] (http://stackoverflow.com/questions/37736815/overwrite-image-picturebox-in-c-sharp/37741101?s=2|0.0000#37741101)? – TaW

+0

Я видел ссылку, и сейчас я работаю над ней, если это не поможет, я отредактирую свой оригинальный вопрос. – user3868224

+0

См. Изменение в моем ответе, я забыл, что есть старая проблема GDI +, с которой вы могли столкнуться –

ответ

2

Когда вы устанавливаете свойство равным null, вы только отмечаете объект как доступный для коллекции мусора в какой-то будущей точке, поэтому дескриптор файла для объекта останется открытым до некоторой точки будущего.

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

var image = pictureBox1.Image; 
pictureBox1.Image = null; 
image.Dispose(); 

Также есть issue with GDI+, с которым вы можете столкнуться. Вам нужно, чтобы предотвратить конструктор изображения от сохранения ссылки на файл, в первую очередь, вы можете легко сделать это, прочитав его в MemoryStream, а затем передавая, что в конструктор:

Image image = Image.FromStream(new MemoryStream(File.ReadAllBytes("test.png"))) 

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

  • Нет связанных вопросов^_^