gpt4 book ai didi

java - 如何检查文件/目录是否是 protected 操作系统文件?

转载 作者:行者123 更新时间:2023-12-01 18:03:35 26 4
gpt4 key购买 nike

我正在开发一个项目,该项目部分显示 JTable 中目录中的所有文件,包括子目录。用户可以双击子目录以使用新目录的内容更新表。但是,我遇到了问题。

我的文件列表是用 file.listFiles() 生成的,它会拉出所有内容:隐藏文件、锁定文件、操作系统文件、整个工具包和一堆文件,但我无法访问所有这些文件。例如,我无权读取/写入“C:\Users\user\Cookies\”或“C:\ProgramData\ApplicationData\”。不过没关系,这不是访问这些内容的问题。相反,我不希望程序显示它无法打开的目录。但是,我无权访问的目录和我访问的目录的行为几乎完全相同,这使得过滤掉它们非常困难。

我发现的行为的唯一区别是,如果我在锁定的目录上调用 listFiles(),它会返回 null。这是我用作过滤器的代码块:

for(File file : folder.listFiles())
if(!(file.isDirectory() && file.listFiles() == null))
strings.add(file.getName());

其中“文件夹”是我正在查看的目录,“字符串”是该目录中文件名称的列表。这个想法是,只有当我允许编辑的文件或目录时,文件才会加载到列表中。过滤方面有效,但有些目录包含数百个子目录,每个子目录又包含数百个文件,并且由于 listFiles() 的复杂度为 O(n),因此这不是一个可行的解决方案(list() 不是也没有更好)。

但是,file.isHidden() 返回 false

canWrite()/canRead()/canExecute() 返回 true

getPath() 返回与 getAbsolutePath() 和 getCanonicalPath() 相同的结果

createNewFile() 对所有内容都返回 false,甚至我知道的目录都可以。另外,即使这种解决方案有效,我也想避免这种解决方案。

是否有一些我不知道的方法或实现可以帮助我查看该目录是否可以访问而无需解析其所有内容?

(我运行的是 Windows 7 Professional,使用的是 Eclipse Mars 4.5.2,所有 File 实例都是 java.io.File)。

最佳答案

您遇到的问题是您正在处理文件。据大家所知,在 2016 年,事实上,自 2011 年(Java 7 发布)以来,它已被 JSR 203 取代。

现在,什么是 JSR 203?它是一个全新的 API,可以处理任何文件系统和文件系统对象;它扩展了“文件系统”的定义,以包括您在本地计算机上找到的内容(JDK 所谓的“默认文件系统”)以及您可能使用的其他文件系统。

如何使用它的示例页面:here

此 API 的众多优点之一是它允许访问您以前无法访问的元数据;例如,您在评论中特别提到您想知道 Windows 认为哪些文件为“系统文件”。

您可以这样做:

// get the path
final Path path = Paths.get(...);
// get the attributes
final DosAttributes attrs = Files.readAttributes(path, DosFileAttributes.class);
// Is this file a "system file"?
final boolean isSystem = attrs.isSystem();
<小时/>

现在,什么是Paths.get()?如前所述,API 使您可以一次访问多个文件系统;一个名为 FileSystems 的类提供对 JDK 可见的所有文件系统的访问(包括创建新文件系统),并且始终存在的默认文件系统由 FileSystems.getDefault() 给出。

FileSystem 实例还允许您使用 FileSystem#getPath 访问 Path .

将其结合起来,您会发现这两者是等效的:

Paths.get(a, b, ...)
FileSystems.getDefault().getPath(a, b, ...)
<小时/>

关于异常:File 对异常的处理非常糟糕。仅举两个例子:

  • File#createNewFile 如果无法创建文件,将返回 false;
  • 如果由于任何原因无法读取 File 对象指向的目录内容,
  • File#listFiles 将返回 null。

JSR 203 没有这些缺点,而且还有更多缺点。让我们采用两种等效的方法:

这些方法和其他方法在行为上有根本的区别:如果发生故障,它们将抛出异常。

更重要的是,您可以区分这是什么异常:

  • 如果是FileSystemException或衍生错误,错误发生在文件系统级别(例如,“访问被拒绝”是一个 AccessDeniedException);
  • 如果是 IOException,那么问题就更根本了。
<小时/>

此答案无法包含 JSR 203 的每个用例;这个 API 非常庞大,非常完整,尽管并非没有缺陷,但无论如何它都比 File 所提供的要好得多。

关于java - 如何检查文件/目录是否是 protected 操作系统文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38706689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com