FileSystemWatcher 폴더내 파일 변화 감시

Program/C# 2008. 2. 29. 13:17
출처 : http://1978.tistory.com/ 

예전에 C 에서 이와 같은 기능을 구현 하려고 애먹었던 기억이 나는군요..
C# 이런면에서 정말 편합니다. ㅎㅎ


파일 시스템 변경 알림을 수신하면서 디렉터리 또는 디렉터리의 파일이 변경되면 이벤트를 발생시킵니다.

이 형식의 전체 멤버 목록을 보려면 FileSystemWatcher 멤버을(를) 참조하십시오.


스레드로부터 안전한 방식

이 형식의 모든 public static(Visual Basic에서는 Shared) 멤버는 스레드로부터 안전합니다. 하지만 인스턴스 멤버는 스레드로부터 안전하지 않습니다.

설명

FileSystemWatcher를 사용하여 지정된 디렉터리의 변경 내용을 조사합니다. 지정된 디렉터리에 있는 하위 디렉터리 및 파일의 변경 내용을 조사할 수 있습니다. 구성 요소는 로컬 컴퓨터, 네트워크 드라이브, 또는 원격 컴퓨터에 있는 파일을 조사할 수 있습니다.

참고    FileSystemWatcher 에서는 전환되거나 제거되지 않은 디스크도 조사할 수 있습니다. 타임스탬프 및 속성은 변경될 수 없으므로 FileSystemWatcher 는 CD와 DVD에 대한 이벤트는 발생시키지 않습니다. 구성 요소가 올바르게 작동되도록 하려면 원격 컴퓨터에 이러한 플랫폼 중 하나가 설치되어 있어야 합니다. 하지만 Windows NT 4.0 컴퓨터에서 원격 Windows NT 4.0 컴퓨터를 조사할 수는 없습니다.

모든 파일의 변경 내용을 조사하려면 Filter 속성을 빈 문자열("")로 설정하고 특정 파일을 조사하려면 Filter 속성을 파일 이름으로 설정합니다. 예를 들어, MyDoc.txt 파일의 변경 내용을 조사하려면 Filter 속성을 "MyDoc.txt"로 설정합니다. 특정 형식의 파일에 대한 변경 내용을 조사할 수도 있습니다. 예를 들어, 텍스트 파일의 변경 내용을 조사하려면 Filter 속성을 "*.txt"로 설정합니다.

참고   숨김 파일도 조사됩니다.

디렉터리나 파일에 대해 여러 형식의 변경 내용을 조사할 수 있습니다. 예를 들어, Attributes, LastWrite 날짜 및 시간, 또는 파일이나 디렉터리 Size의 변경 내용을 조사할 수 있습니다. FileSystemWatcher.NotifyFilter 속성을 NotifyFilters 값 중 하나로 설정하면 이를 수행할 수 있습니다. 조사할 수 있는 변경 내용의 형식에 대한 자세한 내용은 NotifyFilters를 참조하십시오.

파일이나 디렉터리의 이름 바꾸기, 삭제, 또는 만들기를 조사할 수 있습니다. 예를 들어, 텍스트 파일의 이름 바꾸기를 조사하려면 Filter 속성을 "*.txt"로 설정하고 제공된 WatcherChangeTypes 값인 Renamed를 사용하여 WaitForChanged 메서드 중 하나를 호출합니다.

참고   공용 파일 시스템 작업은 여러 이벤트를 발생시킬 수 있습니다. 예를 들어, 파일이 한 디렉터리에서 다른 디렉터리로 이동될 경우 여러 개의 OnChanged 및 몇몇 OnCreatedOnDeleted 이벤트가 발생할 수 있습니다. 파일 이동 작업은 여러 개의 간단한 작업으로 구성된 복합 작업이기 때문에 여러 이벤트를 발생시킵니다. 마찬가지로, 일부 응용 프로그램(예: 바이러스 백신 소프트웨어)은 FileSystemWatcher에서 감지하는 추가 파일 시스템 이벤트를 발생시킬 수 있습니다.

시스템에서는 구성 요소에서 수행되어 응용 프로그래밍 인터페이스에 전달된, 버퍼에 있는 파일 변경 내용을 구성 요소에 알립니다. 짧은 시간에 변경 내용이 많은 경우 버퍼가 오버플로될 수 있습니다. 이로 인해 구성 요소는 디렉터리 변경을 추적하지 않게 되며 빈 알림만 제공하게 됩니다. 버퍼는 디스크에 스왑할 수 없는 페이징되지 않은 메모리를 사용하므로 버퍼 크기를 증가시키는 것은 리소스가 많이 소모되는 작업입니다. 따라서 버퍼를 가능한 한 작게 유지하는 것이 좋습니다. 버퍼 오버플로를 방지하려면 NotifyFilterIncludeSubdirectories 속성을 사용하여 원하지 않는 변경 알림을 필터링합니다. 버퍼 크기에 대한 자세한 내용은 InternalBufferSize를 참조하십시오.

참고    Filter를 설정해도 버퍼로 들어가는 항목이 줄어들지는 않습니다.

FileSystemWatcher 인스턴스의 초기 속성 값 목록은 FileSystemWatcher 생성자를 참조하십시오.



[C#]
public class Watcher
{

    public static void Main()
    {

        string[] args = System.Environment.GetCommandLineArgs();

        // If a directory is not specified, exit program.
        if(args.Length != 2)
        {
            // Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }

        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = args[1];
        /* Watch for changes in LastAccess and LastWrite times, and
           the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch text files.
        watcher.Filter = "*.txt";

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        // Begin watching.
        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while(Console.Read()!='q');
    }

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }

'Program > C#' 카테고리의 다른 글

Dispatchertimer  (0) 2008.02.29
Dll 로드시 자료형..  (1) 2008.02.13
메세지 관련..  (0) 2008.02.13
: