On Solaris or Linux, if you do:
rm -f -r bozo_land
mkdir -p bozo_land/abc/../def/../ghi
what do you expect? Turns out you get all the necessary directories created:
bozo_land/abc, bozo_land/def, and bozo_land/ghi
With java's java.io.File mkdirs() method, it seems rather... what can I say, confused???
import java.io.File;
public class Bug {
public static void main(String args[]) {
File f = new File("bozo_land/abc/../def/../ghi");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("First try: f.mkdirs()=" + f.mkdirs());
System.out.println("First try: f.exists()=" + f.exists());
System.out.println("Second try: f.mkdirs()=" + f.mkdirs());
System.out.println("Second try: f.exists()=" + f.exists());
f = new File("bozo_land");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
f = new File("bozo_land/abc");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
f = new File("bozo_land/abc/..");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
f = new File("bozo_land/abc/../def");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
f = new File("bozo_land/abc/../def/..");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
f = new File("bozo_land/abc/../def/../ghi");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
}
}
Most java implementations do this:
bonsai<12> rm -f -r bozo_land/
bonsai<13> java Bug
f = new File(bozo_land/abc/../def/../ghi)
First try: f.mkdirs()=true <--- It thinks it created the path ok
First try: f.exists()=false <--- But it says it does not exist because abc and def were not created
Second try: f.mkdirs()=false <--- Probably because it thinks it was created already (ghi exists)
Second try: f.exists()=false
f = new File(bozo_land)
f.exists()=true
f = new File(bozo_land/abc)
f.exists()=false
f = new File(bozo_land/abc/..)
f.exists()=false
f = new File(bozo_land/abc/../def)
f.exists()=false
f = new File(bozo_land/abc/../def/..)
f.exists()=false
f = new File(bozo_land/abc/../def/../ghi)
f.exists()=false
The javadoc on mkdirs() says:
true if and only if the directory was created, along with all necessary parent directories; false otherwise
Granted, abc and def are not technically parent directories. But if after a successful mkdirs(), it still does not exist, that seems bad.
rm -f -r bozo_land
mkdir -p bozo_land/abc/../def/../ghi
what do you expect? Turns out you get all the necessary directories created:
bozo_land/abc, bozo_land/def, and bozo_land/ghi
With java's java.io.File mkdirs() method, it seems rather... what can I say, confused???
import java.io.File;
public class Bug {
public static void main(String args[]) {
File f = new File("bozo_land/abc/../def/../ghi");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("First try: f.mkdirs()=" + f.mkdirs());
System.out.println("First try: f.exists()=" + f.exists());
System.out.println("Second try: f.mkdirs()=" + f.mkdirs());
System.out.println("Second try: f.exists()=" + f.exists());
f = new File("bozo_land");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
f = new File("bozo_land/abc");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
f = new File("bozo_land/abc/..");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
f = new File("bozo_land/abc/../def");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
f = new File("bozo_land/abc/../def/..");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
f = new File("bozo_land/abc/../def/../ghi");
System.out.println("f = new File(" + f.getPath() + ")");
System.out.println("f.exists()=" + f.exists());
}
}
Most java implementations do this:
bonsai<12> rm -f -r bozo_land/
bonsai<13> java Bug
f = new File(bozo_land/abc/../def/../ghi)
First try: f.mkdirs()=true <--- It thinks it created the path ok
First try: f.exists()=false <--- But it says it does not exist because abc and def were not created
Second try: f.mkdirs()=false <--- Probably because it thinks it was created already (ghi exists)
Second try: f.exists()=false
f = new File(bozo_land)
f.exists()=true
f = new File(bozo_land/abc)
f.exists()=false
f = new File(bozo_land/abc/..)
f.exists()=false
f = new File(bozo_land/abc/../def)
f.exists()=false
f = new File(bozo_land/abc/../def/..)
f.exists()=false
f = new File(bozo_land/abc/../def/../ghi)
f.exists()=false
The javadoc on mkdirs() says:
true if and only if the directory was created, along with all necessary parent directories; false otherwise
Granted, abc and def are not technically parent directories. But if after a successful mkdirs(), it still does not exist, that seems bad.