Schließen/Entsorgen auf FileStream -

Habe ich ein bisschen code in ein Produkt, das ich bin, zu unterstützen, dass die Dateien kopiert werden:

using(System.IO.FileStream sourceFS = new System.IO.FileStream(sourcePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read))
            {
                using(System.IO.FileStream targetFS = new System.IO.FileStream(targetPath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.Read))
                {
                    while((read = sourceFS.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        targetFS.Write(buffer, 0, read);
                    }

                    targetFS.Flush();
                    targetFS.Close();
                }

                sourceFS.Close();
            }

Leider, die Benutzer berichten von einer Ausnahme, die uns darüber informiert, dass die Ziel-Datei ist in Verwendung durch einen anderen Prozess. Ich habe gefragt, ob es eine chance, dass jemand die Datei geöffnet hat (es ist eine Excel-Datei) - offenbar nicht...

So, ich habe die thinking cap auf... Ist es möglich, verlassen wir die Ziel-Datei mit der Datei lock gegen ihn? Nur so kann ich sehen, für targetFS nicht geschlossen werden, wäre beides erfordern:

  1. Eine Ausnahme geworfen werden, die in der innersten using-Blocks, und
  2. Die Dispose-Methode nicht, um tatsächlich den stream schließen.

Klang unwahrscheinlich für mich, aber immer neugierig ich verwendet dotPeek von JetBrains zu zerlegen, die Dispose-Methode der FileStream-Klasse - das scheint nicht alles zu tun, wirklich viel - ich vermute, seine "Nähe" Verhalten wird bereitgestellt, indem du den Griff...

In Wirklichkeit aber - die Frage ist - kann jeder spot, wie dies möglicherweise verlassen eine Datei mit einer Sperre gegen ihn?

  • Performance-Tipp: nicht bündig oder zu schließen ausdrücklich. Weder von Ihnen etwas gutes tun, und Spülen schadet.
  • Sie nicht brauchen, die flush()/close() Teile mit. Auch die beiden using-Anweisungen sind in Ordnung, sollten Sie sich für das problem woanders.
  • Sie sagen, dass der ctor der Ziel-FileStream-löst eine Ausnahme aus. Zur gleichen Zeit, die Sie sagen, dass Sie vielleicht verlassen haben, die destination zu öffnen. Aber wie könnte Sie verlassen haben, es zu öffnen, wenn Sie noch nie öffnete Sie erfolgreich? Schauen Sie anderswo. Dieser code ist in Ordnung.
  • warum ist die Ziel-Datei hat FileShare.Read?
  • Warum nutzen Sie nicht die Datei.Copy()? FileCopy(sourcePath, targetPath, true);
  • In Ihrer Anwendung oder in einer anderen Anwendung, wenn Sie die Verwendung von OLE-und COM-Zugriff auf Excel, und wenn Sie nicht richtig kümmern sich um die Zerstörung von Excel-Objekten am Ende bekommen Sie Prozesse hängen um speziell im Fall von abnormal endet. Dies könnte die Ursache Ihres Problems.
  • Vielen Dank für Ihre Eingabe jeder..., warum hat der code Fileshare.Lesen, ich weiß es nicht - ich habe es nicht geschrieben...
  • Diese Art von Problemen, besonders wenn Sie sind vergänglich und schwer zu reproduzieren, sind oft verbunden mit schlecht geschriebenen virus-checkers. Einige Antivirenprogramme sind sehr aggressiv zu bemerken, dass eine Datei vor kurzem benutzt und dann sperren Sie es und Scannen Sie es so bald wie möglich. Dies ist eine rude Sache zu tun, als eine Datei, die kürzlich verwendet wurden, ist wahrscheinlich zu sein verwendet wieder bald; ein höflicher checker, legen Sie die Datei auf eine Liste für die Verarbeitung von, sagen wir, eine Milliarde Nanosekunden in die Zukunft, wenn es wahrscheinlich ist, dass die legitimen Eigentümer sind alle hands-off der Datei.
  • Danke an alle... Am Ende des Tages, das eigentliche Problem stellte sich heraus, dass einige muppet in einer obskuren Abteilung, der hatte die Datei öffnen - für Wochen!

InformationsquelleAutor Martin Milan | 2013-12-31
Schreibe einen Kommentar