2013-03-12 21 views
12

有沒有辦法可以檢查一個文件是否正在使用中,或者沒有被其他進程打開,而只是試圖打開它並捕獲異常?有沒有服務方法來測試這樣的事情?檢查文件是否正在使用而沒有嘗試捕獲?

+6

那麼,爲什麼你想知道?無論如何要打開文件?然後,您可以跳過檢查並直接嘗試,因爲無論如何您都可以參加比賽。 – Joey 2013-03-12 13:26:40

+0

@不是必需的,但主要是它的原因,但是一旦涉及第三方工具,它將有助於確定文件是否可以被opoened或不被稱爲第三方的開放方法,無論如何,我期望hace這樣一種方法,而不是將該捕獲聲明作爲該計劃的藝術來實施。 – CloudyMarble 2013-03-12 13:31:17

+0

可能重複的[如何檢查一個文件是否已經被C中的另一個進程打開?](http://stackoverflow.com/questions/1951791/how-to-check-if-a-file-is-already-由c中的另一個進程打開) – 2013-03-12 13:50:50

回答

15

即使有,它也不會對你有太大的好處,因爲你仍然必須捕捉異常,以便處理在初始檢查和實際嘗試打開/訪問它。

我想不出有任何令人信服的優勢來進行初步的防守檢查。這隻會導致不必要的代碼重複。

如果有這樣的IsFileAccessible功能,它很可能是爲試圖打開該文件一個巨大的try/catch塊落實,抓失敗,並返回結果。

+0

@CodyGray Thnx用於回答,但是這與檢查文件的訪問控制是否相同,可以在兩者之間進行更改,直到我訪問它爲止?但是我確實有這個選項來詢問這些訪問控制,而不必碰到catch語句,它仍然可以發生,但它不會成爲我計劃的一部分。 – CloudyMarble 2013-03-12 13:37:27

+1

你是對的。但是,儘管最終你不能避免檢查異常,但是有一個函數可以檢查那些沒有必要打開文件的東西,這可能會很有趣。一些有用的工具可以提供這些信息,而且它們不基於try/catch代碼。 – 2013-03-12 13:37:33

+0

@SimonMourier沒有嘗試/抓住就很容易做到。只需調用'CreateFile'。 – 2013-03-12 13:39:44

2

我可以測試一個文件是否可以打開而不打開 打開它?

.net框架就像下面的Windows API一樣,沒有提供這樣的功能。如果你想知道文件是否可以打開,你需要嘗試打開它並檢查失敗。

1

有趣的方式,以避免嘗試catch(但意味着試圖打開)是LockFile()CreateFile()功能:

HANDLE WINAPI的CreateFile(...)

如果函數成功,返回值是指定文件,設備,命名管道或郵件插槽的打開句柄。

如果函數失敗,則返回值爲INVALID_HANDLE_VALUE。要獲得更多的錯誤信息,請致電GetLastError


BOOL WINAPI與LockFile(...)

如果函數成功,返回值是非零 (TRUE)。

如果函數失敗,則返回值爲零(FALSE)。要獲得 擴展錯誤信息,請撥打GetLastError

這鎖住調用進程獨佔訪問指定的文件,並在失敗錯誤信息寫入線程的最後一個錯誤,這可以使用GetLastError功能retreived。

在unlockFile和OpenFile之間另一個進程可以鎖定文件仍然是可以想象的,但它可以通過保持文件鎖定到它需要打開的時刻來縮短這個時間。

+1

問問你自己hFile的來源? – 2013-03-13 08:28:38

+0

你的權利!我以CreateFile結束,雖然它沒有拋出異常,並啓用readbale返回值,但它仍然嘗試打開文件 – CloudyMarble 2013-03-13 10:12:44

+1

這正是我和其他人告訴你的。恰巧用於打開文件的.net機制發出異常信號失敗。 Win32機制通過返回值發出錯誤信號。從根本上講,它最終會得到同樣的結果。 – 2013-03-13 10:21:28

相關問題