webentwicklung-frage-antwort-db.com.de

"Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird" mit Images

Ich habe viele Probleme wie diese gesehen, die gelöst wurden, und das Problem lag meistens daran, dass Streams nicht ordnungsgemäß beseitigt wurden.

Mein Problem ist etwas anders, hier folgt ein Code-Snippet

 foreach (Images item in ListOfImages)
 {
      newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
      File.Create(newPath);

      File.WriteAllBytes(newPath, item.File);
 }

Dabei ist Images eine benutzerdefinierte Struktur und item.File die Rohdaten, Byte [].

Mein Problem ist, dass in der Zeile, in der WriteAllBytes aufgerufen wird, eine Ausnahme ausgelöst wird. Die Nachricht lautet:

The process cannot access the file because it is being used by another process

Wieder habe ich keine Ahnung, wie ich den Prozess irgendwie close gehen soll.

9
Scriptworks

Da File.Create den Stream zurückgibt, würde ich ihn ordnungsgemäß entsorgen:

using(var stream = File.Create(newPath)){}
File.WriteAllBytes(newPath, item.File);

oder Sie können den Stream verwenden, um direkt in die Datei zu schreiben:

using (FileStream fs = File.Create(newPath))
{
    fs.Write(item.File, 0, item.File.Length);
}

oder, am einfachsten, verwenden Sie File.WriteAllBytes alleine:

File.WriteAllBytes(newPath, item.File);

Erstellt eine neue Datei, schreibt das angegebene Byte-Array in die Datei und Schließt die Datei. Wenn die Zieldatei bereits vorhanden ist, wird Überschrieben.

21
Rango

Sie geben an, dass Ihr Problem nichts mit dem Entsorgen von Streams zu tun hat, sondern überprüfen Sie diesen MSDN-Artikel:

http://msdn.Microsoft.com/de-de/library/d62kzs03.aspx

Was gibt File.Create zurück? Ein FileStream !!!!

Und warum verwenden Sie am Ende des Tages File.Create, wenn File.WriteAllBytes eine Datei erstellt, falls diese nicht existiert? ;)

Erstellt eine neue Datei, schreibt das angegebene Byte-Array in die Datei und Schließt die Datei. Wenn die Zieldatei bereits vorhanden ist, wird Überschrieben.

Überprüfen Sie auch auf MSDN: http://msdn.Microsoft.com/de-de/library/system.io.file.writeallbytes.aspx

4

Die create-Methode öffnet die Datei zum Schreiben und gibt ein FileStream-Objekt zurück, mit dem Sie arbeiten können. Nur weil Sie nicht darauf verweisen bedeutet nicht bedeutet, dass es nicht zurückgegeben werden muss.

foreach (Images item in ListOfImages)
                {
                    newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
                    FileStream f = File.Create(newPath);

                    f.Write(item.File, 0, item.File.Length);
                }
using (FileStream fs = 
new FileStream(filePath,
    FileMode.Open, FileAccess.Read, FileShare.ReadWrite))

Ihr Protokoll ist möglicherweise schreibgeschützt. Versuchen Sie es daher mit FileShare.ReadWrite.

1
Ashwin Patil

Dies ist der spezifischste Weg, um das zu erreichen, was Sie versuchen:

foreach (Images item in ListOfImages)
{
    using (System.IO.FileStream output = new System.IO.FileStream(Path.Combine(newPath, item.ImageName + item.ImageExtension),
        System.IO.FileMode.Create, System.IO.FileAccess.Write))
    {
        output.Write(item.File, 0, item.File.Length);
        output.Flush();
        output.Close();
    }
}

Sie müssen auch Ihre Logik korrigieren, um den Pfad zu erstellen, wie ich es in meinem obigen Beispiel getan habe. Sie verketteten den neuen Pfad immer und immer wieder.

0

Der File.WriteAllBytes erstellt bei Bedarf die Datei. Sie können Juts verwenden:

foreach (Images item in ListOfImages)
{
    newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
    File.WriteAllBytes(newPath, item.File);
}

Und kombinierst du den Pfad richtig?

0
Hamlet Hakobyan