2016-12-13 1 views
-1

Ich habe so viele verschiedene Möglichkeiten versucht, dies zu tun, und es sagt mir immer noch, die Datei wird verwendet, wenn ich versuche, es zu löschen, bevor Sie es erneut speichern.kann Datei nicht speichern, weil sie verwendet wird

if (Clipboard.GetDataObject().GetData(DataFormats.Bitmap) != null) 
{ 
    if (File.Exists(filename)) { File.Delete(filename); } 
    using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite)) 
    { 
     ImageConverter converter = new ImageConverter(); 
     byte[] bytes = (byte[])converter.ConvertTo(Clipboard.GetDataObject().GetData(DataFormats.Bitmap), typeof(byte[])); 
     fs.Write(bytes, 0, bytes.Length); 
     fs.Close(); 
     fs.Dispose(); 
    } 
} 

Wie Sie sehen können, habe ich alles in einem "using" -Block. Ich "schließe" auch die Datei und versuchte sogar explizit, "dispose" aufzurufen. Aber wenn ich den Code erneut ausführe, sagt mir STILL, dass die Datei verwendet wird. Was kann ich tun, um die Datei überschreiben zu können?

Ich habe versucht, es auch so:

using (Bitmap bmp = new Bitmap((Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap))) 
{ 
    if (bmp != null) 
    { 
     if (File.Exists(filename)) { File.Delete(filename); } 
     using (MemoryStream memory = new MemoryStream()) 
     { 
      using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite)) 
      { 
       bmp.Save(memory, ImageFormat.Bmp); 
       byte[] bytes = memory.ToArray(); 
       fs.Write(bytes, 0, bytes.Length); 
       fs.Close(); 
      } 
      memory.Dispose(); 
     } 
     bmp.Dispose(); 
     break; 
    } 
} 

und es gibt mir immer noch den gleichen Fehler.

+0

Haben Sie dies später hinzugefügt, nachdem Sie versucht haben, Ihr Programm zu schließen, ohne den Stream zu löschen? Es ist möglich, dass der alte Stream um Ihren Computer "herumschwebt" und die Datei blockiert. Sie können ihn jetzt nicht mehr schließen, weil Sie keinen Zugriff darauf haben. Sie könnten versuchen, Ihren Computer neu zu starten, dann sollte dieses Problem gelöst werden (wenn dies das Problem ist). – Lehue

+0

Es könnte andere Möglichkeiten geben, einen verlorenen Filestream zu töten, aber ich kenne keine (ehrlich gesagt habe ich auch nie danach gesucht). – Lehue

+0

Es gibt wahrscheinlich einen Grund dafür. Gibt es noch etwas, das die von Ihnen erstellte Datei/den erstellten Dateipfad nutzt? Vielleicht wird der Dateipfad an etwas zurückgegeben, das etwas damit macht und es sperrt oder einen Stream nicht bereinigt? Höchstwahrscheinlich ist es nicht in dem Code, den Sie uns gezeigt haben, soweit es einen Verwendungsblock um Ihren FileStream gibt. Ich wette, wenn Sie dies in eine Schleife setzen würde es auch gelingen (vorausgesetzt, die Datei ist nicht gesperrt, wenn Sie eingeben). – Igor

Antwort

0

Wenn die Datei bereits gesperrt ist, bevor Ihr Programm ausgeführt wird, können Sie sie nicht öffnen. Sehen Sie, ob Sie es mit einem Programm wie Unlocker entsperren können. Sobald die Datei entsperrt ist, sollten Sie sie wieder öffnen können.

Wenn Sie die Dateiströme in eine using{}-Anweisung umbrechen, sind die Aufrufe close(); und dispose(); nicht erforderlich. Sie sind für Sie erledigt, da der Code die using{} Anweisung verlässt. Es tut nicht weh, close(); anzurufen, aber es ist überflüssig. Wenn Sie jedoch dispose(); anrufen und das Ende der Verwendung dispose(); auch aufrufen, erhalten Sie wahrscheinlich eine Ausnahme, weil Sie dispose(); für ein Objekt aufrufen. Entfernen Sie Ihre Anrufe zu close(); und dispose();

Wenn Sie ‚Prozess beenden‘ auf dem Programm über den Task-Manager (mangler) oder klicken Sie auf die Schaltfläche ‚Stop‘ in Ihrem IDE, während das Programm wurde im using{} Block Looping, wird es sperren die Datei erneut und Sie müssen wieder "Unlocker" verwenden.

So entfernen Sie Ihre close() und dispose() Anrufe und verwenden Sie dann "Unlocker", um die Datei zu entsperren. Führen Sie Ihr Programm, und Sie sollten golden sein ...

UPDATE:

Setzen Sie einen try/catch-Block um den folgenden Code:

 bmp.Save(memory, ImageFormat.Bmp); 
     byte[] bytes = memory.ToArray(); 
     fs.Write(bytes, 0, bytes.Length); 

Sehen Sie, wenn Sie jemals eine Ausnahme in der oben erhalten Stück Code. Wenn Sie versuchen, es zu fangen, könnte es darauf hinweisen, warum das Problem auftritt.

+0

Die Datei existiert nicht einmal, bevor ich mein Programm ausführe, ich erstelle es. Ich verstehe, dass das "Benutzen" all das für mich tut, ich habe nur diese für absolute Sicherheit hinzugefügt und weil ich meinen Kopf gegen die Wand hämmere und versuche herauszufinden, warum das nicht so funktioniert, wie es sollte. Ich bekomme von diesen zusätzlichen Anrufen keinen Fehler. Aber ich habe sie entfernt, und ich bekomme immer noch den gleichen Fehler beim zweiten Versuch. –

+0

Bitte sehen Sie meine Updates oben. Vielleicht könnte ein Versuch/Fangen die Lösung aufklären. – Curtis

Verwandte Themen