Like Gerd pointed out the trailing slash handing in Posix semantic is there because a/b/x and a/b/x/ point to the same file. When combined with naive (but correct in a POSIX setting) application you can end-up with multiple // in the middle of a path (In posix pathname resolution multiple /'s are treated exactly like single slashes). This can happen:
let mydir = "/a/b/" in let myfile = mydir ^ "/myfile" in now you have myfile = "/a/b//myfile" and (with current ocaml semantic): basename (basename myfile) = "a/b" This can be solved by using a clever Filename.concat (the one in janestreet's core strips out all the extra '.' and '/' around the concatenation point) but should really be solved in basename/filename. Till On Tue, Dec 27, 2011 at 2:42 PM, Gerd Stolpmann <[email protected]> wrote: > Hi, > > I've done a lot of system programming in the past years, and I cannot > remember that I had to work around this small incompatibility. > > Semantically, the POSIX specs are better, because only directories are > allowed to have trailing slashes, and if you want to get the basename of > "path/" you want the name of the directory in >99% of the cases. The > trailing slash has only the meaning that it is asserted that the path > refers to a directory. And operations like "basename" better ignore such > assertions. > > There could be a problematic area, though: URLs. A trailing slash means > here a different resource. I don't know whether anybody is using > basename in this context. > > Gerd > > Am Dienstag, den 27.12.2011, 17:29 +0100 schrieb Damien Doligez: >> Hello, >> >> I would like to get some comments from the OCaml community at large about >> the problem raised in http://caml.inria.fr/mantis/view.php?id=4549 >> >> In a nutshell, the problem is that our version of basename and dirname >> are not exactly the same as the Open Group's definition. >> >> We can easily implement the standard behaviour for basename and dirname, >> and it seems desirable, but there is a catch: we will have to change >> the specification of the standard library slightly. >> >> Currently, we specify this: >> >> [concat (dirname name) (basename name)] returns a file name >> which is equivalent to [name]. Moreover, after setting the >> current directory to [dirname name] (with {!Sys.chdir}), >> references to [basename name] (which is a relative file name) >> designate the same file as [name] before the call to {!Sys.chdir}. >> >> With the Open Group basename and dirname, this becomes false for >> names that include some trailing slashes, because such slashes >> are removed by basename. This means that a name "foo/bar/" >> becomes "foo/bar" when put through >> [concat (dirname name) (basename name)] >> and opening "foo/bar" may succeed if it is a file, while >> opening "foo/bar/" would fail. >> >> I would like to know if anyone relies on the precise behaviour >> documented in the standard library, and for everyone else, would >> you prefer the old behaviour or the new (standard) behaviour? >> >> -- Damien >> >> > > > > -- > Caml-list mailing list. Subscription management and archives: > https://sympa-roc.inria.fr/wws/info/caml-list > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs > -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs
