2012-10-04 39 views
0

我正在使用File Watcher(.NET),並且總是收到以下錯誤 - 文件正在被另一個進程使用。FileSystemWatcher文件訪問錯誤

上述錯誤只出現在網絡共享中,即觀察目錄是共享的,並且如果有人將文件放入該目錄,則只會發生此錯誤。當我把我的m/c文件放到監視目錄(本地)時,它工作正常。

這是我的下面的代碼看起來如何,錯誤出現在第一行本身。我已經嘗試了所有在網上給出的解決方案,但似乎沒有任何工作。當我把Thread.Sleep(500),但之後,它是無法挑選下一個文件的唯一解決方案。任何建議將是一個很大的幫助。

 try 
     { 

     using (Stream stream = File.Open(xmlPath, FileMode.Open, FileAccess.Read,    FileShare.Read)) 
      { 
        XmlTextReader xmlTextReader = new XmlTextReader(stream); 
        document = XDocument.Load(xmlTextReader); 
        ........ // my code 
        xmlTextReader.Close(); 
        stream.Close(); 

      } 
     } 
     catch (Exception exception) 
      { 
       EventLog.WriteEntry("Application", exception.ToString(), EventLogEntryType.Error); 

      } 
+1

stream.close()是在你的code.using冗餘會爲你做 –

+1

@CodeIgnoto是正確的,也'XmlTextReader'實現'的IDi一次性「,所以你可以用''''來包裝它。 – James

+0

@CodeIgnoto - 是的,我知道我已經刪除了該代碼。 – Punit

回答

1

我想你會發現,因此爲什麼等待工作的文件不是acessable ..

這個代碼看看,看看這有助於...

// Consider having a List<String> named _changedFiles 

private void OnChanged(object source, FileSystemEventArgs e) 
{ 
    lock (_changedFiles) 
    { 
     if (_changedFiles.Contains(e.FullPath)) 
     { 
      return; 
     } 
    } 

    // do your stuff 

    System.Timers.Timer timer = new Timer(1000) { AutoReset = false }; 
    timer.Elapsed += (timerElapsedSender, timerElapsedArgs) => 
    { 
     lock (_changedFiles) 
     { 
      _changedFiles.Remove(e.FullPath); 
     } 
    }; 
    timer.Start(); 
} 

來自: FileSystemWatcher Changed event is raised twice

+0

@ Mathew-希望這也適用於OnCreate,你在哪裏添加文件名到列表中,並且我將EnableRaisingEvents設置爲true,是否可以? – Punit

+0

嗨,是的,它應該設置爲true。看看實際上很清楚的微軟例子。 http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.enableraisingevents.aspx它應該適用於oncreate或任何事件。基本上你只需要延遲文件訪問,直到你可以鎖定你需要打開的文件。這是我相信問題的根源。無論如何,我希望這有助於澄清問題並給你一個解決方案?問候馬修Zielonka –

+0

謝謝,它爲我工作。 – Punit