2011-05-05 117 views
0

我有一個問題,閱讀的文本文件,這不是它的自我這是一個問題是,當我應該看它的讀數。問題與閱讀文本文件

我得到了一個服務器程序(由外部公司製作,所以我無法控制它),你可以在其中放置文件。服務器看到一個新文件已經到達讀取它並執行任務,然後他放入一個結果回來。所以我正在等待文件準備就緒,但我不能早點閱讀它,因爲我不知道它是否已經存在。所以我這樣做:

while (IsFileLocked(file)) 
{ 
    Thread.Sleep(25); 
} 

private bool IsFileLocked(FileInfo file) 
{ 
    FileStream stream = null; 

    try 
    { 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (IOException) 
    { 
     return true; 
    } 
    finally 
    { 
     if (stream != null) 
      stream.Close(); 
    } 

    //file is not locked 
    return false; 
} 

現在,這確實有助於檢查,如果該文件是可讀的,當我在讀我從來沒有得到任何的IOExceptions了。現在我開始閱讀,但有時我只是讀了一個空文件。我很確定它不應該是空的。這不是服務器程序的錯誤(我會在後面解釋)。

這裏就是問題開始代碼:

using (StreamReader streamReader = file.OpenText()) 
{ 
    while (!streamReader.EndOfStream) 
    { 
     // here starts the reading 
    } 
} 

但是,當我使用此代碼我不明白的問題:

using (StreamReader streamReader = file.OpenText()) 
{ 
    Thread.sleep(1000); 
    while (!streamReader.EndOfStream) 
    { 
     // here starts the reading 
    } 
} 

所以我的猜測是,該文件是空的當我可以打開它,但它沒有文字。 我改變了對的Thread.sleep 100毫秒,然後我再得到這個問題。當我將其更改爲500時,問題再次得到解決。

現在我的軟件需要在很多不同的計算機上運行,​​所以我不知道他們是多麼快,但我怕如果我設置定時器以低我可能會在其他計算機上的問題。但我不希望我的用戶等待那些信息太久。 正在等待唯一的選擇還是有另一種方式? 其他具有不同硬件配置的計算機是否會出現問題?

編輯:我試過了FileSystemWatcher的,這是不是解決辦法!

+0

你可以使用FileSystemWatcher的通知您,當一個文件已經到來。這樣你就知道它在那裏。您仍然需要檢查它是否可讀,因爲FileSystemWatcher在創建文件時會通知您,即在可讀之前可能需要幾秒鐘才能寫入文件。我已經實現了一個類似的解決方案,用於處理在一天中的不同時間將FTP傳輸到目錄的文件。 – tomasmcguinness 2011-05-05 14:07:30

+0

@tomasmcguinness文件創建的事件被觀察者扔在文件被創建時,但可能還不是可讀的。當文件完全寫入並且可用時,它將會拋出一個'文件改變'事件。此時該文件可用。 – 2011-05-05 14:35:28

+0

添加一個FileSystemWatcher沒有解決我的問題我剛剛再次遇到同樣的問題。即使使用watcherchangetypes,我仍然閱讀一個空文件。當我使用Thread.sleep()時,它會再次完美。所以它看起來像filesystemwatcher只不過是我的代碼的.NET實現。 – 2011-05-06 10:20:32

回答

0

您需要添加的工具是一個FileWatcher(見MSDN System.IO.FileWatcher)。這將允許您監視活動並添加事件處理程序來響應文件事件。您可以通過爲文件更改添加處理程序來響應文件。