我有一個應用程序,在選定的文件夾中偵聽* .log文件。我用FileSystemWatcher
。如何等待File.Exists?
但有一個問題。負責制定該文件的其他應用程序需要以下步驟:
- 撥打*。廣州文件
- 它解壓縮到txt文件(一些隨機的文件名)
- 更改* .TXT名稱適當的一個帶* .log擴展名。
而且我無法改變這種行爲。
所以我製作了2 FileSystemWatcher
s用於* .gz和* .txt文件。爲什麼?因爲這個應用程序有時不會解壓縮gz文件,有時不會將txt文件重命名爲最終的* .log文件。
FileSystemWatcher2
捕獲txt文件,然後(在大多數情況下它被重命名爲登錄下一個1000ms)我需要等待一段時間來檢查txt文件是否存在(如果沒有,它似乎被重命名爲最終* .log文件)。
問題是,如何檢查文件是否存在沒有Thread.Sleep()
以防止UI凍結?
我希望很明顯,如果不是,我會盡力描述它。我認爲這是一個複雜的問題。
一些代碼示例:
看守的GZ文件:
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 }
}
}
看守的txt文件:
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
}
}
所有'Thread.sleep代碼()'確實是放棄線程釋放它正在使用,使它們可用於其他任務的計算機資源。對於某些場景(因爲它具有1 ms的最小粒度),但對於您要實現的內容而言,它並不理想,因此它可能工作得很好。 – 2013-02-11 16:33:47
@RobertHarvey你有這方面的一些文件?根據我的經驗,Thread.Sleep會阻止線程處理任何進一步的指令,直到時間過去。來自MSDN:'該線程不會被計劃在指定的時間內被操作系統執行。「# – CodingGorilla 2013-02-11 16:36:02
@CodingGorilla:是的,沒錯。它阻塞並釋放線程爲其他任務持有的資源。它基本上是說「我在接下來的n毫秒內沒有做任何事情,所以你可以在那段時間去做別的事情。」 – 2013-02-11 16:38:38