Checking the case of a filename on Windows
May 23, 2013 [Java, Programming, Tech]Windows generally uses a case-insensitive but not case-preserving file system.
When writing some code that is intended to be used on Linux as well as Windows, I wanted it to fail on Windows in the same cases that it would fail on Linux, and this meant detecting when the case of a filename differed from its canonical case on the file system.
I want to ask "is this file name correct in terms of case?"
I was working in Java, but I think this issue would be similar in other languages: it's difficult to ask for the canonical case version of a file name when we currently have a filename with abitrary case.
The only solution I came up with was to list the contents of the parent directory and check whether my arbitrary filename is listed with the correct case in the results:
// CaseCheck.java import java.util.Arrays; import java.io.File; import java.io.IOException; class CaseCheck { private static File parentFile( File f ) { File ret = f.getParentFile(); if ( ret == null ) { ret = new File( "." ); } return ret; } private static boolean existsAndCaseCorrect( String fileName ) { File f = new File( fileName ); return Arrays.asList( parentFile( f ).list() ).contains( f.getName() ); } public static void main( String[] args ) throws IOException { System.out.println( existsAndCaseCorrect( args[0] ) ); } }
Checking it on its own source file:
javac CaseCheck.java && java CaseCheck cASEcheck.java falsejavac CaseCheck.java && java CaseCheck CaseCheck.java true
It seems to work.
Note that this also returns false if the file doesn't exist, and will throw an error if the file name specifies a parent directory that doesn't exist.