我有一個問題,閱讀的文本文件,這不是它的自我這是一個問題是,當我應該看它的讀數。問題與閱讀文本文件
我得到了一個服務器程序(由外部公司製作,所以我無法控制它),你可以在其中放置文件。服務器看到一個新文件已經到達讀取它並執行任務,然後他放入一個結果回來。所以我正在等待文件準備就緒,但我不能早點閱讀它,因爲我不知道它是否已經存在。所以我這樣做:
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的,這是不是解決辦法!
你可以使用FileSystemWatcher的通知您,當一個文件已經到來。這樣你就知道它在那裏。您仍然需要檢查它是否可讀,因爲FileSystemWatcher在創建文件時會通知您,即在可讀之前可能需要幾秒鐘才能寫入文件。我已經實現了一個類似的解決方案,用於處理在一天中的不同時間將FTP傳輸到目錄的文件。 – tomasmcguinness 2011-05-05 14:07:30
@tomasmcguinness文件創建的事件被觀察者扔在文件被創建時,但可能還不是可讀的。當文件完全寫入並且可用時,它將會拋出一個'文件改變'事件。此時該文件可用。 – 2011-05-05 14:35:28
添加一個FileSystemWatcher沒有解決我的問題我剛剛再次遇到同樣的問題。即使使用watcherchangetypes,我仍然閱讀一個空文件。當我使用Thread.sleep()時,它會再次完美。所以它看起來像filesystemwatcher只不過是我的代碼的.NET實現。 – 2011-05-06 10:20:32