Haskell在目录中获取目录
如何获取目录中的目录列表 我提出了以下建议,但我希望有一种更优雅的方式:Haskell在目录中获取目录,haskell,Haskell,如何获取目录中的目录列表 我提出了以下建议,但我希望有一种更优雅的方式: import System.Directory import qualified Filesystem.Path as FsP import Filesystem.Path.CurrentOS import Control.Monad getDirectories :: Prelude.FilePath -> IO [Prelude.FilePath] getDirectories x = do listDir
import System.Directory
import qualified Filesystem.Path as FsP
import Filesystem.Path.CurrentOS
import Control.Monad
getDirectories :: Prelude.FilePath -> IO [Prelude.FilePath]
getDirectories x = do
listDirectory x
>>= (return . fmap decodeString)
>>= return . fmap (FsP.append (decodeString x))
>>= (return . fmap encodeString)
>>= filterM doesDirectoryExist
看起来您正在使用不推荐使用的软件包,不如改用该软件包:
import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, listDirectory)
import System.FilePath ((</>))
getDirectories :: FilePath -> IO [FilePath]
getDirectories filePath = do
allFiles <- listDirectory filePath
filterM (doesDirectoryExist . (filePath </>)) allFiles
导入控制.Monad(filterM)
导入System.Directory(doesDirectoryExist,listDirectory)
导入System.FilePath(())
GetDirectory::FilePath->IO[FilePath]
getDirectories filePath=do
所有文件IO[文件路径]
GetDirectory文件路径=listDirectory文件路径
>>=filterM(doesDirectoryExist.(文件路径))
注意:您的函数版本将返回列表中每个输出目录的输入文件路径。虽然这可能是您想要的,但我给您的getDirectories
版本可能更通用,因为它的行为与listDirectory
完全相同,只需修剪文件/可执行文件
EDIT:将导入从
System.FilePath.Posix
更改为System.FilePath
,以实现真正的平台独立性。感谢您的建议。您只需要System.Directory
import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, getCurrentDirectory, getDirectoryContents)
listDirs :: IO [FilePath]
listDirs = getCurrentDirectory >>= getDirectoryContents >>= filterM doesDirectoryExist
import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, getCurrentDirectory)
listDirs :: FilePath -> IO [FilePath]
listDirs path = getDirectoryContents path >>= filterM (doesDirectoryExist . (++) path)
如果要将filepath作为参数传递,请不要使用getCurrentDirectory
import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, getCurrentDirectory, getDirectoryContents)
listDirs :: IO [FilePath]
listDirs = getCurrentDirectory >>= getDirectoryContents >>= filterM doesDirectoryExist
import Control.Monad (filterM)
import System.Directory (doesDirectoryExist, getCurrentDirectory)
listDirs :: FilePath -> IO [FilePath]
listDirs path = getDirectoryContents path >>= filterM (doesDirectoryExist . (++) path)
当您已经使用
>=
运算符时,是否需要Do
符号?您是正确的,它不需要。带有getCurrentDirectory
的示例应该可以工作,但是另一个不会getDirectoryContents
提供相对文件路径中的内容,而不是绝对的@basil henry fixedWell您现在缺少路径分隔符“/”或“\”(在Windows上)。在我的解决方案中,我使用文件路径
包中的()
对路径进行依赖于平台的附加。您只需将其作为参数传递即可foo/
而不是foo
。bfd。如果你想变得迂腐,你应该导入System.FilePath
,而不是System.FilePath.Posix
,以实现真正的平台独立性。很公平!)