본문 바로가기

VB.NET

[TIPS] 폴더와 파일의 변경을 감시하는 방법

반응형

폴더나 파일이 변경되자 마자 그것을 알기 위한 방법을 소개합니다.

이것은, System.IO.FileSystemWatcher 클래스를 사용하면 간단하게 할 수 있습니다.

폴더 또는 파일이 작성되었을 때에는 Created 이벤트가..

삭제되었을 때에는 Deleted 이벤트가..

이름이 변경되었을 때에는 Renamed 이벤트가...

사이즈, 시스템 속성, 최종 기입 시각, 최종 액세스 시각, 또는 시큐러티 액세스 허가가 변경되었을 때에는 Changed 이벤트가 발생합니다.

다음의 예에서는, 폴더"C:\My Documents"내의 TXT 파일의 작성, 삭제, 이름의 변경을 감시하고 있습니다. WaitForChanged 메소드를 사용해 동기적으로 감시하고 있기 때문에, 감시중일때는 멈춘것처럼 됩니다.

 

Dim watcher As New System.IO.FileSystemWatcher

'감시하는 디렉토리를 지정

watcher.Path = "C:\My Documents"

'*.txt파일을 감시, 모두 감시할 때는""으로 한다.

watcher.Filter = "*.txt"

'파일명과 디렉토리명으로 최종적으로 쓴날짜의 변경을 감시
watcher.NotifyFilter = System.IO.NotifyFilters.FileName Or _
    System.IO.NotifyFilters.DirectoryName Or _
    System.IO.NotifyFilters.LastWrite

'서브디렉토리는 감시하지않는다.
watcher.IncludeSubdirectories = False

'필요에따라서 버퍼의 사이즈를 변경한다.

'watcher.InternalBufferSize = 4096

'동기적인 감시를 실시한다.
Dim changedResult As System.IO.WaitForChangedResult = _
watcher.WaitForChanged(System.IO.WatcherChangeTypes.All)

If changedResult.TimedOut Then
    Console.WriteLine("타임아웃 되었습니다.")
Return
End If

 

'변경이 있었을때 결과를 표시한다.
Select Case changedResult.ChangeType
    Case System.IO.WatcherChangeTypes.Changed
        Console.WriteLine(("파일 [" + _
            changedResult.Name + "] 가 변경되었습니다."))
    Case System.IO.WatcherChangeTypes.Created
        Console.WriteLine(("파일 [" + _
            changedResult.Name + "] 가 작성되었습니다."))
    Case System.IO.WatcherChangeTypes.Deleted
        Console.WriteLine(("파일 [" + _
            changedResult.Name + "] 가 삭제되었습니다."))
    Case System.IO.WatcherChangeTypes.Renamed
        Console.WriteLine(("파일 [" + _
            changedResult.OldName + "] 의 이름이 [" + _
            changedResult.Name + "] 로 변경되었습니다."))
End Select

 

 

 


비동기적으로 감시하는 방법  


다음에 비동기적으로 감시하는 예를 소개합니다.

Button1을 클릭하는 것으로써 감시를 시작하여, Button2을 클릭하는 것으로써 감시를 종료합니다.

 

Private watcher As System.IO.FileSystemWatcher = Nothing

'Button1의 Click 이벤트 핸들러
Private Sub Button1_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    If Not (watcher Is Nothing) Then
        Return
    End If

    watcher = New System.IO.FileSystemWatcher

    '감시하는 디렉토리를 지정
    watcher.Path = "C:\My Documents"

    '최종액세스일시, 최종변경일시, 파일, 폴더이름의 변경을 감시한다.
    watcher.NotifyFilter = System.IO.NotifyFilters.LastAccess Or _
        System.IO.NotifyFilters.LastWrite Or _
        System.IO.NotifyFilters.FileName Or _
       System.IO.NotifyFilters.DirectoryName

   '모든 파일을 감시
    watcher.Filter = ""

    'UI의 스레드를 머셜링한다.

    '콘솔어플리케이션의 사용에서는 불필요
    watcher.SynchronizingObject = Me

    '이벤트 핸들러를 추가한다.
    AddHandler watcher.Changed, AddressOf watcher_Changed
    AddHandler watcher.Created, AddressOf watcher_Changed
    AddHandler watcher.Deleted, AddressOf watcher_Changed
    AddHandler watcher.Renamed, AddressOf watcher_Renamed

    '감시를 시작한다.
    watcher.EnableRaisingEvents = True
    Console.WriteLine("감시를 시작했습니다.")
End Sub

 

'Button2의 Click이벤트 핸들러
Private Sub Button2_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Button2.Click  

    '감시를 종료
    watcher.EnableRaisingEvents = False
    watcher.Dispose()
    watcher = Nothing
    Console.WriteLine("감시를 종료했습니다.")
End Sub

 

'이벤트핸들러
Private Sub watcher_Changed(ByVal source As System.Object, _
    ByVal e As System.IO.FileSystemEventArgs)
    Select Case e.ChangeType
        Case System.IO.WatcherChangeTypes.Changed
            Console.WriteLine(("파일 [" + e.FullPath + _
                "] 이 변경되었습니다."))
        Case System.IO.WatcherChangeTypes.Created
            Console.WriteLine(("파일 [" + e.FullPath + _
                "] 이 작성되었습니다."))
        Case System.IO.WatcherChangeTypes.Deleted
            Console.WriteLine(("파일 [" + e.FullPath + _
                "] 이 삭제되었습니다."))
    End Select
End Sub

 

Private Sub watcher_Renamed(ByVal source As System.Object, _
    ByVal e As System.IO.RenamedEventArgs)
    Console.WriteLine(("파일 [" + e.FullPath + _
        "] 의 이름이 변경되었습니다."))
End Sub

 

반응형