폴더나 파일이 변경되자 마자 그것을 알기 위한 방법을 소개합니다.
이것은, System.IO.FileSystemWatcher 클래스를 사용하면 간단하게 할 수 있습니다.
폴더 또는 파일이 작성되었을 때에는 Created 이벤트가..
삭제되었을 때에는 Deleted 이벤트가..
이름이 변경되었을 때에는 Renamed 이벤트가...
사이즈, 시스템 속성, 최종 기입 시각, 최종 액세스 시각, 또는 시큐러티 액세스 허가가 변경되었을 때에는 Changed 이벤트가 발생합니다.
다음의 예에서는, 폴더"C:\My Documents"내의 TXT 파일의 작성, 삭제, 이름의 변경을 감시하고 있습니다. WaitForChanged 메소드를 사용해 동기적으로 감시하고 있기 때문에, 감시중일때는 멈춘것처럼 됩니다.
'감시하는 디렉토리를 지정
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을 클릭하는 것으로써 감시를 종료합니다.
'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
'VB.NET' 카테고리의 다른 글
[TIPS] DataGridView의 셀에 툴 힌트(ToolTip)를 표시하는 방법 (0) | 2012.10.22 |
---|---|
[TIPS] DataGridView에서 Enter 키를 누르면 옆의 셀에 포커스가 이동되도록 하는 방법 (0) | 2012.10.22 |
[TIPS] DataGridView로 셀의 값이 null이나 DBNull.Value때에 표시하는 텍스트를 변경하는 방법 (0) | 2012.10.22 |
[TIPS] WebProxy.GetDefaultProxy() 는 이전방식 입니다. 라는 경고 해결방법 (0) | 2012.10.22 |
Microsoft MVP for VB (0) | 2012.10.17 |