2008-10-15 69 views
14

我試圖用一個StreamReader讀取文件,但它始終是由另一個進程使用,所以我得到這個錯誤:我可以簡單地'閱讀'正在使用的文件嗎?

The process cannot access the file '\arfjwknasgmed17\C$\FLAG CONDITION\CP-ARFJN-FLAG.XLS' because it is being used by another process.

有沒有一種方法可以讓我讀這不復制呢?或者那是我唯一的選擇?

回答

25

只有當首先打開文件的程序讀取該文件的共享權限時,才能讀取該文件。

如果該文件確實沒有讀取共享權限,您將無法將其複製到第一個位置。

如果您指定的共享權限與已打開文件的程序的共享權限衝突,則可能無法訪問文件。例如,如果已打開的程序未授予寫入權限,則無法授予寫入權限。

如果首先打開該文件的程序支持卷影複製(VSS),則還可以使用VSS訪問該文件。

有些商業軟件驅動程序允許您訪問這些文件,即使它們正在使用中。您以前可以通過St-Bernards獲得Open File Manager,並且您還可以使用VisionWorks Solutions Inc.提供的File Access Manager (FAM)。這些驅動程序通常以OEM方式備份軟件公司以包含在其產品中。

VSS的工作原理是告訴程序文件已經打開,另一個程序想從文件讀取。然後,VSS會複製文件並讓您從此副本中讀取。 VSS不適用於傳統應用程序。

通過指定可以訪問獨佔打開和鎖定文件的應用程序的「允許列表」,FAM可透明地用於傳統和非傳統程序。只有這個列表中的程序才被允許訪問這些文件。當一個文件被打開時,它會進入緩存模式,以便您可以獲得該文件的副本,就像文件的「備份/打開」開始時一樣。此時,最初打開該文件的程序會看到該文件的實際情況,並且允許列表中的第二個程序會在文件的「打開/備份」發生時看到該文件。這確保了文件的一致性。

2

請嘗試下面的代碼。

FileStream fileStr = File.Open(<full file name>, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
fileStream = new StreamReader(fileStr); 

我已經在Windows XP上試過了。如果該文件已被其他進程以寫模式打開&它尚未指定共享權限,您仍然可以在讀取模式下打開該文件。

免責聲明:它的工作原理,但是,我不確定你是否應該在生產代碼中使用它。我還沒有找到任何說明它應該起作用的正式文件。

相關問題