Как определить, чувствительна ли файловая система к регистру?

У меня есть List<String> имен файлов из папки и определенного имени файла как String, Я хочу определить, есть ли имя файла в списке, но нужно учитывать свойство базовой файловой системы, учитывает ли оно регистр символов.

Есть ли простой способ сделать это (кроме "взлома" проверки System.getProperty("os.name", "").toLowerCase().indexOf("windows")!=-1)?;-)

6 ответов

Решение

Не используйте строки для представления ваших файлов; использовать java.io.File:

http://java.sun.com/javase/6/docs/api/java/io/File.html

boolean isFileSystemCaseSensitive = !new File( "a" ).equals( new File( "A" ) );

Похоже, вы можете использовать IOCase,

Напишите файл с именем "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"));
}

Обратите внимание на различные предоставляемые объемы (объем с учетом регистра и объем с учетом регистра).

Другие вопросы по тегам