2012-11-23 2 views
1

내 응용 프로그램이 이미 작동 중입니다. xml 파일을 감지하고 때때로 그것은 "루트 요소가 누락되었습니다"메시지를 표시하고 때로는 또한 괜찮습니다,하지만 XML 파일을 열 때, 그것은 괜찮습니다, 그것에 내용이 있습니다. 이 문제를 해결하는 방법.FileSystemWatcher를 사용하여 xml 파일을 검색 할 때 Linq를 사용하여 xml 파일을 읽고 결과를 묻는 오류 "루트 요소가 없습니다"

private void fileSystemWatcher_Created(object sender, System.IO.FileSystemEventArgs e) 
    { 
     string invoice = ""; 
     using (var stream = System.IO.File.Open(e.FullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)) 
     { 
      var doc = System.Xml.Linq.XDocument.Load(stream); 
      var transac = from r in doc.Descendants("Transaction") 
          select new 
          { 
           InvoiceNumber = r.Element("InvoiceNumber").Value, 
          }; 

      foreach (var i in transac) 
      { 
       invoice = i.InvoiceNumber; 
      } 
     } 

     MessageBox.Show(invoice); 
     fileSystemWatcher.EnableRaisingEvents = false; 
    } 

오류가 레이스 var doc = System.Xml.Linq.XDocument.Load(stream);

+2

내 눈이 너무 좋지 않아 - 작은 스크린 샷에서 물건을 볼 수 없습니다. 하지만 할 수있을지라도 Linqpad 또는 Visual Studio를 잘라내어 테스트하거나 도움을 줄 수는 없었습니다. 효과적인 도움말을 얻을 수 있도록 문제를 보여주는 테스트 사례를 텍스트 만 줄인 작은 텍스트를 넣으십시오. – SAJ14SAJ

+0

죄송합니다. 좋은 것을 붙여 드리겠습니다 ^^ – GrayFullBuster

+1

파일 내용 (처음 몇 줄) –

답변

3

파일이 차면 FileSystemWatcher가 이벤트를 매우 빠르게 올립니다. 파일을 읽기 전에 쓰기 작업이 완료되지 않았을 수 있습니다.

테스트하려면 빠른 대안으로 파일을 읽기 전에 Thread.Sleep(100);을 추가하십시오.

더 나은 해결책을 얻으려면 파일을 공유 모드로 열지 말고 독점적으로 열 수 있는지 확인하십시오. 이 작업이 실패하면 몇 밀리 초 동안 기다렸다가 다시 시도하십시오. 파일을 독점적으로 열 수 있습니다. 또한 이벤트가 두 번 이상 트리거 될 수 있으므로주의해야합니다. 이는 다른 작업이 파일에 기록하는 방법에 따라 다릅니다.

+0

고마워, 작동! 이 다른 옵션이 있습니까? 고맙습니다.. – GrayFullBuster

2

그것은 수 있다는 것을 간다 :

여기 enter image description here

코드입니다 : 여기

오류의 스크린 샷입니다 파일이 생성 된 후 별도의 단계로 기록 될 때의 조건. 따라서 예외가 발생하는 생성 된 이벤트가 발생하면 빈 파일이있는 경우가 있습니다. Created 이벤트가 발생하여 Changed 이벤트가 발생한 후 잠시 기다려야합니다 ( FileSystemWatcher). 또한 많은 양의 내용이 쓰여지면 파일에 모든 내용이 나타나기 전에 여러 개의 이벤트가 여러 번 발생합니다.

+0

고마워요. 정말 고마워. :) – GrayFullBuster