2010-08-30 12 views
8

वर्तमान में मैं जेसीएल कोड के आधार पर इस फ़ंक्शन का उपयोग करता हूं, जो ठीक काम करता है:यदि कोई निर्देशिका लिखने योग्य है तो परीक्षण करने के लिए मैं डेल्फी का उपयोग कैसे कर सकता हूं?

function IsDirectoryWriteable(const AName: string): Boolean; 
var 
    FileName: PWideChar; 
    H: THandle; 
begin 
    FileName := PWideChar(IncludeTrailingPathDelimiter(AName) + 'chk.tmp'); 

    H := CreateFile(FileName, GENERIC_READ or GENERIC_WRITE, 0, nil, 
    CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0); 

    Result := H <> INVALID_HANDLE_VALUE; 

    DeleteFile(FileName); 
end; 

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

+3

नहीं है कि आप के लिए कोड काम करता है? क्या इस दृष्टिकोण के बारे में कुछ है जो आपको पसंद नहीं है? यह वास्तव में निर्देशिका लिखने के लिए परीक्षण का एक बहुत ही सरल (सरलतम) तरीका है। हालांकि मैंने विंडोज सुरक्षा के साथ कभी भी बहुत कुछ नहीं किया है, मुझे लगता है कि 'GetFileSecurity' फ़ंक्शन का उपयोग करना एक वैकल्पिक दृष्टिकोण है। –

+0

@Andreas मेरा संपादन देखें - अगर मैं मौजूदा फ़ंक्शन फ़ंक्शन (शायद मल्टीप्लाफ्फ़्ट समर्थन के साथ भी) के कॉल द्वारा इस फ़ंक्शन को प्रतिस्थापित कर सकता हूं, तो यह निश्चित रूप से एक सुधार होगा। – mjn

+0

मैं वास्तव में वहां कुछ भी नहीं देख सकता जो आरटीएल में नहीं है - जो जेसीएल कॉल है? –

उत्तर

15

वास्तव में निर्देशिका को लिखना यह निर्धारित करने का सबसे आसान तरीका है कि निर्देशिका लिखने योग्य है या नहीं। व्यक्तिगत रूप से जांचने के लिए बहुत से सुरक्षा विकल्प उपलब्ध हैं, और फिर भी आप कुछ याद कर सकते हैं।

आपको DeleteFile() को कॉल करने से पहले खुले हैंडल को बंद करने की भी आवश्यकता है। जो आपको FILE_FLAG_DELETE_ON_CLOSE ध्वज का उपयोग कर रहे हैं, वैसे भी आपको करने की आवश्यकता नहीं है।

बीटीडब्ल्यू, आपके कोड में एक छोटी सी बग है। आप एक अस्थायी स्ट्रिंग बना रहे हैं और इसे PWideChar को असाइन कर रहे हैं, लेकिन PWideChar वास्तव में उपयोग किए जाने से पहले, स्ट्रिंग स्कोप से बाहर हो जाती है, स्मृति को मुक्त करती है। आपका फ़ाइल नाम परिवर्तक PWideChar की बजाय स्ट्रिंग होना चाहिए। CreateFile() को कॉल करते समय टाइप-कास्ट करें, पहले नहीं।

इस प्रयास करें:

function IsDirectoryWriteable(const AName: string): Boolean; 
var 
    FileName: String; 
    H: THandle; 
begin 
    FileName := IncludeTrailingPathDelimiter(AName) + 'chk.tmp'; 
    H := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, 
    CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0); 
    Result := H <> INVALID_HANDLE_VALUE; 
    if Result then CloseHandle(H); 
end; 
+0

+1 (व्यक्तिगत रूप से मैं 'थंडल' की बजाय 'HFILE' का उपयोग करता हूं, लेकिन निश्चित रूप से यह केवल स्वाद का विषय है।) –

+1

अस्थायी स्ट्रिंग दायरे से बाहर नहीं जाती है। अस्थायी का दायरा समारोह में बाकी सब कुछ जैसा ही है। यह केवल तब नष्ट हो जाता है जब फ़ंक्शन निकलता है, या जब अस्थायी को एक और अस्थायी स्ट्रिंग रखने के लिए पुन: उपयोग करने की आवश्यकता होती है। –

+2

लेकिन आपको शायद "यादृच्छिक" फ़ाइल नाम का उपयोग करना चाहिए, क्योंकि फंक्शन वापसी FALSE, अगर फ़ाइल chk.tmp पहले से ही चेक निर्देशिका में मौजूद है। – Peter

2

एंड्रियास ...

सुरक्षा API का उपयोग करके किसी फ़ाइल के लिए प्रभावी अधिकार प्राप्त करने के लिए/निर्देशिका एक पिया गंदगी और सिर्फ विश्वसनीय नहीं है। (मैं सिर्फ अगर मैं dir में एक फ़ाइल लिख सकता है देखने के लिए जाँच के पक्ष में ऐसा करने के लिए मेरे कोड के सभी फेंक दिया।)

CF, http://www.ureader.com/msg/16591730.aspx

(मैं अन्य refs की है।, लेकिन मैं कर रहा हूँ एक नया उपयोगकर्ता और केवल एक लिंक पोस्ट कर सकता है। बस उपरोक्त लिंक में दिए गए यूआरएल के साथ पालन करें।)

0

निश्चित रूप से तुम सब करने की जरूरत है निर्देशिका के लिए अपनी पहुँच अधिकार की पुष्टि है।

function IsDirectoryWriteable(aName : String); 
var 
    FileObject : TJwSecureFileObject; 
    DesiredAccess: ACCESS_MASK; 
begin 
    DesiredAccess := FILE_GENERIC_WRITE; 
    FileObject := TJwSecureFileObject.Create(aName); 
    try 
    result := FileObject.AccessCheck(DesiredAccess); 
    finally 
    FileObject.Free; 
    end; 
end; 
2

यहाँ GetTempFileName उपयोग करते हुए मेरे संस्करण है जो लक्ष्य निर्देशिका में अद्वितीय अस्थायी फ़ाइल बनाने का प्रयास करेगा:: इस के साथ गलत क्या है

function IsDirecoryWriteable(const AName: string): Boolean; 
var 
    TempFileName: array[0..MAX_PATH] of Char; 
begin 
    { attempt to create a temp file in the directory } 
    Result := GetTempFileName(PChar(AName), '$', 0, TempFileName) <> 0; 
    if Result then 
    { clean up } 
    Result := DeleteFile(TempFileName); 
end; 
संबंधित मुद्दे

 संबंधित मुद्दे