Programing

여러 파일 형식에 대해 FileSystemWatcher에 대한 필터를 설정하는 방법은 무엇입니까?

lottogame 2020. 12. 3. 07:23
반응형

여러 파일 형식에 대해 FileSystemWatcher에 대한 필터를 설정하는 방법은 무엇입니까?


어디에서나 제공된 샘플에서 파일 시스템 감시자에 대한 필터를 설정하는 데 사용되는이 두 줄의 코드를 찾을 수 있습니다.

FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Filter = "*.txt";
//or
watcher.Filter = "*.*";

하지만 내 감시자가 더 많은 파일 유형을 모니터링하기를 원하지만 전부는 아닙니다. 어떻게 할 수 있습니까?

//watcher.Filter = "*.txt" | "*.doc" | "*.docx" | "*.xls" | "*.xlsx";

나는 이것을 시도했다 :

 watcher.Filter = "*.txt|*.doc|*.docx|*.xls|*.xlsx"; 
 // and
 watcher.Filter = "*.txt;*.doc;*.docx;*.xls;*.xlsx*";

둘 다 작동하지 않았습니다. 이것은 단지 기본이지만 나는 그것을 놓친다. 감사..


해결 방법이 있습니다.

아이디어는 모든 확장을 감시 한 다음 OnChange 이벤트에서 원하는 확장으로 필터링하는 것입니다.

FileSystemWatcher objWatcher = new FileSystemWatcher(); 
objWatcher.Filter = "*.*"; 
objWatcher.Changed += new FileSystemEventHandler(OnChanged); 

private static void OnChanged(object source, FileSystemEventArgs e) 
{ 
    // get the file's extension 
    string strFileExt = getFileExt(e.FullPath); 

    // filter file types 
    if (Regex.IsMatch(strFileExt, @"\.txt)|\.doc", RegexOptions.IgnoreCase)) 
    { 
        Console.WriteLine("watched file type changed."); 
    } 
} 

당신은 그렇게 할 수 없습니다. Filter속성은 한 번에 하나 개의 필터를 지원합니다. 로부터 문서 :

*.txt|*.doc지원되지 않는 과 같은 다중 필터 사용 .

FileSystemWatcher각 파일 형식에 대해을 만들어야합니다 . 그런 다음 모두 동일한 세트에 바인딩 할 수 있습니다 FileSystemEventHandler.

string[] filters = { "*.txt", "*.doc", "*.docx", "*.xls", "*.xlsx" };
List<FileSystemWatcher> watchers = new List<FileSystemWatcher>();

foreach(string f in filters)
{
    FileSystemWatcher w = new FileSystemWatcher();
    w.Filter = f;
    w.Changed += MyChangedHandler;
    watchers.Add(w);
}

Mrchief와 jdhurst의 솔루션을 확장하려면 :

private string[] extensions = { ".css", ".less", ".cshtml", ".js" };
private void WatcherOnChanged(object sender, FileSystemEventArgs fileSystemEventArgs)
{
    var ext = (Path.GetExtension(fileSystemEventArgs.FullPath) ?? string.Empty).ToLower();

    if (extensions.Any(ext.Equals))
    {
        // Do your magic here
    }
}

This eliminates the regex checker (which in my mind is too much overhead), and utilizes Linq to our advantage. :)

Edited - Added null check to avoid possible NullReferenceException.


A quick look in the reflector shows that the filtering is done in .Net code after the windows api has reported the file system change.

I'd therefore suggest that the approach of registering multiple watchers is inefficient as you're putting more load on the API causing multiple callbacks and only one of the filters will match. Much better to just register a single watcher and filter the results yourself.


You could also filter by using FileInfo by comparing to the string of the extension you're looking for.

For example the handler for a file changed event could look like:

void File_Changed(object sender, FileSystemEventArgs e)
{
    FileInfo f = new FileInfo(e.FullPath);

    if (f.Extension.Equals(".jpg") || f.Extension.Equals(".png"))
    {
       //Logic to do whatever it is you're trying to do goes here               
    }
}

참고URL : https://stackoverflow.com/questions/6965184/how-to-set-filter-for-filesystemwatcher-for-multiple-file-types

반응형