gpt4 book ai didi

java - 如何使用 DirectoryStream.Filter 过滤隐藏文件

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

我正在尝试使用 NIO 类过滤隐藏文件。

当我在 Windows 10 上运行附加的代码时,我得到以下输出:

Files:
c:\Documents and Settings
c:\PerfLogs
c:\Program Files
c:\Program Files (x86)
c:\Users
c:\Windows

Paths:
c:\$Recycle.Bin
c:\Config.Msi
c:\Documents and Settings
c:\Intel
c:\IntelOptaneData
c:\OEM
c:\OneDriveTemp
c:\PerfLogs
c:\Program Files
c:\Program Files (x86)
c:\ProgramData
c:\Recovery
c:\System Volume Information
c:\Users
c:\Windows

文件下显示的列表(使用旧的 File.listFiles(FileFilter) 方法)是我在 Windows 文件资源管理器中看到的列表,也是我期望看到的(文档和设置除外,我知道如何解决)
  • 为什么 NIO 方法没有以同样的方式过滤隐藏文件?
  • 如何让 NIO 过滤相同?

  • 下面是测试代码:
    import java.io.*;
    import java.nio.file.*;

    public class ListFilesNIO
    {
    public static void main(String[] args) throws Exception
    {
    String directory = "c:\\";

    // Use old File I/O

    FileFilter fileFilter = new FileFilter()
    {
    @Override
    public boolean accept(File entry)
    {
    if (entry.isHidden()) return false;

    return true;
    }
    };

    System.out.println("Files:");
    File[] files = new File( directory ).listFiles( fileFilter );

    for (File file : files)
    {
    System.out.println( "\t" + file );
    }

    // Use NIO

    DirectoryStream.Filter<Path> pathFilter = new DirectoryStream.Filter<Path>()
    {
    @Override
    public boolean accept(Path entry) throws IOException
    {
    if (Files.isHidden( entry )) return false;

    return true;
    }
    };

    System.out.println();
    System.out.println("Paths:");
    DirectoryStream<Path> paths = Files.newDirectoryStream(Paths.get( directory ), pathFilter);

    for (Path path : paths)
    {
    System.out.println( "\t" + path );
    }
    }
    }

    注意:当我在没有过滤器的情况下运行代码时,在这两种情况下都会显示 18 个文件。所以第一种方法是过滤 12 个隐藏文件,第二种方法只过滤 3 个文件。

    最佳答案

    这不是错误而是自 jdk7 以来已知的功能(!),Windows 隐藏目录未被检测为隐藏,请参阅此 bug而这个 one (修复 jdk13)。

    作为一种解决方法,您可以这样做:

    import java.nio.file.attribute.DosFileAttributes;
    ...
    DirectoryStream.Filter<Path> pathFilter = new DirectoryStream.Filter<Path>()
    {
    @Override
    public boolean accept(Path entry) throws IOException
    {
    DosFileAttributes attr = Files.readAttributes(entry, DosFileAttributes.class);
    return !attr.isHidden();
    }
    };

    关于java - 如何使用 DirectoryStream.Filter 过滤隐藏文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61785056/

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