I'm working on a project which, in part, displays all the files in a directory in a JTable, including sub-directories. Users can double-click the sub-directories to update the table with that new directory's content. However, I've run into a problem.
My lists of files are generated with file.listFiles(), which pulls up everything: hidden files, locked files, OS files, the whole kit and caboodle, and I don't have access to all of them. For example, I don't have permission to read/write in "C:\Users\user\Cookies\" or "C:\ProgramData\ApplicationData\". That's ok though, this isn't a question about getting access to these. Instead, I don't want the program to display a directory it can't open. However, the directories I don't have access to and the directories I do are behaving almost exactly the same, which is making it very difficult to filter them out.
The only difference in behavior I've found is if I call listFiles() on a locked directory, it returns null.
Here's the block of code I'm using as a filter:
for(File file : folder.listFiles())
if(!(file.isDirectory() && file.listFiles() == null))
The problem you have is that you are dealing with
File. By all accounts, in 2016, and, in fact, since 2011 (when Java 7 came out), it has been superseded by JSR 203.
Now, what is JSR 203? It is a totally new API to deal with anything file systems and file system objects; and it extend the definition of a "file system" to include what you find on your local machine (the so called "default filesystem" by the JDK) and other file systems which you may use.
Among the many advantages of this API is that it grants access to metadata which you could not access before; for instance, you specifically mention the case, in a comment, that you want to know which files Windows considers as "system files".
This is how you can do it:
// get the path final Path path = Paths.get(...); // get the attributes final DosAttributes attrs = Files.readAttributes(path, DosFileAttributes.class); // Is this file a "system file"? final boolean isSystem = attrs.isSystem();
Now, what is
Paths.get()? As mentioned previously, the API gives you access to more than one filesystem at a time; a class called
FileSystems gives access to all file systems visible by the JDK (including creating new filesystems), and the default file system, which always exists, is given by
FileSystem instance also gives you access to a
Combine this and you get that those two are equivalent:
Paths.get(a, b, ...) FileSystems.getDefault().getPath(a, b, ...)