2010-06-04 7 views
11

में एक अस्थायी निर्देशिका बनाएं Haskell में सुरक्षित रूप से अस्थायी निर्देशिका बनाने का उचित तरीका क्या है? System.IO अस्थायी फ़ाइलें बनाने के तरीके प्रदान करता है, लेकिन मुझे निर्देशिकाओं के लिए ऐसा कुछ भी नहीं मिल रहा है, न तो वहां और न ही System.Directory, System.Posix.Directory, न ही System.Posix.Temp। क्या कोई ऐसा कार्य है जिसे मैं देख रहा हूं, या मुझे खुद को लिखने की ज़रूरत है?हास्केल

withTemporaryDirectory :: FilePath -> (FilePath -> IO a) -> IO a

हैं: (? और यदि ऐसा है तो, वहाँ किसी भी खतरों से बचने के लिए, वहाँ अस्थायी फ़ाइलों को बनाने के साथ कर रहे हैं की तरह हैं)

उत्तर

6

यूनिक्स प्रणालियों के साथ विशेष रूप से काम कर के लिए, Unixutils पैकेज इस तरह के एक समारोह में शामिल आपको विंडोज और यूनिक्स सिस्टम दोनों पर काम करने की आवश्यकता है, आप इसके बजाय अस्थायी पैकेज का उपयोग करना चाहेंगे। यह एक अलग प्रकार हस्ताक्षर के साथ एक ही कार्य है:

withTemporaryDirectory :: FilePath -> String -> (FilePath -> IO a) -> IO a

+1

यह निर्देशिका देता है जहां नई अस्थायी फ़ाइलें बनाई जाएंगी (यानी आमतौर पर "/ tmp")। यह वास्तव में एक अस्थायी निर्देशिका नहीं बनाता है। –

+0

@ ट्रेविस एसीके! साथ ही समकालीन डायरेक्टरी जो मैं खोज रहा था। –

+0

यह मेरे मन में उपयोग के साथ अच्छी तरह से फिट बैठता है, क्योंकि जब मैं इसके साथ काम करता हूं तो यह निर्देशिका के सफाई को स्वचालित करता है। –

2

आप एक उदाहरण के लिए कबाल स्रोत के Distribution.Compat.TempFile मॉड्यूल को देखो सकता है। यह createTempDirectory को परिभाषित करता है इस प्रकार है (जहां c_getpid और mkPrivateDir प्लेटफ़ॉर्म-विशिष्ट हैं):

createTempDirectory :: FilePath -> String -> IO FilePath 
createTempDirectory dir template = do 
    pid <- c_getpid 
    findTempName pid 
    where 
    findTempName x = do 
     let dirpath = dir </> template ++ show x 
     r <- try $ mkPrivateDir dirpath 
     case r of 
     Right _ -> return dirpath 
     Left e | isAlreadyExistsError e -> findTempName (x+1) 
       | otherwise    -> ioError e 

तथ्य यह है कि कबाल इस समारोह को परिभाषित करता है पता चलता है वहाँ यह करने के लिए एक मानक तरीका नहीं है कि।

+3

यह कार्यक्षमता अब ['अस्थायी'] (http://hackage.haskell.org/package/temporary) पैकेज में फैली हुई है। – bgamari

0

@Nikita Volkov ने सुझाव दिया है, मैं एक अलग जवाब के रूप में @Thomas एम Dubuisson की टिप्पणी पोस्ट कर रहा हूँ:

temporary पैकेज का प्रयोग करें। यह अस्थायी फ़ाइलों और निर्देशिकाओं का उपयोग करने के लिए एक सुविधाजनक मंच-स्वतंत्र एपीआई प्रदान करता है। उपयोग के बाद अस्थायी फ़ाइलें और निर्देशिका स्वचालित रूप से हटा दी जाती हैं।