8

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

是文件()

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

是目录()

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

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

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

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

更新

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

4

4 回答 4

8

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

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

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

于 2011-12-27T20:13:05.623 回答
4

为什么不把它们包装在一个电话中File#exists()呢?

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

    // call isFile() or isDirectory()

}

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


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

如果是这样,那么使用FileAPI 将很难做到(而且一般来说很难做到)。如果/foo/bar/baz不存在,则无法确定它是文件还是目录。也可以是。

于 2011-12-27T20:12:00.160 回答
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();
    }
}
于 2011-12-28T00:17:21.580 回答
0

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

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

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

于 2021-07-24T00:25:10.333 回答