Java isFile(), isDirectory() без проверки существования

Я хочу проверить, является ли данная строка файлом или каталогом, я пробовал методы isFile() и isDirectory() из File, но проблема в том, что если каталог или файл не существует, эти методы возвращают false, потому что, как указано в javadoc :

isFile() :

Значение true тогда и только тогда, когда файл, обозначенный этим абстрактным путем, существует и является обычным файлом; ложь в противном случае

isDirectory() :

true тогда и только тогда, когда файл, обозначенный этим абстрактным путем, существует и является каталогом; ложь в противном случае

По сути, мне нужны два метода без предложения exists...

Поэтому я хочу проверить, соответствует ли данная строка формату каталога или формату файла в мультиплатформенном контексте (поэтому она должна работать в Windows, Linux и Mac Os X).

Существует ли какая-то библиотека, предоставляющая эти методы? Что может быть лучшей реализацией этих методов?

ОБНОВЛЕНИЕ

В случае строки, которая может быть и той, и другой (без расширения), по умолчанию должна быть идентифицирована как директория, если файл с таким путем не существует.


person aleroot    schedule 27.12.2011    source источник
comment
Apache commons.io может вам помочь. Возможно, используя FileUtils.sizeof() или что-то в этом роде...   -  person Alfabravo    schedule 28.12.2011
comment
Как Java узнает, является ли путь, указывающий на что-то несуществующее, файлом или каталогом, если там ничего нет? Не существует формата пути, чтобы определить, является ли что-то файлом или каталогом во всех операционных системах.   -  person Jon Lin    schedule 28.12.2011
comment
То, что вы хотите, невозможно, нет никакой разницы между файлом и каталогом, если только он не существует в файловой системе (и не имеет необходимых атрибутов, предоставляемых ОС). Расширения и тому подобное могут быть просто вашим собственным предположением. Примечание: расширения в настоящее время тоже не существует, это старый-престарый артефакт, пришедший из DOS.   -  person bestsss    schedule 28.12.2011


Ответы (4)


Похоже, вы знаете, чего хотите, согласно вашему обновлению: если путь не существует и путь имеет расширение, это файл, если нет, то это каталог. Что-то вроде этого будет достаточно:

private boolean isPathDirectory(String myPath) {
    File test = new File(myPath);

    // check if the file/directory is already there
    if (!test.exists()) {
        // see if the file portion it doesn't have an extension
        return test.getName().lastIndexOf('.') == -1;
    } else {
        // see if the path that's already in place is a file or directory
        return test.isDirectory();
    }
}
person Eric Rahm    schedule 28.12.2011

Поэтому я хочу проверить, соответствует ли данная строка формату каталога или формату файла в мультиплатформенном контексте (поэтому она должна работать в Windows, Linux и Mac Os X).

В Windows каталог может иметь расширение, а файлу не обязательно иметь расширение. Таким образом, вы не можете сказать, просто взглянув на строку.

Если вы применяете правило, что каталог не имеет расширения, а файл всегда имеет расширение, то вы можете определить разницу между каталогом и файлом, ища расширение.

person Gilbert Le Blanc    schedule 27.12.2011

Существуют правила относительно того, что является недопустимым в имени файла и/или папки. Например, Windows не поддерживает *, ? и некоторые другие символы. Основываясь на том, что недопустимо, вы можете создать выражение regex или какую-либо другую систему процесса/проверки, чтобы увидеть, похоже ли оно на файл или папку.

Это может стать сложным, так как вы хотите, чтобы это работало для многих разных ОС. Кроме того, как сообщалось ранее, не было бы способа отличить файл от папки, если бы вы искусственно не навязали соглашение. Например, каталоги должны заканчиваться косой чертой / в Windows.

Сначала поможет проверка IF EXISTS. Если IF EXISTS = true, то запуск существующего кода File.isDirectory() или File.isFile() упростит многое из этого. Вам нужно будет написать код только для случая, когда IF EXISTS = false.

person StreamRunner    schedule 24.07.2021

person    schedule
comment
Это может быть и то, и другое. А могло быть и то, и другое. - person Bhesh Gurung; 28.12.2011
comment
В случае строки, которая может быть и той, и другой (без расширения), по умолчанию должна быть идентифицирована как директория, если файл с таким путем не существует. - person aleroot; 28.12.2011
comment
@aleroot - это то, что должна будет обеспечить ваша собственная бизнес-логика, поскольку расширения файлов в основном основаны на соглашении и не имеют большого значения для большинства файловых систем. - person Rob Hruska; 28.12.2011
comment
вам гарантировано, что он существует ... если какой-либо другой процесс не удалил файл/каталог между вызовами file.exists() и isFile(). Маловероятно, возможно, но возможно. - person Brian Rogers; 28.12.2011
comment
@BrianRogers, это может быть тот же процесс, просто другой поток. - person bestsss; 28.12.2011
comment
@bestsss — Верно; хотя идея та же. - person Brian Rogers; 28.12.2011