我面臨的情況是,當同一個 exe 可能已經以讀/寫模式打開了同一個檔案(網路共享)時,我需要以只讀模式打開檔案。我必須至少允許其他用戶讀取該檔案。
指向同一個共享檔案的計算機上的許多不同用戶將同時啟動 EXE。
我正面臨"Cannot open file '<file>'. The process cannot access the file because it is being used by another process"錯誤。
有什么辦法可以解決這個問題嗎?
以讀/寫模式打開的代碼
TFileStream.Create(<file>, fmOpenReadWrite or fmShareDenyNone);
以只讀模式打開的代碼
TFileStream.Create(<file>, fmOpenRead);
uj5u.com熱心網友回復:
根據此表(不要使用混亂的布局語意查找當前版本)第二次呼叫必須至少具有相同的共享:
| 第一次呼叫 CreateFile | 對 CreateFile 的第二次有效呼叫 |
|---|---|
GENERIC_READ | GENERIC_WRITE 和 FILE_SHARE_READ | FILE_SHARE_WRITE |
GENERIC_READ 和 FILE_SHARE_READ | FILE_SHARE_WRITE |
GENERIC_WRITE 和 FILE_SHARE_READ | FILE_SHARE_WRITE |
|
GENERIC_READ | GENERIC_WRITE 和 FILE_SHARE_READ | FILE_SHARE_WRITE |
這意味著:第二個呼叫必須至少共享相同的。所以你必須打電話
TFileStream.Create('filename', fmOpenRead or fmShareDenyNone);
……如果你想成功。
為什么這是有道理的?因為當第三個呼叫者想要打開檔案時,作業系統不會維護一個按時間順序排列的誰首先打開它和第二個打開它的人,因此沒有“第一個打開者比第二個打開者更正確”。如果第二個呼叫者將其從“全部共享”減少到“共享讀取”,那么為什么第三個呼叫者應該堅持這一點而不是第一個呼叫者的“全部共享”模式?
uj5u.com熱心網友回復:
您描述了多個用戶可能同時訪問一個檔案的情況。我想,無法預測誰是第一個嘗試訪問該檔案的人。我也明白所有人都想在訪問檔案時寫入檔案,或者如果他們沒有立即獲得寫訪問權限,他們將稍后再試。
試圖
TFileStream.Create(<file>, fmOpenReadWrite or fmShareDenyNone);
如果成功,寫入檔案并關閉它。任務完成。
如果上述操作失敗,并且您仍想讀取檔案,請嘗試
TFileStream.Create(<file>, fmOpenRead or fmShareDenyNone);
如果成功,請讀取檔案并關閉它。如果您仍然需要寫入檔案,請稍后重試。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/379272.html
