2010-11-20 13 views
3

FileSystemWatcher로 파일 및 폴더가 변경된 것을 이미 보았습니다.C# 파일/폴더 모니터

제 문제는 파일과 폴더간에 차이를 만들 수 없다는 것입니다. 파일과 폴더의 경로 이름이 같을 수 있습니다.

delete 이벤트의 경우 File/Exists (path) 또는 Directory.Exists (path) 테스트와 함께 더러운 workarround를 사용할 수 없습니다. 메서드가 호출 될 때 파일/폴더가 이미 삭제되었으므로 삭제할 수 있습니다.

어쩌면이 객체는 내가 필요로하는 정보를 가지고 있지만 나는 그것을 발견하지 않았다 : 만 변경된 항목이 파일 또는 폴더 인 경우 알고 싶어

FileSystemEventArgs e 

.

답변

1

나는 깨끗한 해결책을 찾았습니다 항상 작동합니다 :

watcher의 표준 설정은 파일 및 폴더 용입니다. 변경된 객체가 어떤 유형인지 알 수 없기 때문에 이것은 내 눈에는 의미가 없습니다.

두 개의 파일 탐색기를 만들 수 있습니다. 하나는 파일 용이고 다른 하나는 폴더 용입니다. 그런 다음 기본 설정을 다음과 같이 변경하면됩니다.

// for file 
fileSysWatchFile.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite; 
// for folder 
fileSysWatchDir.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.LastWrite; 
+0

유일한 문제는 FSW가 ThreadPool을 사용한다는 것입니다. 따라서 다중 관찰자를 사용하는 경우 처리 할 이벤트의 순서가 반영되지 않을 수 있습니다 현실. 지금까지 발견 한 유일한 해결책은 ho1에서 언급 한 Change Journals를 사용하거나 [this] (http://qualapps.blogspot.cz/2010/05/understanding-readdirectorychangesw.html)을 사용하여 직접 FileSystemWatcher를 작성하는 것입니다.) 및 [this] (http://qualapps.blogspot.cz/2010/05/understanding-readdirectorychangesw_19.html)를 참조하십시오.그냥 미래에이 스레드를 통해 올 사람을 위해 그것을 밖으로 던지고. – Paya

1

당신은 그것이 디렉토리attribute이 있는지 여부를 테스트 할 수있다 : 물론

var attributes = File.GetAttributes(@"c:\somepath"); 
if ((attributes & FileAttributes.Directory) == FileAttributes.Directory) 
{ 
    // it's a directory 
} 
else 
{ 
    // it's a file 
} 

이미이 작동하지 않습니다 당신이 유형을 알 수 없습니다 삭제 된 경우입니다.

+0

OP에서 파일/디렉토리가 삭제 된 위치를 강조 표시 할 수 있는지 확인 하시겠습니까? –

+0

아니요, 이미 삭제 된 경우에는 작동하지 않습니다. –

+0

디렉토리/파일이 이미 삭제 된 경우 실패합니다. – jason

0

삭제 된 항목의 마지막 유형을 조회 할 수있는 경로 -> 유형 매핑 목록이 없으면 삭제 된 항목의 유형을 검색 할 수 없습니다.

+0

??? ... 그래서 파일 = C : \ 이름 및 폴더 = C : \ 이름이 있으면 변경된 찾을 수 없습니다? – fpdragon

+1

같은 폴더에 같은 이름의 파일과 디렉토리를 둘 수 없습니다. – ThiefMaster

+0

어쨌든 이미 삭제 된 경우에도 파일 또는 디렉토리인지 알 수 없습니다. – fpdragon

2

NTFS 볼륨에 있다고 가정하면 Change Journals을보고 필요한 것을 할 수 있다고 생각합니다. 특히 FSCTL_READ_USN_JOURNAL 제어 코드는 USN_RECORDFileAttributes을보고 FILE_ATTRIBUTE_DIRECTORY인지 확인합니다.

당신은 여기에 샘플을 찾을 수 있습니다 (C++에, 그러나 아마도 어쩌면 그냥 작은 C의 앱에서 전화 ++ DLL을 쓰기 C# 또는 기타로 번역 할 수있다)

는 : Walking a Buffer of Change Journal Records