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.
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.
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
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.
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.
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?