2014-11-20 3 views
1

У меня есть редактор, у которого есть некоторые строки и изображение, отображаемое в файлах ui и iam, сохраняющих данные в текстовом файле и отдельном файле .jpg с тем же именем.Использование MemoryStream для загрузки .jpg без блокировки файла процессом?

Теперь, когда iam пытается переопределить файл .jpg на File.Replace, в нем говорится, что изображение заблокировано другим процессом, который, очевидно, является процессом моего собственного приложения.

Я надеюсь, что memystream может исправить это, потому что он обрабатывается в ОЗУ. Поэтому я хотел бы загрузить все jpg-файлы с помощью memystream, но я не понимаю, как загрузить что-либо с помощью memystream, если это возможное решение моей проблемы вообще.

Редактировать: В основном код снипп это примерно это одна:

private void CopyPicture(bool PictureHasChanged) 
    { 
     try 
     { //kopiere die datei nur, wenn sie nicht bereits vorhanden ist. 
      if (File.Exists(TargetFolder + Exercise.Name + ".jpg") == false) 
      {//kopiert das neue bild in das zielverzeichnis 
       File.Copy(Exercise.Bild.UriSource.LocalPath, TargetFolder + Exercise.Name + ".jpg"); 
      } 
      else 
      { 
       //wenn das Bild einer bestehenden übung geändert wurde 
       if (PictureHasChanged) 
       { 
        //überprüft ob eine datei mit dem namen existiert 
        if (File.Exists(TargetFolder + Exercise.Name + ".jpg") == true) 
        {//löscht die existente datei 
         File.Replace(Exercise.Bild.UriSource.LocalPath, TargetFolder + Exercise.Name + ".jpg", TargetFolder + Exercise.Name + ".jpg"); 
        } 

       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message + "\n\n" + ex.Source); 
      return; 
     } 

    } 

и я картина хранится внутреннее в простом списке как BitmapImage по: new BitmapImage(new Uri(f.FullName.ToString().Remove(f.FullName.Length - 4, 4) + ".jpg",UriKind.RelativeOrAbsolute))

я надеюсь, что это помогает понять проблему лучше

EDIT 2: Теперь IAM выполнив следующие действия, чтобы загрузить изображения:

FileStream fsSource = new FileStream(JpgTarget, FileMode.Open, FileAccess.Read); 
         byte[] bytes = new byte[fsSource.Length]; 
         using (fsSource) 
         { 
          // Read the source file into a byte array. 
          int numBytesToRead = (int)fsSource.Length; 
          int numBytesRead = 0; 
          while (numBytesToRead > 0) 
          { 
           // Read may return anything from 0 to numBytesToRead. 
           int n = fsSource.Read(bytes, numBytesRead, numBytesToRead); 

           // Break when the end of the file is reached. 
           if (n == 0) 
            break; 

           numBytesRead += n; 
           numBytesToRead -= n; 
          } 
          //numBytesToRead = bytes.Length; 
         } 

         BitmapImage Image = new BitmapImage(); 
         //erstellt das bitmap für die liste 
         using (MemoryStream Memstream = new MemoryStream(bytes)) 
         { 

          Image.BeginInit(); 
          Image.StreamSource = Memstream; 
          Image.CacheOption = BitmapCacheOption.OnLoad; 
          Image.EndInit(); 
          Image.Freeze(); 
         } 
         fsSource.Close(); 

Но твердит мне, что Pictrue, IAM пытается перезаписать уже используется другим процессом.

Edit 3: Я пытался использовать решение Pennie Pet и в конечном итоге с этим, та же проблема с заблокированного файла:

Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(JpgTarget)); 

         using (MemoryStream memory = new MemoryStream()) 
         { 
          newBitmap.Save(memory, newBitmap.RawFormat); 
          memory.Position = 0; 
          BitmapImage bitmapImage = new BitmapImage(); 
          bitmapImage.BeginInit(); 
          bitmapImage.StreamSource = memory; 
          bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
          bitmapImage.EndInit(); 


          //fügt der liste die aus der textdatei gelesene übung hinzu 
          List.Add(new Uebung(text, Sitting, wdh, bitmapImage, f.Name.Substring(0, f.Name.Length - 4))); 
         } 

См METHODE GetImageFromByteArray в должности PenniePet в.

Последнее редактирование:

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

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

