PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .NET Verzeichnis verschieben


Monger
2008-05-16, 11:00:22
Ich hab ein blödes Problem, und vielleicht hat ja hier jemand einen zündenden Gedanken.

Ich hab einen Timer, der regelmäßig in einem bestimmten Ordner nachschaut, und überprüft ob dort Unterordner mit Dateien angelegt wurden. Wenn ja, verschiebt er diese an einen anderen Ort, und löscht das Original.

So. Was mache ich aber, wenn mein Timer ausgerechnet dann auf den Ordner schaut, wenn dort gerade ein Ordner angelegt wird? Kann ich irgendwie prüfen, ob innerhalb eines bestimmten Unterordners noch gerade irgendwelche Schreiboperationen anstehen?
Gibt es dafür in .NET irgendeine Möglichkeit?

Trap
2008-05-16, 11:06:21
Wo ist denn der Unterschied ob der Ordner während des Programmablaufs grade am erzeugt werden ist, oder ob er 1 Sekunden später erzeugt wird?

Warum willst du den ersten Fall behandeln, den zweiten aber nicht?

Iceman346
2008-05-16, 11:15:04
Du kannst mit
Directory.GetCreationTime(Verzeichnis)
die Erstellungszeit abfragen. Mit
DateAndTime.Now
Kriegst du das aktuelle Datum und die aktuelle Zeit geliefert.

Sicherer wärs aber so eine Abfrage auf Dateibasis zu machen, da ein Verzeichnis ja durchaus schon einige Zeit bestehen kann, während man große Dateien darin erstellt. Da kannst du
File.GetCreationTime(Datei)
nutzen.

Monger
2008-05-16, 11:17:11
Hab mich wohl undeutlich ausgedrückt.

Ein anderer Prozess (auf den ich übrigens keinerlei Einfluss habe, und von dem ich auch keinerlei Signalisierung bekomme) legt irgendwelche Dateien in einem bestimmten Ordner ab. Im Grunde sind das Crash Infos: jeder Crash kriegt ein eigenes Unterverzeichnis, und darin gibt es dann ein Sammelsurium an Reportdaten.

Nehmen wir also mal an, ein Crash passiert, und mein anderer Prozess fängt an, erstmal das Verzeichnis zu erstellen und darin dann eine Datei nach der anderen zu schreiben.

In Ermangelung besseren Wissens versuche ich halt, wenigstens in regelmäßigen Abständen nach solchen Verzeichnissen zu suchen. Nur: wenn mein anderer Prozess mit dem schreiben noch nicht fertig ist, kracht es spätestens beim anschließenden löschen natürlich.

Deshalb: gibt es eine Möglichkeit herauszufinden, ob in einem bestimmten Unterverzeichnis gerade irgendwas geschrieben wird?

Trap
2008-05-16, 11:29:37
Deshalb: gibt es eine Möglichkeit herauszufinden, ob in einem bestimmten Unterverzeichnis gerade irgendwas geschrieben wird?
Tests in parallelen Systemen bringen nur etwas wenn man auch Locks hat.

Der Test sagt nichts wird geschrieben, Kontrolle geht an anderen Thread, der Startet Schreibvorgang, Kontrolle geht an dein Programm, Fehler...

Monger
2008-05-16, 11:35:03
Wie gesagt, den Luxus hab ich leider nicht! :(
Ich kann in den anderen Prozess nichtmal reinschauen, geschweige denn auf die Threads locken.

Trap
2008-05-16, 11:37:13
Du musst zu allen Dateioperationen eine sinnvolle Fehlerbehandlung einbauen, eine andere Möglichkeit seh ich im Moment nicht.

Monger
2008-05-16, 11:44:47
Mir schwebt sowas in der Richtung vor, dass ich mir erstmal den Zugriff auf alle Dateien in diesem Verzeichnis sichere. Wenn das fehl schlägt (sprich: ein anderer Prozess hat ein Lock auf eine Datei), breche ich meine eigene Operation sofort ab, und versuche es halt beim nächsten mal wieder.

Nur: wie stelle ich denn fest, ob ich theoretisch auf eine Datei gerade Schreibrechte hätte?

Gast
2008-05-16, 12:19:39
Nur: wie stelle ich denn fest, ob ich theoretisch auf eine Datei gerade Schreibrechte hätte?



try
{
System.IO.StreamWriter writer = new System.IO.StreamWriter(file);
writer.Close();
}
catch (System.IO.IOException ex)
{
// ... Datei gelockt
}

SgtTynis
2008-05-19, 13:41:46
Folgendes hat sich in diesem Zusammenhang bewährt: man ermittelt in einem Thread ständig das Änderungsdatum der betroffenen Dateien und wartet dann noch ein bestimmtes Zeitfenster ab, um sicher zu gehen, dass keine weiteren Änderungen mehr stattfinden; falls doch, verschiebt man das Zeitfenster weiter nach hinten, merkt sich aber schon, das sich etwas "getan" hat, bis zum nächsten Threadzyklus. Ist das Zeitfenster abgelaufen, benennt man die Dateien zunächst lokal um, kopiert sie an den Zielort und entfernt dann die zuvor umbenannten Dateien - alternativ dürfte auch ein Move funktionieren. Der andere Prozess ist dann in der lage ungestört neu Dateien anzulegen ohne das man mit ihm ins Gehege kommt.
Noch ein Hinweis: der FileSystemWatcher ist zwar ein zunächst verlockend klingende Alternative, hat aber mit so einigen Nachteilen zu kämpfen: nur ein observierender Prozess möglich, Verwendung der Windows-Messagequeue mit allen daran verknüpften Nachteilen, Nichtfunktionieren bei einigen Netzwerkfreigaben.