[Haskell-cafe] Path names (again?)

Vincenzo aka Nick Name vincenzo_mlRE.MOVE at yahoo.it
Thu Feb 5 22:44:42 EST 2004


Alle 19:13, giovedì 5 febbraio 2004, Glynn Clements ha scritto:
> > - concatenate file paths
>
>         (concat . intersperse "/")
>
> Maybe you wanted something more, e.g. canonicalisation?
>

Yes, maybe an interface to realpath(3) is what I really need.

> > - tell if a path is absolute or relative
>
>         ((== '/') . head)
>

Agreed :)

> > - chase symlinks
>
> I was going to ask what you meant here but, AFAICT, Haskell (at
> least, GHC 5.04) doesn't appear to recognise the existence of
> symlinks. So, whatever you meant, the answer is probably "no".
>

I currently use module System.Posix from ghc6, there are stat and lstat 
equivalents, what I want is to get the true file pointed from a symlink 
after having known that it is a symlink, this can be done with 
recursion of course, and it's trivial; I was just wondering if it was 
implemented somewhere else, because I am not so expert in working with 
filesystems and could make some mistake (e.g: I realized only recently 
that using an hashtable of already visited files is necessary to avoid 
ciclic links; also, without getting the canonical path, I could visit a 
file twice).

> > - find all the files in a directory (yes, that's what I need :))
>
> Define "file" (e.g. "regular file", "anything other than a
> directory", "directory entry" etc). Also, define "in"; i.e. are you
> talking about a recursive search (like "find")?
>

Yes, I forgot to say "recursively". I have an ocaml implementation but 
it's prone to errors because of missing "canonicalization", so I did 
not want to translate that in haskell for the same problem. Currently I 
workarounded this all by forking "find", but it's prone to errors too 
because I have no way to distinguish between newlines ending a file 
name and newlines in the middle of a file name. I should put something 
like "///" with "find -printf" at the end of each file name, and then 
parse that, but it would really be preferable to code an haskell 
library function equivalent to unix find.

> Recursion is a somewhat harder (maybe even impossible), given that
> doesDirectoryExist doesn't distinguish between a directory and a
> symlink to a directory, and the Posix module doesn't appear to
> include anything which would be of use (e.g. a binding for lstat()).

Yes, the System.Posix module in ghc6 has more features, but I still 
don't like to handcode functions like "realpath"; if there is nothing 
else maybe the best thing is to write a binding to this function (I 
never did that but guess it's a one-liner), and to carefully read 
source code for gnu find and implement it in haskell the same way.

V.

-- 
Teatri vuoti e inutili potrebbero affollarsi
se tu ti proponessi di recitare te
[CCCP]




More information about the Haskell-Cafe mailing list