Надеюсь, вы, другие ребята, не будете сумасшедшими. Спасибо за всю твою помощь!

+0

Это помогло бы увидеть код, который вы на самом деле используете. Вам понадобится 'FileStream', чтобы прочитать файл независимо, но похоже, что вы, возможно, сможете загрузить его в« MemoryStream »в качестве буфера. Но я также не уверен, что это лучший способ сделать то, что вы ищете. Нам действительно нужно увидеть ваш код и лучшее описание того, что вы пытаетесь сделать. –

+0

@MatthewHaugen там, вы идете, я надеюсь, что это делает для вас любой смысл:/ – Marv

+0

Вы располагаете растровое изображение? – CodeCaster

ответ

1

Если я понимаю правильно, вы хотите, чтобы прочитать файл .jpg, и превратить его в объект .Net Bitmap таким образом, чтобы гарантировать, что файл .jpg не будет заблокирован. Если это так, вот некоторые фрагменты кода из предыдущего ответа шахты: https://stackoverflow.com/a/16576471/253938

Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(fileName)); 

и

/// <summary> 
    /// Method that uses the ImageConverter object in .Net Framework to convert a byte array, 
    /// presumably containing a JPEG or PNG file image, into a Bitmap object, which can also be 
    /// used as an Image object. 
    /// </summary> 
    /// <param name="byteArray">byte array containing JPEG or PNG file image or similar</param> 
    /// <returns>Bitmap object if it works, else exception is thrown</returns> 
    public static Bitmap GetImageFromByteArray(byte[] byteArray) 
    { 
    Bitmap bm = (Bitmap)_imageConverter.ConvertFrom(byteArray); 

    if (bm != null && (bm.HorizontalResolution != (int)bm.HorizontalResolution || 
         bm.VerticalResolution != (int)bm.VerticalResolution)) 
    { 
     // Correct a strange glitch that has been observed in the test program when converting 
     // from a PNG file image created by CopyImageToByteArray() - the dpi value "drifts" 
     // slightly away from the nominal integer value 
     bm.SetResolution((int)(bm.HorizontalResolution + 0.5f), 
         (int)(bm.VerticalResolution + 0.5f)); 
    } 

    return bm; 
    } 
+0

Это почти правильно, но мне нужно BitmapImage. Я попытаюсь использовать ваше решение и использовать конвертер с: http://stackoverflow.com/questions/6484357/converting-bitmapimage-to-bitmap-and-vice-versa или http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap im не совсем уверен. – Marv

+0

Мне удалось преобразовать его в bitmapImage, но он также дает мне ту же ошибку – Marv

1

Вы должны использовать

bitmap.CacheOption = BitmapCacheOption.OnLoad; 

в противном случае ваш файл изображения заблокирован.

+0

Я использую его сейчас, вы можете видеть в моем втором редактировании. Но его все еще заблокированы, любые идеи?:/ – Marv

+0

Вам нужно закрыть оригинальный поток. Добавьте 'fsSource.Close();' в конец (после того, как поток памяти закрыт). – Sinatr

+0

ах кажется, что я пропустил использование вещи. Теперь я добавил вызов метода close, но у меня все еще есть та же проблема. – Marv

2

Убедитесь, что вы закрыли поток после сохранения файла .jpg.

При чтении файла обязательно установите только Read доступ при открытии потока.

System.IO.FileStream f = new System.IO.FileStream(sPath, FileMode.Open, 
                 FileAccess.Read); 

поток Используйте F, чтобы прочитать байты и создать экземпляр MemoryStream с помощью чтения байта:

System.IO.MemoryStream x = new System.IO.MemoryStream(buffer) 
+0

извините, но я действительно не понимаю, что такое буфер в этом случае, создан ли он файловым потоком? и как я могу получить к нему доступ? – Marv

+0

Да, с помощью метода FileStream.Read –

+0

вы уверены, что это правильный способ заполнения потока памяти? Я использую это из MSDN (http://msdn.microsoft.com/de-de/library/system.io.filestream.read%28v=vs.110%29.aspx) и это (http: // stackoverflow. com/questions/5346727/convert-memory-stream-to-bitmapimage), чтобы загрузить bitmapimage. Но когда я пытаюсь перезаписать Jpg, он все еще говорит мне, что его уже получил доступ к другому процессу. – Marv