Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Checking for write access in a directory before creating files inside it

My small utility application asks the user for an output directory via a GUI file selector. Then it creates a lot of files in this output directory after some processing.

I need to check if the application has write access so that it informs the user and does not continue with the processing (which might take a long time)

My first attempt was the canWrite() method of java.io.File. But this does not work since it deals with the directory entry itself and not its contents. I have seen at least one instance of a Windows XP folder that can be renamed or deleted but no files may be created in it (because of permissions). This is actually my testcase.

I finally settled with the following solution

//User places the input file in a directory and selects it from the GUI
//All output files will be created in the directory that contains the input file
File fileBrowse = chooser.getSelectedFile(); //chooser is a JFileChooser
File sample = new File(fileBrowse.getParent(),"empty.txt"); 
try
{
     /*
      * Create and delete a dummy file in order to check file permissions. Maybe 
      * there is a safer way for this check.
      */
      sample.createNewFile();
      sample.delete();
}
catch(IOException e)
{
      //Error message shown to user. Operation is aborted
}

However this does not feel elegant to me since it just tries to actually create a file and checks if the operation succeeds.

I suspect that there must be a better way for this but all solutions I have found so far with Security Managers and stuff deal with Java Applets and not standalone applications. Am I missing something?

What is the recommended way of checking for file access inside a directory before actually writing the files?

I am using Java 5.

like image 655
kazanaki Avatar asked Aug 13 '09 13:08

kazanaki


People also ask

How do I check if a folder has write permissions?

Step 2 – Right-click the folder or file and click “Properties” in the context menu. Step 3 – Switch to “Security” tab and click “Advanced”. Step 4 – In the “Permissions” tab, you can see the permissions held by users over a particular file or folder.

What is write permission for directory?

Permissions for directories Write permission means that a user may create files in the directory. Execute permission means that the user may enter the directory (i.e. make it his current directory.)

What permissions are applied to a directory in the file system?

For directories, execute permission allows you to enter the directory (i.e., cd into it), and to access any of its files. Under both UFS and NFS, permissions exist separately for user, group, and others. User (u) permissions apply to the owner of the file.

What permissions are needed for a user to enter a directory?

For directories, execute permission allows you to enter the directory (i.e., cd into it), and to access any of its files. Under both UFS and NFS, permissions exist separately for user, group, and others. User (u) permissions apply to the owner of the file.


1 Answers

You could check the file permissions, make sure the directory exists, and do a lot of checking or find a library that does all that checking for you BUT (!) isn't the best way of checking to try ? If you check for permissions and the filesystem changes... you will have to change your code. But trying to write a file will ALWAYS tell you if you can write a file.

Your solution doesn't have to be the most elegant one. It's not a cheap hard coded patch or something ugly. It's just normal code. And it will always work. But if you don't like to see that check in the code just separate it by putting it in class which only goal is to check for the possibly of writing. In fact, you should put it in a utility class wheter you like the elegance or not.

The other solution would be to place your whole writing-to-the-hard-drive code, in the try. And if you can't write, the whole part will be skipped and you give feedback to the user with a message in the catch part.

like image 52
Philippe Carriere Avatar answered Oct 13 '22 12:10

Philippe Carriere