Image-Datei kopieren, wird von einem anderen Prozess verwendet
Ich versuche einen Benutzer anzulegen perfil edit-Fenster, in diesem Fenster hat ein Bild-Steuerelement
Wenn ich gewählt eine image-Datei, wird es zeigen sich in diesem Bild-Steuerelement, und kopieren Sie diese Datei auf meinem image-Ordner, und zum ersten mal ist alles in Ordnung, aber zweites mal, zeigt es einen Fehler
"Der Prozess kann nicht auf die Datei zugreifen 'C:\1.jpg" weil es wird von einem anderen Prozess verwendet."
Ich denke, es ist weil meine Bild-Steuerelement diese Datei verwenden, also, ich weiß nicht, was kann ich tun,
private void Select_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog od = new OpenFileDialog();
if (od.ShowDialog() == true)
{
string imageLocal = @"C:/1.jpg";
File.Copy(od.FileName, imageLocal, true);
image1.Source = new BitmapImage(new Uri(imageLocal));
}
}
- Das Problem hier liegt darin, wie Sie sind, laden Sie die Datei und konvertieren Sie es zu einem Bild. Es funktioniert nicht mit der Konstruktor-Methode, die Sie verwenden. Es gibt Alternative Methoden, wenn Sie vermeiden wollen, dass 'von einem anderen Prozess verwendet' Ausnahme.
- was kann ich tun für resolver dieses problem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie laden möchten, und ein Bild anzuzeigen, und halten Sie die Datei für die Operationen im Dateisystem (wie nachladen oder verschieben in ein anderes Verzeichnis), dem Uri-Konstruktor wird nicht funktionieren, weil (wie Sie), die BitmapImage-Klasse hängt an den Datei-handle.
Verwenden Sie stattdessen eine Methode wie diese...
Diese Methode nimmt ein FileInfo und gibt ein BitmapImage, die Sie anzeigen können und gleichzeitig bewegen Sie es in ein anderes Verzeichnis oder zeigt es erneut.
Eine viel einfachere Methode, kopiert aus einer anderen Antwort: siehe unten, ist diese:
StreamSource
Eigenschaft. WPF wählt automatisch den richtigen decoder, wie in meiner Antwort. Außerdem, die hier gezeigte Lösung beinhaltet eineSystem.Drawing.Bitmap
, die nicht WPF aber WinForms. Es dekodiert die Bild-Datei in eineBitmap
, dann kodiert es wieder in einen MemoryStream und schließlich dekodiert, die in ein BitmapImage. Dies ist extrem ineffizient im Vergleich zu direkt Dekodieren eines FileStream in ein BitmapImage.why readallbytes and create a memorystream when you could just use a filestream?
. Das ist genau das, was ich bin reden über.Die Methode gezeigt, unten lädt ein BitmapImage aus Datei und schließt Sie sofort wieder die Datei nach dem laden. Beachten Sie, dass es notwendig ist, um die
BitmapCacheOption.OnLoad
flag, wenn die Quell-stream wird geschlossen nachEndInit
.Dieser code funktioniert für jedes Bildformat wird unterstützt von WPF. Bei der übergabe der Bild-Datei-Inhalte als stream an den
StreamSource
Eigenschaft, WPF erstellt automatisch den entsprechenden decoder.Sehr einfache Lösung: