In Win95 JDK 1.1.1, File.delete() fails to delete the file from disk
Here is a reproducible test case:
import java.io.*;
public class BugReport
{
RandomAccessFile tmp_file = null;
File file;
public BugReport(String args[])
{
file = new File("foo");
try
{
tmp_file = new RandomAccessFile(file, "rw");
}
catch (IOException e)
{
System.out.println("Error opening tmp file: " + e + ", exiting...");
System.exit(0);
}
reopen_file();
try
{
tmp_file.close();
}
catch (IOException e)
{
System.out.println("File close error: " + e + ", exiting...");
System.exit(0);
}
if (!file.delete()) System.out.println("Error deleting file");
}
public void reopen_file()
{
String data;
try
{
tmp_file = new RandomAccessFile(file, "rw");
}
catch (IOException e)
{
System.out.println("Error opening tmp file");
return;
}
try
{
tmp_file.close();
}
catch (IOException e){}
}
public static void main(String args[])
{
new BugReport(args);
}
}
To verify the bug, just create an ASCII file named "foo", add a few bytes
to it and save it. Then, in the same directory, compile and run BugReport,
the attached Java source file. On Win 95 an error message is printed, indicating
that the file was not deleted; on Solaris, "foo" gets deleted, as it should.
If you comment out the call to reopen_file(), I believe "foo" will get deleted.
mei.chan@Corp 1997-04-24
The problem turned out to be not a bug. We discovered a difference
between Win95 and Solaris file system implementation.
On Solaris you can File.delete() an open file.
On Win95, you have to call tmp_file.close() before deleting the file.
The Win95 OS keeps track of open files and would not allow you to delete the
file until you explicitly close it.
Here is the modified test case which would show the difference in behavior,
ie. File.delete() on a file without closing it:
import java.io.*;
public class BugReport
{
RandomAccessFile tmp_file = null;
File file;
public BugReport(String args[])
{
file = new File("foo");
try
{
tmp_file = new RandomAccessFile(file, "rw");
System.out.println("created the file");
}
catch (IOException e)
{
System.out.println("Error opening tmp file: " + e + ", exiting...");
System.exit(0);
}
if (file.exists())
System.out.println("File exists");
else
System.out.println("File does not exist");
if (!file.delete())
System.out.println("Error deleting file");
else System.out.println ("Deleted the file");
}
public static void main(String args[])
{
new BugReport(args);
}
}
Results on Solaris:
chicosun:/home/meiphen/java/progs/file_delete 78 % java BugReport
created the file
File exists
Deleted the file
Results on Win95:
created the file
File exists
Error deleting the file
Here is a reproducible test case:
import java.io.*;
public class BugReport
{
RandomAccessFile tmp_file = null;
File file;
public BugReport(String args[])
{
file = new File("foo");
try
{
tmp_file = new RandomAccessFile(file, "rw");
}
catch (IOException e)
{
System.out.println("Error opening tmp file: " + e + ", exiting...");
System.exit(0);
}
reopen_file();
try
{
tmp_file.close();
}
catch (IOException e)
{
System.out.println("File close error: " + e + ", exiting...");
System.exit(0);
}
if (!file.delete()) System.out.println("Error deleting file");
}
public void reopen_file()
{
String data;
try
{
tmp_file = new RandomAccessFile(file, "rw");
}
catch (IOException e)
{
System.out.println("Error opening tmp file");
return;
}
try
{
tmp_file.close();
}
catch (IOException e){}
}
public static void main(String args[])
{
new BugReport(args);
}
}
To verify the bug, just create an ASCII file named "foo", add a few bytes
to it and save it. Then, in the same directory, compile and run BugReport,
the attached Java source file. On Win 95 an error message is printed, indicating
that the file was not deleted; on Solaris, "foo" gets deleted, as it should.
If you comment out the call to reopen_file(), I believe "foo" will get deleted.
mei.chan@Corp 1997-04-24
The problem turned out to be not a bug. We discovered a difference
between Win95 and Solaris file system implementation.
On Solaris you can File.delete() an open file.
On Win95, you have to call tmp_file.close() before deleting the file.
The Win95 OS keeps track of open files and would not allow you to delete the
file until you explicitly close it.
Here is the modified test case which would show the difference in behavior,
ie. File.delete() on a file without closing it:
import java.io.*;
public class BugReport
{
RandomAccessFile tmp_file = null;
File file;
public BugReport(String args[])
{
file = new File("foo");
try
{
tmp_file = new RandomAccessFile(file, "rw");
System.out.println("created the file");
}
catch (IOException e)
{
System.out.println("Error opening tmp file: " + e + ", exiting...");
System.exit(0);
}
if (file.exists())
System.out.println("File exists");
else
System.out.println("File does not exist");
if (!file.delete())
System.out.println("Error deleting file");
else System.out.println ("Deleted the file");
}
public static void main(String args[])
{
new BugReport(args);
}
}
Results on Solaris:
chicosun:/home/meiphen/java/progs/file_delete 78 % java BugReport
created the file
File exists
Deleted the file
Results on Win95:
created the file
File exists
Error deleting the file
- relates to
-
JDK-4722539 File.delete() doesn't work the same between Windows & Unix
- Closed