Java isFile(), isDirectory() 不检查是不是存在

Posted

技术标签:

【中文标题】Java isFile(), isDirectory() 不检查是不是存在【英文标题】:Java isFile(), isDirectory() without checking for existenceJava isFile(), isDirectory() 不检查是否存在 【发布时间】:2012-01-28 17:54:12 【问题描述】:

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

isFile()

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

isDirectory()

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

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

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

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

更新

如果字符串可以是两者(不带扩展名),则默认情况下应将其标识为目录,如果具有该路径的文件不存在。

【问题讨论】:

Apache commons.io 可以帮助您。也许使用 FileUtils.sizeof() 或类似的东西...... Java 如何知道指向不存在的东西的路径名是文件还是目录,如果那里什么都没有?没有路径名格式来确定某个东西是跨所有操作系统的文件还是目录。 你想要的是不可能的,文件和目录之间没有区别,除非它实际存在于文件系统中(并且具有操作系统提供的必要属性)扩展等可能只是你自己的假设。旁注:现在也不存在扩展,它是来自 DOS 的一个古老的、古老的工件。 【参考方案1】:

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

在 Windows 中,目录可以有扩展名,而文件不需要有扩展名。因此,您无法仅通过查看字符串来判断。

如果您强制执行一个规则,即目录没有扩展名,而文件总是有扩展名,那么您可以通过查找扩展名来确定目录和文件之间的区别。

【讨论】:

【参考方案2】:

为什么不直接将它们封装在对 File#exists() 的调用中?

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

    // call isFile() or isDirectory()


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


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

如果是这样,使用File API 将很难做到(而且通常很难做到)。如果/foo/bar/baz 不存在,则无法确定它是文件还是目录。也可以。

【讨论】:

“两者都可以。”也可能两者都不是。 如果字符串可以是两者(不带扩展名),默认情况下,如果具有该路径的文件不存在,则应将其标识为目录。 @aleroot - 这是您自己的业务逻辑必须强制执行的内容,因为文件扩展名大多基于约定,对大多数文件系统并不重要。 "你保证它确实存在" ...除非其他进程删除了调用 file.exists() 和 isFile() 之间的文件/目录。不太可能,也许,但可能。 @BrianRogers,它可以是同一个进程,只是另一个线程。【参考方案3】:

根据您的更新,听起来您知道自己想要什么:如果路径不存在且路径具有扩展名,则为文件,如果不存在,则为目录。像这样就足够了:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于Java isFile(), isDirectory() 不检查是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

os.path.isfile的错误

在 python 中检查 os.path.isfile(filename) 是不是区分大小写

NodeJS fs Stats.isFile() 未定义

os.path.isfile 使用误区

Pythonos.path.isfile()的使用方法汇总

如何修改我的 File 对象的 .isFile() 或 .exists() 方法检查所述文件的位置?