Re: File Gotchas
Joerg Meier wrote:
Roedy Green wrote:
File o5 = new File( base, "/jgloss/pad.html" );
out.println( Misc.getCanOrAbsPath( o5 ) );
// prints:E:\mindprod\jgloss\encoding\jgloss\pad.html (ouch)
// You might have naively hoped for:
E:/mindprod/jgloss/pad.html
// However, File has no idea that / on your website refers to
E:/mindprod.
'File' is meant to assist with file-system navigation, not web navigation.
It is not an abstraction of a file system, either. It is "[a]n abstract representation of
file and directory pathnames."
It only models the names. From that point of view, all the behavior you observed
is consistent with expectation.
What website ? Now websites are involved ? Not really sure whats going on
here. Why would I hope that / randomly refers to E:/mindprod ? Why not to
E:/ or E:/mindprod/jgloss ?
In the case of 'File', you are not even promised that it refers to "/".
You are promised that it represents the pathname "/", the resource for which is
out of its scope.
Leaving out the part about a website that I don't understand, why would you
assume that Java randomly would pick the parts of the filename you were
thinking of ? I can see no indication why it would be that specific part
other than "If I wish really hard, maybe it will come true". At most, I
would have expected that a leading / would be interpreted as the drives
root, as it works under Linux.
Which is actually more than it does. All it represents is the pathname "/".
To put it another way, 'File' is not not responsible for how the pathname is
interpreted.
If that is the drive root, that's up to the OS service to which 'File' passes
the pathname.
File base2 = new File( "E:/mindprod/jgloss/encoding/utf8.html"
);
File o6 = new File( base2, "pad.html" );
out.println( Misc.getCanOrAbsPath( o6 ) );
// prints: E:\mindprod\jgloss\encoding\utf8.html\pad.html
(ouch)
new File( base2, "pad.html" );
E:/mindprod/jgloss/encoding/utf8.html/pad.html
E:\mindprod\jgloss\encoding\utf8.html\pad.html
Why "ouch"?
// You might have hoped for:
E:\mindprod\jgloss\encoding\pad.html
That would violate the documented behavior of the constructor:
"Creates a new File instance from a parent pathname string and a child pathname string."
That would be a defect that I would immediately file a bug report for. It
would mean that it would be impossible to access folders/directories that
It is not the job of 'File' to access any resource. Its job is only to manage pathnames
and the interaction of those pathnames with host services.
have a period in their name. Why you would hope that those would randomly
be cut off for no reason is beyond me.
And it would violate the contract.
... [snip] ...
Same response as above: what website ? Why would / refer to that particular
piece of the path ?
In point of fact, the shortcut of thinking that "/" refers to anything is a mismatch
to what 'File' actually does. 'File' manages the name and its communication to the OS.
The OS decides what it matches.
With that in mind, the logic of 'File''s documented behavior and Joerg's incredulity
that expectations would diverge therefrom are perfectly explicable.
--
Lew