2010-12-30 9 views
2

Ich versuche, so zu tun, aber das Programm wirft diese Ausnahme:WPF: Wie kann ich ein Bild verwenden, während ich es zeige?

Eine nicht behandelte Ausnahme des Typs ‚System.IO.IOException‘ in mscorlib.dll aufgetreten

Zusätzliche Informationen: Der Prozess nicht auf die Datei zugreifen kann 'C: \ Benutzer \ Roy \ Dokumente \ Visual Studio 2010 \ Projekte \ Zuweisung3 \ Zuweisung3 \ bin \ Debug \ Images \ Chrysanthemum.jpg', da es von einem anderen Prozess verwendet wird.

Gibt es eine Möglichkeit, es zu benutzen, während es geöffnet ist?

Code:

if (imgAddMessage.Source != null) 
      { 
       BitmapImage src = (BitmapImage)imgAddMessage.Source; 
       if (!Directory.Exists("Images")) 
       { 
        Directory.CreateDirectory("Images"); 
       } 

       FileStream stream = new FileStream("Images/" + imageName, FileMode.Create, FileAccess.ReadWrite); 
       JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
       encoder.Frames.Add(BitmapFrame.Create(src)); 
       encoder.Save(stream); 
       stream.Close(); 
      } 
+0

Können Sie Ihren Code schreiben - es würde helfen. – ChrisF

+0

Können Sie eine Kopie des Bildes erstellen, um damit zu arbeiten? –

+0

Ich nehme an, Sie erhalten die Ausnahme, wenn Sie versuchen, den 'FileStream' zu erstellen. Ist die Datei tatsächlich in einem anderen Programm geöffnet? Oder vielleicht in deinem Programm? Wenn ein Prozess eine Datei mit exklusivem Zugriff öffnet, können Sie nicht darauf zugreifen. –

Antwort

1

Zwei Dinge.

1) Ihr veröffentlichter Code hat keine using-Anweisung um den FileStream noch ruft er Dispose darauf auf.

2) Unabhängig davon, welches Codeteil das Bild zeigt, das Sie speichern möchten, muss FileAccess.Read verwendet werden, da nur ein einzelnes Codeteil eine Schreibsperre für eine Datei enthalten kann. Besser noch, wenn es Ihr eigenes Programm ist, das die Datei anzeigt, speichern Sie das Bild einfach im Speicher und zeigen Sie das Bild basierend auf den Bytes im Speicher an. Dann wirst du keine Sperren für die Datei halten und kannst später damit machen, was du willst ...

0

Nur neugierig, ob du noch Probleme hast.
Haben Sie Folgendes versucht?

if (imgAddMessage.Source != null) 
{ 
    string imageDirectory = "pack://application:,,,/Images"; 
    BitmapImage src = (BitmapImage)imgAddMessage.Source; 
    if (!Directory.Exists(imageDirectory)) 
     Directory.CreateDirectory(imageDirectory); 

    using (FileStream stream = new FileStream(Path.Combine(imageDirectory, imageName), FileMode.Create, FileAccess.ReadWrite)) 
    { 
     JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(src)); 
     encoder.Save(stream); 
    } 
} 

Und wie @Marco gesagt, Sie/Schreibberechtigung

gelesen haben muss
Verwandte Themen