Name: sg39081 Date: 04/06/98
If the path contains a trailing separator, File.getParent returns the
same pathname with the trailing separator removed instead of
returning the parent path.
For example, if path is "first/second/" then getParent returns
"first/second" instead of "first".
This problem manifests itself on both win32 and AIX when
unpacking a jarred file if the file was created using the
pathname of subdirectories. For example, if test .jar is created
using "jar cvf test.jar first/second" then "jar xvf test.jar"
terminates with:
java.io.IOException: first/second/: could not create directory
at sun.tools.jar.Main.extractFile(Main.java:395)
at sun.tools.jar.Main.extract(Main.java:375)
at sun.tools.jar.Main.run(Main.java:106)
at sun.tools.jar.Main.main(Main.java:524)
This does not occur of the file is created with "jar cvf test.jar
first" because the structure of the file is different and does
not require calls to getParent.
The trailing separator can be allowed for by adding a test at
the start of getParent as follows:
--------------------------------------------------------------------------------------
public String getParent() {
int index = path.lastIndexOf(separatorChar);
// ignore trailing separator
if (index == path.length() - 1)
index = path.substring(0, index - 1).lastIndexOf(separatorChar); ..........
---------------------------------------------------------------------------------------
From the language spec for java.io.File:
"A File object contains a path, which is a character string that
can be used to identify a file within a file system. A path is
assumed to consist of two parts, the directory and the file name,
separated by the last occurrence within the path of a particular
character known as the separator character."
... and for java.io.File.getParent:
"If the path has a parent directory, a String representing the
path of that parent directory is returned; otherwise, null is
returned."
The assumption in the first paragraph about the last occurrence
of the separator doesn't hold if the path ends with a separator. A final separator is redundant but accepted on many
operating systems. It isn't clear whether the assumption is
intended to define the meaning of "parent" in the second
paragraph. Either:
a) File.getParent should ignore redundant final separators
or
b) File.mkdirs should allow for the behaviour of getParent.
(The above jar example is a case where it currently fails because it tries to make the
same directory twice.)
(Review ID: 27654)
======================================================================
- duplicates
-
JDK-4123637 java.io.File.getParent() returns "/u/test" as the parent of "/u/test/"
-
- Closed
-