2009-06-26 162 views
20

我有一個加載在excel文件中進行分析的winforms應用程序。目前,爲了打開excel文件,文件不能在excel中打開,否則當我嘗試加載文件時會拋出FileIOException異常。如何打開在另一個應用程序中打開的文件

我想要做的是讓我的應用程序讀取文件,即使它是在Excel中打開,而不是強迫用戶先關閉工作表。請注意,有問題的應用程序只需要讀取文件,而不是寫入文件。

這可能嗎?

回答

26

你可以嘗試通過FileShare.ReadWrite打開文件時:

using (var stream = new FileStream(
     @"d:\myfile.xls", 
     FileMode.Open, 
     FileAccess.Read, 
     FileShare.ReadWrite)) 
{ 

} 
6

你如何打開文件?

如果您試圖打開它進行讀取/寫入,您將得到異常。如果你試圖打開它只讀,那麼你應該沒問題。

var file = File.Open("file.xls", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

如果Excel中打開了文件,FileShare.Read設置爲允許其他應用程序(即你的)能夠訪問到文件中時才工作。如果未設置,則Excel將打開具有獨佔訪問權限的文件。注意:我不認爲這是事實,因爲如果有人打開Excel文件(在Excel中)以供閱讀,則可以進行編輯。

UPDATE - 好的,我在darin的評論後才正確地測試過這個。您需要FileShare.ReadWrite標誌,儘管有幫助表明它是用於後續文件的開啓者。甚至連FileShare.Read都不夠好,我甚至覺得它很奇怪。

+0

這是不正確的。使用FileShare.Read意味着:「只有在任何先前的打開程序將其打開以便讀取時纔打開此文件。」事實並非如此,因爲Excel打開了它的文字。 – 2009-06-26 09:43:25

+2

@darin - 我沒有使用FileShare。 – ChrisF 2009-06-26 09:45:24

0

嘗試使已經打開的文件的副本,閱讀並丟棄。爲了檢查文件是否已經打開,請嘗試通過執行復制,讀取和放棄來讀取和處理異常。

1

可以在Excel打開工作簿時讀取工作簿。下面是我們用來做(注意,我們開場後鎖定整個文件,以保持Excel或任何其他應用程序的編寫,而我們在閱讀中)的代碼:

stream = new System.IO.FileStream(path, 
    System.IO.FileMode.Open, 
    System.IO.FileAccess.Read, 
    System.IO.FileShare.ReadWrite, 
    SG.CompoundDocumentIO.Storage.OpenBufferLength); 
try 
{ 
    stream.Lock(0, stream.Length); 
} 
catch 
{ 
    // .NET 1.1 requires cast to IDisposable 
    ((IDisposable)stream).Dispose(); 
    throw; 
} 

聲明:我自己的SpreadsheetGear LLC

相關問題