2014-09-23 9 views
2

다른 사람들과 마찬가지로 파일 시스템 워처에서 "C : \ 디렉토리에 한 번에 너무 많은 변경 오류가 발생합니다. 이제 그것이 c : \라면 많은 변화가 있음이 분명합니다. 하지만이 특별한 경우에 나는 다음과 같은 매개 변수를 설정Filesystemwatcher가 "C : 디렉토리에서 한 번에 너무 많은 변경 사항을 일으켰습니다."

Path = C:\ 
Filter = "test1.txt" 
NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName 
IncludeSubdirectories = true 

나는 감시자를 시작하고 난 PC를 고정하고 나중에 갑자기 오류가 있었을 때 다시 짧은 온 후 4 시간 동안 문제없이 실행할 수 있습니다.

이제이 경우 오류의 원인이 될 수 있습니다. 여기서 중요한 것을 간과하고 있습니까? 또는 includeubdirectories 매개 변수를 사용하면 c : \의 모든 하위 디렉토리를 검사하고 C : \에있는 단일 파일의 필터를 무시할 수 있습니까?

+0

필자는 Filter가 무시되지 않는다고 확신하지만, 점진적으로 작동합니다. 즉,'C :'와 모든'Subdirectories'를보고'test1.txt'라는 이름의 파일을 모니터 할 것을 의미합니다. – DrCopyPaste

+0

왜 오류는 몇 시간 후에 발생하며 즉시 발생하지는 않습니까? (즉시 감시자가 너무 많은 하위 디렉토리가 있기 때문에 즉시 얻을 수있다.) – Thomas

+1

Windows 업데이트만으로도 응용 프로그램을 종료 할 수 있습니다. * 모든것 *, 심지어 운영 체제 디렉토리를 보는 것은 당연히 좋은 생각이 아닙니다. –

답변

1

변경 사항에 대해 버퍼를 늘릴 수 있습니다. 이것이 한 번 도움이되었습니다.

그러나 C에서 모든 변화를보고하는 것은 : 하위 디렉토리에 \ 것은 어쩌면 부하를 많이 .. 발생할 수

MSDN FileSystemWatcher.InternalBufferSize Property

편집 :

필터 만 올리는에서 확인됩니다 - 방법 - 내부적으로 모든 변화가 수업에서 인식됩니다. - 같이 "this.MatchPattern (이름)": 메인 모금 방법을 볼 수 나는 프레임 워크 코드 에보고했다

.....

private void NotifyFileSystemEventArgs(int action, string name) 
    { 
     if (this.MatchPattern(name)) 
     { 
      switch (action) 
      { 
       case 1: 
        this.OnCreated(new FileSystemEventArgs(WatcherChangeTypes.Created, this.directory, name)); 
        return; 

       case 2: 
        this.OnDeleted(new FileSystemEventArgs(WatcherChangeTypes.Deleted, this.directory, name)); 
        return; 

       case 3: 
        this.OnChanged(new FileSystemEventArgs(WatcherChangeTypes.Changed, this.directory, name)); 
        return; 
      } 
     } 
    } 

이 방법을 사용하고 있습니다 이 :

private bool MatchPattern(string relativePath) 
    { 
     string fileName = System.IO.Path.GetFileName(relativePath); 
     return ((fileName != null) && PatternMatcher.StrictMatchPattern(this.filter.ToUpper(CultureInfo.InvariantCulture), fileName.ToUpper(CultureInfo.InvariantCulture))); 
    } 

당신이 볼 수 있듯이 - 필터가 여기에 확인받을 - 멀리 후반에 부하 ... 을 억제 가지고 ... 그래서 유일한 방법은 버퍼 크기를 증가시키는 것입니다!

+0

변경 사항은 주요 사항이라고 생각합니다. 지정된대로 (그리고 주석을 통해 지워짐) 하위 디렉토리를 검색하여 ..... 몇 시간 동안 어떤 방식 으로든 수정되지 않은 특정 .txt에 대한 결과를 필터링 한 다음 오류가 발생합니다. 따라서 문제는 실제로 필터가 하나의 파일 만 선택한다는 것입니다. – Thomas

+0

@Thomas - 귀하의 권리 - i'v가 내 솔루션을 업데이트했습니다. – Cadburry

+0

Tnx 예를 들어 업데이트가 적용되고 적용된 필터가 너무 늦게 프레임 워크 (아야)에 적용 되었기 때문에 예외가 발생했습니다 – Thomas