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

camickr:

我正在尝试使用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 File Explorer中看到的列表,也是我期望看到的列表(“文档和设置”除外,我知道如何解决此问题)

  1. 为什么NIO方法不能以相同方式过滤隐藏文件?
  2. 如何获得相同的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个文件。

RealHowTo:

这不是一个错误,但一个功能(!),因为JDK7中,Windows隐藏目录称为被检测为不隐藏,看到这个错误,这一个(修复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();
            }
        };

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章