66

For some reason I keep getting java.nio.file.AccessDeniedException every time I try to write to a folder on my computer using a java webapp on Tomcat. This folder has permissions set to full control for everyone on my computer (Windows). Does anybody know why I get this exception?

Here's my code:

public void saveDocument(String name, String siteID, byte doc[]) {
    try {
        Path path = Paths.get(rootDirectory + siteID);
        if (Files.exists(path)) {
            System.out.println("Exists: " + path.toString());
            Files.write(path, doc);
        } else {
            System.out.println("DOesn't exist");
            throw new Exception("Directory for Site with ID " + siteID + "doesn't exist");
        }
    } catch (FileSystemException e) {
        System.out.println("Exception: " + e);
        e.printStackTrace();
    } catch (IOException e ) {
        System.out.println("Exception: " + e);
        e.printStackTrace();
    } catch (Exception e) {
        System.out.println("Exception: " + e);
        e.printStackTrace();
    }

And here is the error:

Exception: java.nio.file.AccessDeniedException: C:\safesite_documents\site1 java.nio.file.AccessDeniedException: C:\safesite_documents\site1 at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:83) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230) at java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:430) at java.nio.file.Files.newOutputStream(Files.java:172) at java.nio.file.Files.write(Files.java:3092)

Possible reason why: See my post on supersuser about how I can't uncheck 'Read Only' for any of my folders on windows 7. Even though all the folders aren't read only to anything but java.

Serban Petrescu
  • 4,734
  • 2
  • 14
  • 31
OneTwo
  • 1,445
  • 5
  • 22
  • 45
  • try to write to folder in other drive and check. – Prashant Feb 23 '15 at 10:00
  • 1
    No it doesn't work with a different drive or a different folder. One thing it may be is that all my folders on my pc are marked as 'Read Only' Even though they aren't read only. And when I un-mark they just get checked again after. – OneTwo Feb 23 '15 at 10:06
  • @OneTwo, Is there any possibility that same path is being using by any other code. Like where you have accessed the same path and forget to release the resources. – Amogh Feb 23 '15 at 10:48
  • No I have tried writing a byte array in a test java main method, project with nothing else and I still get the same error. I have no other applications open which are accessing the folder as far as I can see. – OneTwo Feb 23 '15 at 10:51
  • I made same mistake, you must target the file not the folder. But why does it throw that exception? It has nothing to do with access of the file/folder, right? – Stefan Jankovic Jul 20 '20 at 11:54

5 Answers5

98

Ok it turns out I was doing something stupid. I hadn't appended the new file name to the path.

I had

rootDirectory = "C:\\safesite_documents"

but it should have been

rootDirectory = "C:\\safesite_documents\\newFile.jpg" 

Sorry it was a stupid mistake as always.

Ahmed Ashour
  • 4,209
  • 10
  • 29
  • 46
OneTwo
  • 1,445
  • 5
  • 22
  • 45
  • 2
    This seems to be the main cause for `java.nio.file.AccessDeniedException`. It's hard to debug sometimes, but, if you get this, you should check all your system properties set with `java` and your config files – Marko Pacak Jul 04 '18 at 13:01
  • just sharing, mine is that the system properties do not allow my server "jboss" to write the file. +1 for @MarkoPacak – 薛源少 Aug 29 '18 at 06:51
  • 1
    Been a while since I did development on Windows like this, but I'm pretty sure you don't need \\ and can instead use / – Christopher Schneider Sep 06 '19 at 19:15
1

I was getting the same error when trying to copy a file. Closing a channel associated with the target file solved the problem.

Path destFile = Paths.get("dest file");
SeekableByteChannel destFileChannel = Files.newByteChannel(destFile);
//...
destFileChannel.close();  //removing this will throw java.nio.file.AccessDeniedException:
Files.copy(Paths.get("source file"), destFile);
ekene
  • 19
  • 2
1

Not the answer for this question

I got this exception when trying to delete a folder where i deleted the file inside.

Example:

createFolder("folder");  
createFile("folder/file");  
deleteFile("folder/file");  
deleteFolder("folder"); // error here

While deleteFile("folder/file"); returned that it was deleted, the folder will only be considered empty after the program restart.

On some operating systems it may not be possible to remove a file when it is open and in use by this Java virtual machine or other programs.

https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#delete-java.nio.file.Path-

Explanation from dhke

thiagola92
  • 399
  • 3
  • 8
1

Getting java.nio.file.AccessDeniedException when trying to write to a folder

Unobviously, Comodo antivirus has an "Auto-Containment" setting that can cause this exact error as well. (e.g. the user can write to a location, but the java.exe and javaw.exe processes cannot).

In this edge-case scenario, adding an exception for the process and/or folder should help.

Temporarily disabling the antivirus feature will help understand if Comodo AV is the culprit.

I post this not because I use or prefer Comodo, but because it's a tremendously unobvious symptom to an otherwise functioning Java application and can cost many hours of troubleshooting file permissions that are sane and correct, but being blocked by a 3rd-party application.

tresf
  • 3,691
  • 3
  • 26
  • 78
0

Delete .android folder cache files, Also delete the build folder manually from a directory and open android studio and run again.

enter image description here

vinod
  • 958
  • 13
  • 18