2011-05-17 72 views
12

我想知道是否有可能獲得一個只讀的FileStream到一個鎖定的文件? 當我嘗試讀取鎖定的文件時,我現在得到一個異常。FileStream與鎖定的文件

using (FileStream stream = new FileStream("path", FileMode.Open)) 

謝謝!

+0

您顯示的行不是試圖讀取鎖定的文件,而是您試圖打開文件的位置。你是否在其他地方創建這個文件?如果存在鎖定條件,您可能正在做一些事情來創建該條件。請在您列出的單行內顯示更多代碼。 – 2011-05-17 18:36:05

回答

27

你應該嘗試另一個構造函數。他們記錄在MSDN。

這一個看起來像一個賭注:

FileStream Constructor (String, FileMode, FileAccess, FileShare) 

MSDN Link

的FileAccess

,它確定如何將文件可以通過FileStream對象進行訪問的常量。這獲得了FileStream對象的CanRead和CanWrite屬性。如果路徑指定了磁盤文件,則CanSeek爲true。

文件共享

,它確定如何將文件將由進程共享的常量。

+0

Awsome回答!謝謝! – 2013-04-24 20:52:07

6
using (FileStream stream = new FileStream("path", FileMode.Open)) 

將使用默認值的文件共享說法,FileShare.Read。其中拒絕寫入文件的任何進程。如果另一個進程正在寫入文件,那麼這是行不通的,你不能否認已經獲得的權利。

您必須指定FileShare.ReadWrite。如果其他進程使用了​​FileShare.None,那麼這可能仍然不起作用,沒有解決方法。請注意,獲取正在寫入的文件的讀取訪問是麻煩的,您沒有可靠的文件結束指示。文件中的最後一條記錄或行可能只是部分寫入。

-1

您可以簡單地解鎖文件並在其後讀取文件。 只需使用來自Sysinternals的Handle.exe,或使用命令行選項解鎖。 他們都可以解鎖文件,並且您可以輕鬆地從您的程序執行它們,而不用離開您的程序。 (但不要將它們用於Windows SAM文件,它不適用於SAM;)) 祝你好運!

0

我已經使用了以下工作,但應謹慎使用,因爲文件可以在您被另一個進程打開時進行修改。

FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read,FileShare.ReadWrite);