Ich habe eine App, die auf die * .log-Datei in einem ausgewählten Ordner wartet. Ich habe FileSystemWatcher
verwendet.Warten bis File.Exists?
Aber es gibt ein Problem. Die andere App verantwortlich für diese Datei zu machen nimmt wie folgt:
- Make a * .gz Datei
- es in txt-Datei Entpacken (einige zufällige Dateiname)
- Ändern der * .txt-Namen richtige ist mit * .log Erweiterung.
Und ich kann dieses Verhalten nicht ändern.
Also habe ich 2 FileSystemWatcher
s für *. GZ und *. TXT-Dateien. Warum? Weil diese App manchmal die gz-Datei nicht entpackt und manchmal die txt-Datei nicht in die endgültige * .log-Datei umbenennt.
FileSystemWatcher2
fängt txt-Datei, dann (in den meisten Fällen ist es umbenannt, um die nächsten 1000ms einzuloggen) Ich muss einige Zeit warten, um zu überprüfen, ob TXT-Datei existiert (wenn nicht, scheint es in das endgültige umbenannt zu werden * .Logdatei).
Die Frage ist, wie überprüft werden kann, ob die Datei ohne Thread.Sleep()
existiert, um das Einfrieren der Benutzeroberfläche zu verhindern?
Ich hoffe, es ist klar, wenn nicht, werde ich versuchen, es besser zu beschreiben. Ich denke, das ist ein komplexes Problem.
Einige Codebeispiel:
Watcher für gz-Datei:
private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
//this is for gz files in case if gz file is not unpacked automatically by other app
//I need to wait and check if gz was unpacked, if not, unpack it by myself,
//then txt watcher will catch that
Thread.Sleep(5000);
if (File.Exists(e.FullPath))
{
try
{
byte[] dataBuffer = new byte[4096];
using (System.IO.Stream fs = new FileStream(e.FullPath,
FileMode.Open,
FileAccess.Read))
{
using (GZipInputStream gzipStream = new GZipInputStream(fs))
{
string fnOut = Path.Combine(path_to_watcher,
Path.GetFileNameWithoutExtension(e.FullPath));
using (FileStream fsOut = File.Create(fnOut))
{
StreamUtils.Copy(gzipStream, fsOut, dataBuffer);
}
}
}
}
catch { //Ignore }
}
}
Watcher für txt-Datei:
private void fileSystemWatcher2_Created(object sender, FileSystemEventArgs e)
{
//this is for txt file
Thread.Sleep(3500);
if (File.Exists(e.FullPath))
{
//make my actions
}
else
{
//make my actions
}
}
Alle 'Thread.Sleep()' tut, ist Relinquish den Faden lassen Sie die Computer-Ressourcen sie verwenden, so dass sie für andere Aufgaben verwendet werden können.Es ist nicht ideal für einige Szenarien (weil es eine minimale Granularität von 1 ms hat), aber für das, was Sie erreichen möchten, könnte es gut funktionieren. –
@RobertHarvey Haben Sie Unterlagen dafür? Aus meiner Erfahrung beendet Thread.Sleep einen Thread von der Verarbeitung weiterer Anweisungen, bis die Zeit abgelaufen ist. Von MSDN: 'Der Thread wird vom Betriebssystem für die angegebene Zeit nicht zur Ausführung geplant. – CodingGorilla
@CodingGorilla: Ja, das stimmt. Es blockiert und gibt die Ressourcen frei, die der Thread für andere Aufgaben bereithält. Es sagt im Grunde: "Ich mache nichts für die nächsten n Millisekunden, also könnt ihr während dieser Zeit etwas anderes machen." –