Follow links a bit more usefully.
This commit is contained in:
parent
aa9629005c
commit
509afd5252
1 changed files with 23 additions and 8 deletions
|
@ -38,7 +38,8 @@ module System.FilePath.Find (
|
||||||
, modificationTime
|
, modificationTime
|
||||||
, statusChangeTime
|
, statusChangeTime
|
||||||
|
|
||||||
, linkTarget
|
, readLink
|
||||||
|
, followStatus
|
||||||
|
|
||||||
, (~~?)
|
, (~~?)
|
||||||
, (/~?)
|
, (/~?)
|
||||||
|
@ -60,7 +61,8 @@ import Control.Monad.State (State(..), evalState)
|
||||||
import Data.Bits (Bits, (.&.))
|
import Data.Bits (Bits, (.&.))
|
||||||
import Data.List (sort)
|
import Data.List (sort)
|
||||||
import System.Directory (getDirectoryContents)
|
import System.Directory (getDirectoryContents)
|
||||||
import System.FilePath ((</>), takeDirectory, takeExtension, takeFileName)
|
import System.FilePath ((</>), replaceFileName, takeDirectory, takeExtension,
|
||||||
|
takeFileName)
|
||||||
import System.FilePath.GlobPattern (GlobPattern, (~~), (/~))
|
import System.FilePath.GlobPattern (GlobPattern, (~~), (/~))
|
||||||
import System.IO (hPutStrLn, stderr)
|
import System.IO (hPutStrLn, stderr)
|
||||||
import System.IO.Unsafe (unsafeInterleaveIO, unsafePerformIO)
|
import System.IO.Unsafe (unsafeInterleaveIO, unsafePerformIO)
|
||||||
|
@ -73,7 +75,11 @@ data FileInfo = FileInfo
|
||||||
infoPath :: FilePath
|
infoPath :: FilePath
|
||||||
, infoDepth :: Int
|
, infoDepth :: Int
|
||||||
, infoStatus :: F.FileStatus
|
, infoStatus :: F.FileStatus
|
||||||
}
|
} deriving (Eq)
|
||||||
|
|
||||||
|
instance Eq F.FileStatus where
|
||||||
|
a == b = F.deviceID a == F.deviceID b &&
|
||||||
|
F.fileID a == F.fileID b
|
||||||
|
|
||||||
mkFI :: FilePath -> Int -> F.FileStatus -> FileInfo
|
mkFI :: FilePath -> Int -> F.FileStatus -> FileInfo
|
||||||
|
|
||||||
|
@ -196,14 +202,23 @@ fileName = takeFileName `liftM` filePath
|
||||||
directory :: FindClause FilePath
|
directory :: FindClause FilePath
|
||||||
directory = takeDirectory `liftM` filePath
|
directory = takeDirectory `liftM` filePath
|
||||||
|
|
||||||
linkTarget :: FindClause (Maybe FilePath)
|
withLink :: (FilePath -> IO a) -> FindClause (Maybe a)
|
||||||
linkTarget = do
|
|
||||||
|
withLink f = do
|
||||||
path <- filePath
|
path <- filePath
|
||||||
st <- fileStatus
|
st <- fileStatus
|
||||||
return $ if F.isSymbolicLink st
|
return $ if F.isSymbolicLink st
|
||||||
then unsafePerformIO $ E.handle (const (return Nothing))
|
then unsafePerformIO $ E.handle (const (return Nothing)) $
|
||||||
(Just `liftM` F.readSymbolicLink path)
|
Just `liftM` f path
|
||||||
else Nothing
|
else Nothing
|
||||||
|
|
||||||
|
readLink :: FindClause (Maybe FilePath)
|
||||||
|
|
||||||
|
readLink = withLink F.readSymbolicLink
|
||||||
|
|
||||||
|
followStatus :: FindClause (Maybe F.FileStatus)
|
||||||
|
|
||||||
|
followStatus = withLink F.getFileStatus
|
||||||
|
|
||||||
data FileType = BlockDevice
|
data FileType = BlockDevice
|
||||||
| CharacterDevice
|
| CharacterDevice
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue