2009-04-29 3 views
1

변경, 생성 및 삭제를 위해 몇 가지 폴더를 감시하는 Windows 서비스에서 작업하고 있습니다. 사소한 변경을 위해 단일 파일 (구성 설정이있는 XML 파일)을 감시하는 하나의 감시자를 제외하고는 모두 잘 작동합니다.FileSystemWatcher 변경된 이벤트가 변경되지 않았습니다.

Windows 서비스 코드를 가져 와서 파일 시스템 감시자를위한 시작/중지 버튼이있는 간단한 Windows 응용 프로그램에 넣고 시도해 보았습니다. XML 구성 파일의 파일 변경을 감지하지 못합니다. 변경 사항이 실제로 발생하고 파일의 "수정 된 날짜"가 업데이트 중입니다.

XmlEventReferences = New System.IO.FileSystemWatcher() 
XmlEventReferences.Path = "C:\XmlReferences\" 
XmlEventReferences.Filter = "*.xml" 
XmlEventReferences.NotifyFilter = IO.NotifyFilters.FileName 
AddHandler XmlEventReferences.Changed, AddressOf ReloadEventReferences 
AddHandler XmlEventReferences.Created, AddressOf ReloadEventReferences 
AddHandler XmlEventReferences., AddressOf ReloadEventReferences 
XmlEventReferences.EnableRaisingEvents = True 

코드의 일부이고 이것은 XML 파일의 샘플 즉 :

<EventReference> 
    <ER_EL_NUMBER>1</ER_EL_NUMBER> 
    <ER_SEND_TO_DATABASE>true</ER_SEND_TO_DATABASE> 
    <ER_ACTIVATE_ALARM>true</ER_ACTIVATE_ALARM> 
    <ER_DESCRIPTION /> 
</EventReference> 

답변

11

MSDN 링크는 내가 문제가 NotifyFilter의 값 믿습니다. 실제로는 FileSystemWatcher에게 파일 이름 변경 사항을 찾아 보았습니다. 파일 수정을 위해 Changed 이벤트를 발생 시키려면 LastWrite 플래그도 지정해야합니다. 추가 정보를 원하시면

XmlEventReferences.NotifyFilter = IO.NotifyFilters.FileName | 
    IO.NotifyFilters.LastWrite; 

은 MSDN에 NotifyFilters 페이지를 참조하십시오 :에 즉 코드의 appropiate 라인

을 변경해야합니다.

참고 : Joshua Belden이 지적했듯이 은 "LastWrite, FileName 및 DirectoryName의 비트 OR 조합입니다."라는 이유로 NotifyFilter 속성을 설정하지 않아도됩니다. 그러나, 나는 그런 경우에 항상 명시하는 것이 가장 바람직하다고 주장 할 것입니다 - 그러면 그것은 FileSystemWatcher이 무엇인지에 대해 완벽하게 분명하게 나타내며 은 아니고입니다.

+0

감사합니다. 도움을 주셔서 감사합니다. – Paxenos

1

당신은 내가 생각의 변화를 데리러 LastWrite처럼 뭔가에 .NotifyFilter을 변경해야합니다. here

0

이 코드는 나를 위해 작동하는 것처럼 보였습니다. test.xml 파일을 편집했습니다. Are

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim XmlEventReferences = New System.IO.FileSystemWatcher() 
    XmlEventReferences.Path = "C:\" 
    XmlEventReferences.Filter = "*.xml" 
    XmlEventReferences.EnableRaisingEvents = True 
    AddHandler XmlEventReferences.Changed, AddressOf Watch 
End Sub 

Private Sub Watch(ByVal sender As Object, ByVal e As FileSystemEventArgs) 
    Dim s As String = e.FullPath 
End Sub 

알림 필터를 모두 덤프합니다.

+0

MSDN (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.notifyfilter.aspx)에서 : "기본값은 LastWrite, FileName 및 DirectoryName의 비트 OR 조합입니다 . " 그래서 네, 당신은 NotifyFilter를 지정하는 라인이 필요 없지만, 당신이 무엇을보고 있는지 명시 적으로 아프지 않습니다. (나는 어쨌든이 이유 때문에 그것을 포함시킬 것이다.) – Noldorin