The pike wrapper for the last (Stdio.File.open) does actually work for dirs too, but it's of very limited use (you can't read or write to an Stdio.File which has an opened directory). I dare say that's a bug too since it's neither useful nor expected.
It is useful, since you can use it as a starting point for directory operations:
object f = Stdio.File("/etc"); f->openat("motd", "r")->read();
(1) Result: "Sun Microsystems Inc.\tSunOS 5.10\tGeneric\tJanuary 2005\n"