我想编写一个函数,告诉我是否可以将文件/文件夹写入特定的path。 我想这样做,没有实际写任何文件到磁盘。 是否有一个WINAPI函数? 感谢您的帮助。
您可以使用GetFileSecurity()和AccessCheck()函数。 阅读Aaron Ballman关于如何检查访问权限的文章。 他提供了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;
你可以这样使用:if(CheckFileAccess(SysteemGegevens.DFImportPath,FILE_ALL_ACCESS)<> FILE_ALL_ACCESS)then
同
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;