Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between Files#delete(Path) and File#delete()

Tags:

I'm using Windows-7 with java 7 update 6 and found this weird (at least to me) behavior -
I have two files E:\delete1.txt and E:\delete2.txt both are read only files, when I try to delete file like following it gets deleted without any issues -

File file = new File("E:\\delete1.txt"); 
assertTrue(file.delete());

But when I delete file using nio API like following -

Path path = Paths.get("E:\\delete2.txt");
Files.delete(path);

It throws java.nio.file.AccessDeniedException.

Why different behavior for same operation with old and new nio API?

like image 323
Premraj Avatar asked Aug 27 '12 09:08

Premraj


People also ask

How do I compare two sets of files?

Click on the “Select Files or Folders” tab in the far left, to start a new comparison. Each comparison you run opens in a new tab. To start a new comparison, click on the “Select Files or Folders” tab in the far left, change the targets and click “Compare” again.


1 Answers

As discussed here - The issue is that java.io.File has many oddities, on Windows in particular. In this case it resets the file attributes before it deletes the file so this is why it does not fail as might be expected. It is behavior that dates back >10 years and so would be risky to change now. It has several other oddities like this, just one of the reason why it wasn't re-implemented to use the new API.

If we try to delete the file from command window then windows throws the same (Access denied) error but file gets deleted from explorer window. It appears the File#delete() has a wrong implementation and new Files#delete(Path) should be preferred instead.

like image 141
Premraj Avatar answered Oct 10 '22 03:10

Premraj