2 Stimmen

Dateien im Flug ignorieren

Wenn ich den unten stehenden Code ausführe, füllt er mein Array mit einer Liste von Dateien im angegebenen Verzeichnis.

Das ist gut.

Es werden jedoch auch Dateien erfasst, die sich "im Umlauf" befinden, d. h. Dateien, die gerade in dieses Verzeichnis kopiert werden.

Das ist schlecht.

Wie kann ich diese "in-flight"-Dateien ignorieren? Gibt es eine Möglichkeit, jede Datei zu überprüfen, um sicherzustellen, dass sie vollständig vorhanden ist, bevor ich sie bearbeite?

string[] files = Directory.GetFiles(ConfigurationSettings.AppSettings.Get("sourcePath"));
        if (files.Length > 0)
        {

            foreach (string filename in files)
            {
                string filenameonly = Path.GetFileName(filename);
                AMPFileEntity afe = new AMPFileEntity(filenameonly);
                afe.processFile();
            }

        }

5voto

JaredPar Punkte 699699

Leider gibt es keine Möglichkeit, das zu erreichen, was Sie sich wünschen. Roberts Vorschlag, die Datei zum Schreiben zu öffnen, löst zwar einen Teil des Problems, nicht aber das größere Problem, nämlich

Das Dateisystem wird am besten als ein Multi-Thread-Objekt betrachtet, über das Sie keine Synchronisationsmöglichkeiten haben

Egal, welches Synchronisationskonstrukt Sie verwenden, um das Dateisystem in einen "bekannten Zustand" zu versetzen, es gibt einen Weg für den Benutzer, es zu überlisten.

Der beste Weg, dieses Problem anzugehen, besteht darin, die Dateien normal zu verarbeiten und die Ausnahmen abzufangen, die sich aus der Verwendung von Dateien ergeben, die "im Umlauf" sind. Dies ist der einzige vernünftige Weg, mit dem Dateisystem umzugehen.

4voto

Robert Venables Punkte 5903

Ja, Sie können versuchen, die Datei zum Schreiben zu öffnen. Wenn Sie die Datei zum Schreiben öffnen können, ohne dass eine Ausnahme auftritt, ist sie wahrscheinlich nicht mehr "in-flight". Leider bin ich schon mehrmals auf dieses Problem gestoßen und habe noch keine bessere Lösung gefunden.

1voto

Justin R. Punkte 22615
  1. Liefert eine Liste der Dateien im Verzeichnis.
  2. Holen Sie sich eine Liste der offenen Handles (siehe unten).
  3. Entfernen Sie letzteres von ersterem.

Sie können eine Liste der offenen Handles durch p/invoking NtQuerySystemInformation erhalten. Es gibt ein Projekt auf CodeProject die zeigt, wie man das macht. Alternativ können Sie auch Handle.exe von Sysinternals, und analysieren Sie dessen Ausgabe.

0voto

Carra Punkte 17220

Versuchen Sie, die Datei umzubenennen/zu verschieben. Wenn Sie sie umbenennen können, ist sie nicht mehr in Gebrauch.

0voto

Powerlord Punkte 84404

Die Antwort von Carra hat mich auf eine Idee gebracht.

Wenn Sie Zugriff auf das Programm haben, das die Dateien in dieses Verzeichnis kopiert, ändern Sie es so, dass es:

  1. Schreibt Dateien in ein temporäres Verzeichnis auf derselben Festplatte.
  2. Verschieben Sie die Dateien in den entsprechenden Ordner, nachdem sie auf die Festplatte geschrieben worden sind.

Auf demselben Dateisystem werden bei einem Verschiebevorgang lediglich die Verzeichniseinträge aktualisiert und nicht der physische Speicherort der Datei auf der Festplatte geändert. Das bedeutet, dass der Vorgang extrem schnell ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X