我想編寫一個函數,告訴我是否可以將文件/文件夾寫入特定路徑。我想這樣做,而不是實際寫入任何文件到磁盤。有沒有一個WINAPI函數? 謝謝你的幫助。Get FileSystem Restrictions
回答
您可以使用GetFileSecurity()和AccessCheck()函數。閱讀Aaron Ballman關於How to Check Access Rights的文章。他提供CanAccessFolder()
函數來完成你所要求的功能。
謝謝。這就是我一直在尋找的! –
function CheckFileAccess(const FileName: string; const CheckedAccess: Cardinal): Cardinal;
var Token: THandle;
Status: LongBool;
Access: Cardinal;
SecDescSize: Cardinal;
PrivSetSize: Cardinal;
PrivSet: PRIVILEGE_SET;
Mapping: GENERIC_MAPPING;
SecDesc: PSECURITY_DESCRIPTOR;
begin
Result := 0;
GetFileSecurity(PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, nil, 0, SecDescSize);
SecDesc := GetMemory(SecDescSize);
if GetFileSecurity(PChar(Filename), OWNER_SECURITY_INFORMATION or GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, SecDesc, SecDescSize, SecDescSize) then
begin
ImpersonateSelf(SecurityImpersonation);
OpenThreadToken(GetCurrentThread, TOKEN_QUERY, False, Token);
if Token <> 0 then
begin
Mapping.GenericRead := FILE_GENERIC_READ;
Mapping.GenericWrite := FILE_GENERIC_WRITE;
Mapping.GenericExecute := FILE_GENERIC_EXECUTE;
Mapping.GenericAll := FILE_ALL_ACCESS;
MapGenericMask(Access, Mapping);
PrivSetSize := SizeOf(PrivSet);
AccessCheck(SecDesc, Token, CheckedAccess, Mapping, PrivSet, PrivSetSize, Access, Status);
CloseHandle(Token);
if Status then
Result := Access;
end;
end;
FreeMem(SecDesc, SecDescSize);
end;
可以使用此類似: 如果(CheckFileAccess(SysteemGegevens.DFImportPath,FILE_ALL_ACCESS)<> FILE_ALL_ACCESS)然後
與
const
FILE_READ_DATA = $0001;
FILE_WRITE_DATA = $0002;
FILE_APPEND_DATA = $0004;
FILE_READ_EA = $0008;
FILE_WRITE_EA = $0010;
FILE_EXECUTE = $0020;
FILE_READ_ATTRIBUTES = $0080;
FILE_WRITE_ATTRIBUTES = $0100;
FILE_GENERIC_READ = (STANDARD_RIGHTS_READ or FILE_READ_DATA or
FILE_READ_ATTRIBUTES or FILE_READ_EA or SYNCHRONIZE);
FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE or FILE_WRITE_DATA or
FILE_WRITE_ATTRIBUTES or FILE_WRITE_EA or FILE_APPEND_DATA or SYNCHRONIZE);
FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE or FILE_READ_ATTRIBUTES or
FILE_EXECUTE or SYNCHRONIZE);
FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $1FF;
你能解釋一下這個函數做什麼,請問輸入參數是什麼,結果是什麼?順便說一句,你應該檢查Windows API函數調用的結果... – TLama
這似乎是從上面的答案移植的CanAccessFolder函數。 –
TLama:對不起,已添加。本傑明:我不知道,從我們的代碼庫中獲取它 –
- 1. Swift 3 Array Restrictions
- 2. Rich Filesystem
- 3. mysql filesystem
- 4. Get-ChildItem實現過濾器參數中的FileSystem Provider錯誤?
- 5. Laravel Filesystem錯誤
- 6. Tag「Filesystem」的問題
- 7. FileSystem FilePutobject Issues
- 8. fileSystem到FTPFile []?
- 9. Force FileSystem of Path
- 10. AS3 Filesystem Hello World
- 11. boost :: filesystem normalize filename
- 12. FileSystem listStatus引發NullPointerException
- 13. boost :: filesystem :: exists崩潰
- 14. Emscripten使用Filesystem FS
- 15. 爲什麼boost :: filesystem :: path和std :: filesystem :: path缺少operator +?
- 16. boost :: filesystem添加引號?
- 17. Boost Filesystem編譯錯誤
- 18. boost :: filesystem :: path operator/c2296 error
- 19. Ooozie - FileSystem maprfs不存在
- 20. Laravel 5 Filesystem - 目錄權限
- 21. Boost Filesystem - 枚舉設備?
- 22. C++:boost/filesystem:一些問題
- 23. Nutch 1.12 exception java.io.IOException:No FileSystem for scheme:http
- 24. boost :: filesystem中的錯誤?
- 25. 刪除依賴boost :: filesystem :: current_path()
- 26. boost :: filesystem :: path.parent_path()和空格
- 27. 追加到boost :: filesystem :: path
- 28. boost :: filesystem :: directory_iterator copy-ctor implictly deleted
- 29. Playbook上的Android FileSystem佈局
- 30. Hadoop S3訪問 - FileSystem vs FileContext
沒有單一的功能,將做到這一點。如果你可以瀏覽安全API,你可以預先檢查一下。到目前爲止,知道您是否可以寫入某個 位置的最簡單方法是嘗試這樣做。 –
我也處理過這種情況。首先我根據我的解決方案檢查ACL權限,但很快我意識到唯一可靠的方法是使用'GetTempFileName' API(或其他)嘗試創建臨時文件。 – kobik
好吧,我插入CD-ROM,然後你的程序檢查ACL。您被授予創建文件的權利 - 但媒體只是不支持它。對於寫保護的軟盤,SD卡等也是如此。ACL僅僅是不夠的。更好地嘗試。將Windows標誌設置爲自動刪除文件關閉,如果你害怕生活垃圾的情況下出現錯誤。 –