2012-10-14 26 views
8

मैं एक फ़ंक्शन को कोड करना चाहता हूं जो मुझे बताता है कि फ़ाइल/फ़ोल्डर को किसी विशिष्ट पथ पर लिखना संभव है या नहीं। मैं वास्तव में डिस्क पर किसी फ़ाइल को लिखने के बिना करना चाहता हूं। क्या इसके लिए एक विनिपी समारोह है? आपकी मदद के लिए धन्यवाद।फ़ाइल सिस्टम प्रतिबंध प्राप्त करें

+3

कोई एक समारोह है कि क्या करेंगे कि साथ। यदि आप सुरक्षा API पर नेविगेट कर सकते हैं तो आप इसे पहले से जांचने में बहुत अच्छा कर सकते हैं। अब तक यह जानने का सबसे आसान तरीका है कि आप स्थान पर लिख सकते हैं या नहीं, ऐसा करने का प्रयास करना है। –

+4

मैंने इस तरह की स्थिति से भी निपटाया है। सबसे पहले मैंने एसीएल अनुमतियों की जांच करने पर अपना समाधान आधारित किया, लेकिन जल्द ही मुझे एहसास हुआ कि वास्तव में एकमात्र विश्वसनीय तरीका है 'GetTempFileName' API (या जो कुछ भी) का उपयोग करके एक अस्थायी फ़ाइल को बनाने और बनाने के लिए। – kobik

+2

ठीक है, मैं सीडी-रोम डालता हूं, फिर आपका प्रोग्राम, एसीएल की जांच करता है। आपको अपनी फाइलें बनाने का अधिकार दिया गया है - लेकिन मीडिया सिर्फ इसका समर्थन नहीं करता है। लेखन-संरक्षित फ्लॉपी, एसडी कार्ड इत्यादि के लिए डिटो, एसीएल बस पर्याप्त नहीं है। बेहतर प्रयास करें। यदि आप त्रुटियों के मामले में कचरा जीने से डरते हैं, तो फ़ाइल को स्वचालित रूप से बंद करने के लिए विंडोज फ़्लैग सेट करें। –

उत्तर

12

आप GetFileSecurity() और AccessCheck() फ़ंक्शंस का उपयोग कर सकते हैं। How to Check Access Rights पर हारून बॉलमैन का लेख पढ़ें। उन्होंने आपके द्वारा पूछे जाने वाले कार्यों को करने के लिए CanAccessFolder() फ़ंक्शन प्रदान किया।

+0

धन्यवाद। यही वह था जिसे मैं ढूंढ रहा था! –

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

क्या आप यह बता सकते हैं कि यह फ़ंक्शन क्या करता है, इनपुट पैरामीटर क्या हैं और परिणाम क्या है? बीटीडब्लू।, आपको विंडोज एपीआई फ़ंक्शन कॉल के परिणाम जांचना चाहिए ... – TLama

+0

ऐसा लगता है कि ऊपर दिए गए उत्तर से CanAccessFolder फ़ंक्शन पोर्ट किया गया है। –

+1

TLama: क्षमा करें, जोड़ा गया। बेंजामिन: मैं नहीं जानता, इसे हमारे कोड बेस से पकड़ लिया –