2012-10-14 59 views
8

我想編寫一個函數,告訴我是否可以將文件/文件夾寫入特定路徑。我想這樣做,而不是實際寫入任何文件到磁盤。有沒有一個WINAPI函數? 謝謝你的幫助。Get FileSystem Restrictions

+3

沒有單一的功能,將做到這一點。如果你可以瀏覽安全API,你可以預先檢查一下。到目前爲止,知道您是否可以寫入某個 位置的最簡單方法是嘗試這樣做。 –

+4

我也處理過這種情況。首先我根據我的解決方案檢查ACL權限,但很快我意識到唯一可靠的方法是使用'GetTempFileName' API(或其他)嘗試創建臨時文件。 – kobik

+2

好吧,我插入CD-ROM,然後你的程序檢查ACL。您被授予創建文件的權利 - 但媒體只是不支持它。對於寫保護的軟盤,SD卡等也是如此。ACL僅僅是不夠的。更好地嘗試。將Windows標誌設置爲自動刪除文件關閉,如果你害怕生活垃圾的情況下出現錯誤。 –

回答

8
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; 
+3

你能解釋一下這個函數做什麼,請問輸入參數是什麼,結果是什麼?順便說一句,你應該檢查Windows API函數調用的結果... – TLama

+0

這似乎是從上面的答案移植的CanAccessFolder函數。 –

+1

TLama:對不起,已添加。本傑明:我不知道,從我們的代碼庫中獲取它 –