2011-12-20 10 views
15

में निर्देशिका सामग्री निर्देशिका में फ़ाइलों की सूची को अपने पूर्ण पथ के साथ वापस करने का कोई तरीका है।हास्केल

जब मैं

getDirectoryContents dir 

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

उत्तर

16
getAbsDirectoryContents :: FilePath -> IO [FilePath] 
getAbsDirectoryContents dir = 
    getDirectoryContents dir >>= mapM (canonicalizePath . (dir </>)) 

यह System.Directory.canonicalizePath का उपयोग करता है, और काम करता है, भले ही dir एक निरपेक्ष पथ नहीं है (उदाहरण के लिए यदि आप getAbsDirectoryContents "foo" फोन और उसके बाद फाइल सिस्टम में कहीं और ले जाते हैं)।

आप जानते हैं कि dir एक पूर्ण पथ है, तो आप के बजाय का उपयोग कर सकते हैं:

getAbsDirectoryContents :: FilePath -> IO [FilePath] 
getAbsDirectoryContents dir = map (dir </>) <$> getDirectoryContents dir 

जो System.FilePath.(</>) का उपयोग करता है, और एक सा तेजी से हो सकता है।

+1

यह देखते हुए कि इस समाधान काम करने के लिए, आप System.FilePath () और Data.Functor आयात करने की आवश्यकता के लायक हो सकता है (<$>) –

3
import System.Directory (getDirectoryContents) 
import System.FilePath ((</>)) 

getAbsoluteDirContents :: String -> IO [FilePath] 
getAbsoluteDirContents dir = do 
    contents <- getDirectoryContents dir 
    return $ map (dir </>) contents