2016-11-21 31 views
0

C#의 FileSystemWatcher에 문제가 있습니다. 다른 프로그램에서 사용하는 파일을 봅니다. 이것은 문제가되지 않습니다. 문제는 파일과 함께 변경되는 유일한 값이 크기라는 것입니다. 다른 프로그램은 변경 사항을 수정하거나 날짜를 쓰지 않고 파일을 쓰고 있습니다. 크기 값은 (창 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

윈도우 익스플로러에서 크기를 볼 수 있으며 다른 프로그램이 그것을 wrting하고 있다고 확신합니다. 나는 FileInfo 객체가 없다. 내 응용 프로그램은 변경시이 파일을 읽는 것입니다 (변경 날짜가 업데이트되지 않기 때문에 크기가 변경됨). FileStream FileShare.ReadWrite를 사용하면 가능합니다. 이렇게하면 다른 프로그램에서 사용하는 파일을 읽을 수 있습니다. 유일한 문제는 크기 정보 (탐색기에서 업데이트하는 유일한 값)가 Windows 탐색기 없이는 업데이트되지 않는다는 것입니다. 주기적으로 트리거해야하는 것 같습니다. 그러나 나는 단지 파일 변경 이벤트에만 순환 (폴링)을 원하지 않는다. – Dominik

답변

0

아마도 다음과 같이하면 문제를 해결하고 폴링을 피할 수 있습니다. C#을에서하지만, 그 라인을 따라 적용 할 때 약간 다를 수 있습니다

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

:처럼 뭔가 루트 \ cimv2를에게 네임 스페이스를 쿼리, WMI를 사용해보십시오. WMI와 관련하여 .NET에서 WMI 수신기를 초기화하는 방법에 대한 자습서가 많이 있습니다. 주변을 검색하십시오.