Java isFile(),isDirectory()没有检查是否存在

时间:2011-12-27 20:08:04

标签: java file file-exists

我想检查给定的String是文件还是目录,我已经尝试了File类的方法isFile()和isDirectory(),但问题是如果目录或文件没有不存在这些方法返回false,因为如javadoc中所述:

isFile()

  

当且仅当此抽象路径名表示的文件存在时才为true   并且是一个普通的文件;否则是假的

isDirectory()

  

当且仅当此抽象路径名表示的文件存在时才为true   并且是一个目录;否则是假的

基本上我需要两个没有exists子句的方法 ...

所以我想在多平台上下文中测试给定字符串是否符合目录格式或符合文件格式(因此,应该适用于Windows,Linux和Mac Os X)。

是否存在提供这些方法的库?什么可能是这些方法的最佳实现?

更新

如果字符串可以同时(没有扩展名)默认情况下应标识为目录,如果不存在具有该路径的文件。

4 个答案:

答案 0 :(得分:7)

  

所以我想在多平台上下文中测试给定字符串是否符合目录格式或符合文件格式(因此,应该适用于Windows,Linux和Mac Os X)。

在Windows中,目录可以具有扩展名,并且文件不需要具有扩展名。所以,你不能仅仅通过查看字符串来判断。

如果您强制执行目录没有扩展名且文件始终具有扩展名的规则,则可以通过查找扩展名来确定目录和文件之间的差异。

答案 1 :(得分:4)

为什么不将它们包裹在对File#exists()的调用中?

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

    // call isFile() or isDirectory()

}

通过这样做,您已经有效地否定了isFile()isDirectory()的“存在”部分,因为您可以保证它确实存在。


我也有可能误解了你在这里问的问题。鉴于问题的第二部分,您是否尝试在不存在的文件上使用isFile()isDirectory()来查看它们看起来像它们是文件还是目录?< / p>

如果是这样的话,那对于File API来说就很难了(而且一般来说很难做到)。如果/foo/bar/baz不存在,则无法确定它是文件还是目录。它可能是。

答案 2 :(得分:2)

听起来你知道你想要什么,根据你的更新:如果路径不存在且路径有扩展名,那么它就是一个文件,如果它不是一个目录。这样的东西就足够了:

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();
    }
}

答案 3 :(得分:0)

文件和/或文件夹名称中的无效内容有一些规则。例如,Windows 不允许使用 *? 和其他一些字符。根据无效的内容,您可以构建一个 regex 表达式或其他一些进程/检查系统,以查看它看起来像一个文件还是文件夹。

这可能会变得复杂,因为您希望它适用于许多不同的操作系统。此外,正如之前发布的那样,除非您人为地强制执行约定,否则无法从文件夹中区分文件。例如,在 Windows 中,目录必须以前斜杠 / 结尾。

先检查 IF EXISTS 会有所帮助。如果 IF EXISTS = true,那么运行现有的 File.isDirectory()File.isFile() 代码将简化很多。您只需为 IF EXISTS = false 编写代码。