首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DirectoryStream.Filter过滤隐藏文件

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

Stack Overflow用户
提问于 2020-05-13 21:19:47
回答 2查看 808关注 0票数 4

我试图使用NIO类过滤隐藏的文件。

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

代码语言:javascript
复制
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中看到的列表,也是我希望看到的列表(除了文档和设置之外,我知道如何修复该列表)。

  1. 为什么NIO方法不以同样的方式过滤隐藏文件?
  2. 如何使NIO过滤保持不变?

下面是测试代码:

代码语言:javascript
复制
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个文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-13 21:38:35

这不是一个bug,而是一个特性(!)已知自jdk7以来,Windows隐藏目录未被检测为隐藏目录,请参见此错误和此 (修复jdk13)。

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

代码语言:javascript
复制
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();
            }
        };
票数 4
EN

Stack Overflow用户

发布于 2020-05-14 00:48:42

最后我用了:

代码语言:javascript
复制
DirectoryStream.Filter<Path> pathFilter = new DirectoryStream.Filter<Path>()
{
    @Override
    public boolean accept(Path entry) throws IOException
    {
        DosFileAttributes attr = Files.readAttributes(entry, DosFileAttributes.class, LinkOption.NOFOLLOW_LINKS);

        return !attr.isHidden();
    }
};

正如我在问题中提到的,我也希望Documents and Settings被隐藏。

Documents and Settings是指向C:\Users的链接。

Files.readAttributes(…)方法的默认实现是遵循链接。所以我想,因为c:\Users目录没有隐藏,所以Documents and Settings也被认为是不隐藏的。

通过使用LinkOption.NOFOLLOW_LINKS,它被认为是隐藏的,这正是我想要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61785056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档