2011-12-27 3 views
6

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

ISFILE():

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

isDirectory():

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

В основном мне нужны два метода без оговорки существуют ...

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

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

UPDATE

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

+0

Apache commons.io может вам помочь. Возможно, используя FileUtils.sizeof() или что-то в этом роде ... – Alfabravo

+3

Как Java знает, указывает ли путь, указывающий на то, что не существует, - это файл или каталог, если там ничего нет? Формат имени пути отсутствует, чтобы определить, является ли что-то файлом или каталогом во всех ОС. –

+0

То, что вы хотите, невозможно, нет никакой разницы между файлом и каталогом, если он фактически не существует в файловой системе (и имеет необходимые атрибуты, предоставляемые ОС). Расширения и тому подобное могут быть только вашим собственным предположением. Сторона примечания: расширение не существует ни в настоящее время, это старый, старый артефакт, поступающий из DOS. – bestsss

ответ

1

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

bool IsPathDirectory() { 
    File test = new File(myPath); 

    // check if the file/directory is already there 
    if (!file.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(); 
    } 
} 
4

Почему бы не просто обернуть их звонком в File#exists()?

File file = new File(...); 
if (file.exists()) { 

    // call isFile() or isDirectory() 

} 

Делая это, вы фактически сводит на нет «существует» часть isFile() и isDirectory(), так как вы гарантировано, что она существует.


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

Если это так, это будет сложно сделать с API File (и это сложно сделать в целом). Если /foo/bar/baz не существует, невозможно определить, является ли это файлом или каталогом. Это может быть и то.

+1

«Это может быть так». И это не могло быть так. –

+0

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

+0

@aleroot - Это то, что ваша собственная бизнес-логика должна обеспечить, поскольку расширения файлов в основном основаны на согласии и не имеют большого значения для большинства файловых систем. –

7

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

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

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