2016-11-21 40 views
0

我在C#中的FileSystemWatcher問題。 我看了另一個程序使用的文件。 這不是問題。問題在於,文件更改的唯一值是大小。另一個程序正在寫入文件而不更新更改或寫入日期。 只有當(Windows 7)資源管理器刷新(F5,或單擊文件)時,大小值纔會更新。C#FileSystemWatcher文件大小隻是與Windows資源管理器更新

FileSystemWatcher fileWatcher = new FileSystemWatcher(); 
fileWatcher.Changed += new FileSystemEventHandler(fileWatcher_Changed); 
fileWatcher.Path = Path.GetDirectoryName(path); // get directory of file path. 
fileWatcher.Filter = Path.GetFileName(path); // only this file 
fileWatcher.NotifyFilter = NotifyFilter.Size; // and maybe other 
fileWatcher.EnableRaisingEvents = true; 

private void fileWatcher_Changed(object sender, FileSystemEventArgs e) 
{ 
    // ... 
} 

我猜這個問題只能通過輪詢解決。因爲應該觸發文件以刷新文件信息數據。 但我希望沒有投票的另一種解決方案。

關於我的申請: 正在讀取正在使用其他程序的文件。使用FileStream FileShare.ReadWrite可以獲取文件的文本。它工作正常。我想在文件更改時更新文本框(讀取文件)。但是在另一個程序訪問它時唯一值更新的是文件大小。但只有當瀏覽器刷新或我點擊文件時。這是這個問題的問題。如果問題無法解決,另一種方法是:全部x次更新文件內容(讀取文件)。 (輪詢)沒有文件觀察器。

+0

「並且只有在(Windows 7)瀏覽器刷新(F5或單擊文件)時,大小值纔會更新。」 - 你是否只是在刷新已打開的Windows資源管理器窗口時觸發'fileWatcher.Changed'事件,該窗口對於包含該文件的目錄是開放的? – Quantic

+0

是的,只有當Windows資源管理器打開並通過F5刷新或單擊該文件。我認爲,FileSystemWatcher只檢查prev。和實際值。並且默認情況下,大小值本身不會更新。也許它需要系統的很多資源。但只有當瀏覽器正在使用打開目錄時,或者通過F5刷新或單擊該文件。但大小在變化,我在文件屬性中看到它。 – Dominik

+0

我在Windows資源管理器中看到了大小,我確信其他程序正在寫它。我沒有FileInfo對象。我的應用程序用於在更改時讀取此文件(更改大小,因爲更改日期未更新)。 FileStream FileShare.ReadWrite是可能的。這使得讀取另一個程序使用的文件成爲可能。唯一的問題是,如果沒有Windows資源管理器,大小信息(在資源管理器中更新的唯一值)不會更新。看起來我必須循環觸發。但我不想要任何循環(輪詢),只是在文件更改事件。 – Dominik

回答

0

也許,下面將解決您的問題,並避免投票。嘗試使用WMI,查詢根\ CIMV2命名空間的東西,如:

select filesize from 'cim_datafile' where name='_your_path_'

可能會稍有不同,當從C#,但沿着這些線路的應用。關於WMI,有很多教程如何在.NET中初始化WMI監聽器。到處搜索。

相關問題