2010-07-26 3 views
27

파일이나 디렉토리가 삭제 된 경우 FSW를 확인하는 방법이 있습니까?.NET filesystemwatcher - 파일이나 디렉토리였습니까?

+0

저는 솔직히 당신이 할 수 있을지 확신하지 못합니다. 확실한 해결 방법은 시작할 때 디렉토리 목록을 작성하기 위해 반복하는 것입니다. 그 목록에 없다면 그것은 파일이었습니다. –

+4

"C# FileSystemWatcher"가 아닙니다. .NET FileSystemWatcher입니다. C#뿐 아니라 모든 .NET 언어에서도 작동합니다. –

+1

두 개의 분리 된 FSW를 실행하여 동일한 디렉토리를 모니터링하고 'NotifyFiter' 값만 다른 경우 작동 할 수 있습니다. –

답변

0

FileSystemEventArgs.FullPath 속성을 조사하여 디렉토리인지 파일인지 알 수 있습니다.

if (Path.GetFileName(e.FullPath) == String.Empty) 
{ 
    //it's a directory. 
} 

파일 또는 디렉토리인지 확인하십시오.

namespace Watcher 
{ 
    class Program 
    { 
     private const string Directory = @"C:\Temp"; 
     private static FileSystemWatcher _fileWatcher; 
     private static FileSystemWatcher _dirWatcher; 

     static void Main(string[] args) 
     { 
      _fileWatcher = new FileSystemWatcher(Directory); 
      _fileWatcher.IncludeSubdirectories = true; 
      _fileWatcher.NotifyFilter = NotifyFilters.FileName; 
      _fileWatcher.EnableRaisingEvents = true; 
      _fileWatcher.Deleted += WatcherActivity; 

      _dirWatcher = new FileSystemWatcher(Directory); 
      _dirWatcher.IncludeSubdirectories = true; 
      _dirWatcher.NotifyFilter = NotifyFilters.DirectoryName; 
      _dirWatcher.EnableRaisingEvents = true; 
      _dirWatcher.Deleted += WatcherActivity; 

      Console.ReadLine(); 
     } 

     static void WatcherActivity(object sender, FileSystemEventArgs e) 
     { 
      if(sender == _dirWatcher) 
      { 
       Console.WriteLine("Directory:{0}",e.FullPath); 
      } 
      else 
      { 
       Console.WriteLine("File:{0}",e.FullPath); 
      } 
     } 
    } 
} 
+2

삭제되었으므로 이러한 호출이 실패합니다. –

+0

@Steven Sudit : 먼저 FileSystemEventArgs.ChangeType 속성을 확인해야합니다. –

+1

'File.GetAttributes'는 삭제 된 파일에 대해'FileNotFoundException'을 던집니다. –

33

여기 단순화 및 수정 플레처의 솔루션의 버전입니다. 그러나 파일과 동일한 경로에서 같은 이름의 디렉토리가있을 수 있다면

bool isDirectory = Path.GetExtension(e.FullPath) == string.Empty; 


if (e.ChangeType != WatcherChangeTypes.Deleted) 
{ 
    isDirectory = Directory.Exists(e.FullPath); 
} 
+2

+1입니다. 당신의 해결책은 훨씬 간단합니다. – fletcher

+0

나는 그 버그를 알아 냈습니다. 그러나 당신은 내가하기 전에 그 아이디어를 생각해 냈습니다. –

+1

이 해결책은 두 FileSystemWatcher가 분리 된 쓰레드에서 실행되고 있다는 것을 고려하지 않습니다. 따라서 감시 된 디렉토리에 많은 이벤트가있는 경우 앱에 표시되는 이벤트의 순서가 다를 수 있습니다. 즉. 파일이 아직 존재하지 않는 디렉토리에 작성되었다는 것을 기록한 후 해당 디렉토리를 작성하는 이벤트를 기록 할 수 있습니다. – Paya

1

나는 임시로 사용 초기에 "경로"기능,하지만 나중에 내가 Directory.Exists하여 수정 삭제하지 않는 경우 :

1

귀하의 질문은 의미가 삭제 경우가 해결되지 않습니다. 예 : 확장자가없는 파일 이름이나 확장자를 가진 디렉토리가있는 경우.

파일과 디렉토리가 존재하는지 여부에 관계없이 전체 경로 (bool iSDirectory = Path.GetExtension(e.FullPath).Equals("");)의 확장이 있는지 확인하기 만하면됩니다.이 방법은 주어진 경로를 구문 분석하기 때문에 파일에 아무런 관련이 없습니다.

내가 처음 언급 한 비 전통적인 문제를 처리해야한다면 디렉토리 또는 파일이 해당 위치에 존재하는지 확인하십시오. 두 경우 모두 삭제 된 것처럼 처리합니다. 그 중 하나가 존재하면, 다른 하나는 삭제 된 것으로 간주합니다.

귀하의 문의는 귀하가 파일과 디렉토리 목록을 어딘가에 보관한다는 것을 의미하므로 해당 목록을 확인하면 처리에 대한 결정을 내릴 수 있습니다.

나는이 접근법이 두 파일 시스템 관찰자를 사용하여 차이를 알려주는 해결책보다 낫다고 생각한다.

관련 문제