簡體   English   中英

打開已打開的文件時出現異常

[英]Exception in opening a file that is already open

我在C#中構建一個應用程序,我必須打開一個CSV文件來從中讀取數據。 當我嘗試從C#打開CSV文件時,我在Excel中打開該文件時出現異常。 例外情況表明該進程無法訪問該文件,因為該文件已經打開。 即使在其他應用程序中打開文件,如何解決此問題並打開文件?

謝謝,拉克什。

這是可能的,但您必須小心控制您指定的文件共享。 大多數.NET類默認為FileShare.Read,拒絕寫入文件的另一個進程。 但是,如果文件由Excel打開,它就無法工作,它已經獲得了對它的寫入權限。 你不能否認已經獲得的權利。

要解決此問題,請使您的代碼看起來與此類似:

        using (var fs = new FileStream(@"c:\\temp\\test.csv", FileMode.Open, 
                   FileAccess.Read, FileShare.ReadWrite))
        using (var sr = new StreamReader(fs)) {
            // Read it...
        }

請注意FileShare.ReadWrite的使用。 我驗證了此代碼有效,而Excel已打開test.csv。

請注意您可能會遇到的麻煩,當Excel在讀取文件時寫入文件時會發生奇怪的事情。 你可能會閱讀垃圾,舊數據的一部分,新的一部分,沒有一個很好的診斷方法。

一段時間后我遇到了這個問題。

您缺少FileShare參數。 如果不指定,如果打開文件,它將由您的應用程序專門鎖定。 但由於它已經由Excel(或任何其他應用程序)打開,您將收到一個例外。

你可以嘗試使用它 - 我認為這將是你最好的選擇 -

using (FileStream fs = File.Open(<file-path>, FileMode.Open, FileAccess.Read, FileShare.Read))

這段代碼說:Hello Excel! 如果您可以允許(讀取,而不是拋出異常),我想閱讀該文件,但我不會嘗試擁有它,我知道您可以隨時修改它。

如果這會引發錯誤,那么Excel甚至拒絕您進行讀取訪問。 那太糟糕了! 祝一切順利。

由於並發問題,您無法選擇寫入同一文件的兩個實例。 應該可以以只讀方式打開一個,這樣就不會出現並發問題,因為讀保證是線程安全的。 本文應該解釋如何做我提出的建議

那是不可能的。

可以使用不同類型的保護打開文件。 Excel專門打開文件,目的是保護文件不被其他程序更改,然后在Excel保存時恢復。

Excel可能已經打開文件並允許讀取,但是你可能最終處於死鎖狀態,其中兩個應用程序打開文件進行讀取,並且都不能將任何內容保存回來。

此答案建議的另一個解決方案是將文件復制到臨時文件並打開它。

使用

System.IO.File.Copy(sourcepath, copypath, false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM