Как определить, чувствительна ли файловая система к регистру?
У меня есть List<String>
имен файлов из папки и определенного имени файла как String
, Я хочу определить, есть ли имя файла в списке, но нужно учитывать свойство базовой файловой системы, учитывает ли оно регистр символов.
Есть ли простой способ сделать это (кроме "взлома" проверки System.getProperty("os.name", "").toLowerCase().indexOf("windows")!=-1
)?;-)
6 ответов
Не используйте строки для представления ваших файлов; использовать java.io.File:
boolean isFileSystemCaseSensitive = !new File( "a" ).equals( new File( "A" ) );
Напишите файл с именем "HelloWorld"; попытаться прочитать файл с именем "hELLOwORLD"?
Я не думаю, что какой-либо из существующих примеров действительно справляется с этим должным образом, вам нужно записать файл на диск.
private boolean caseSensitivityCheck() {
try {
File currentWorkingDir = new File(System.getProperty("user.dir"));
File case1 = new File(currentWorkingDir, "case1");
File case2 = new File(currentWorkingDir, "Case1");
case1.createNewFile();
if (case2.createNewFile()) {
System.out.println("caseSensitivityCheck: FileSystem of working directory is case sensitive");
case1.delete();
case2.delete();
return true;
} else {
System.out.println("caseSensitivityCheck: FileSystem of working directory is NOT case sensitive");
case1.delete();
return false;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
Вы можете использовать следующий статический метод:
/**
* <p>
* Checks, whether the provided path points to a case-sensitive file system or not.
* </p>
* <p>
* It does so by creating two temp-files in the provided path and comparing them. Note that you need to have write
* access to the provided path.
*
* @param pathToFileSystem path to the file system to test
* @param tmpFileName name of the temp file that is created
* @return {@code true}, if the provided path points to a case-sensitive file system; {@code false} otherwise
* @throws IOException if IO operation fails
*/
public static boolean fileSystemIsCaseSensitive(Path pathToFileSystem, String tmpFileName) throws IOException {
Path a = Files.createFile(pathToFileSystem.resolve(Paths.get(tmpFileName.toLowerCase())));
Path b = null;
try {
b = Files.createFile(pathToFileSystem.resolve(Paths.get(tmpFileName.toUpperCase())));
} catch (FileAlreadyExistsException e) {
return false;
} finally {
Files.deleteIfExists(a);
if (b != null) Files.deleteIfExists(b);
}
return true;
}
Используйте его следующим образом:
@Test
void fileSystemIsCaseSensitive01() throws IOException {
assertTrue(Util.fileSystemIsCaseSensitive(Paths.get("/Volumes/Case-sensitive-Volume/Data"), "a"));
}
@Test
void fileSystemIsCaseSensitive02() throws IOException {
assertFalse(Util.fileSystemIsCaseSensitive(Paths.get("/Volumes/Case-insensitive-Volume/Data"), "a"));
}
Обратите внимание на различные предоставляемые объемы (объем с учетом регистра и объем с учетом регистра).