> > What you wrote doesn't work for dir="C:" and file=""... 
> > InvalidArc is raised.
> 
> Not when I run it.  I get "C:/".
Not the brightest thing I've ever said :-(.
How about the following?
fun joinDirFile {dir, file} =
   let
      val {arcs, isAbs, vol} = fromString dir
      val arcs = 
	 case (arcs, file) of
	    ([], "") => []
	  | _ => concatArcs (arcs, [file])
   in
      toString {arcs = arcs,
		isAbs = isAbs,
		vol = vol}
   end