我正在嘗試檢查檔案是否在 Win32 中打開:
bool CheckFileUnlocked(const TCHAR *file)
{
HANDLE fh = ::CreateFile(file, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if(fh != NULL && fh != INVALID_HANDLE_VALUE) {
return (CloseHandle(fh) == TRUE);
}
return false;
}
我需要能夠區分檔案是否在本地打開,在這種情況下,true如果它是從共享路徑打開的,則該函式必須回傳。檔案本身可通過網路訪問,并映射到共享驅動器中。上面的函式嘗試以獨占訪問打開檔案。我嘗試添加 else 子句減少到:
bool CheckFileUnlocked(const TCHAR *file)
{
HANDLE fh = ::CreateFile(file, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if(fh != NULL && fh != INVALID_HANDLE_VALUE) {
return (CloseHandle(fh) == TRUE);
} else {
fh = ::CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if(fh != NULL && fh != INVALID_HANDLE_VALUE) {
return (CloseHandle(fh) == TRUE);
}
}
return false;
}
但是我仍然無法確定該檔案是在本地打開還是在另一個系統上通過網路打開。我也試過LockFileEx()and UnlockFileEx(),但我猜這些可能是錯誤的方法。如何在不實際查詢應用程式 ( LibreOffice Writer) 的情況下解決此問題,假設它提供對此條件的 API 級別訪問(LO 實際上在打開所述檔案時提供了一個彈出視窗,并允許以只讀方式打開它,或打開副本)?
uj5u.com熱心網友回復:
你可以試試GetFileInformationByHandleEx:
FileRemoteProtocolInfo應該回傳網路訪問的屬性,并且可能應該在本地檔案上失敗FileStorageInfo應該回傳存盤的屬性,它可能會在網路上失敗(但需要驗證)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/392407.html
上一篇:如何重構并使這些if陳述句更好?
