gpt4 book ai didi

Windows 系统上的 java7 : Files. walkFileTree() 和 "System Volume information"

转载 作者:行者123 更新时间:2023-12-02 04:55:42 25 4
gpt4 key购买 nike

使用根文件夹(例如“T:/”)提供 Files.walkFileTree() 会产生错误:

 java.nio.file.AccessDeniedException: T:\System Volume Information
at java.nio.file.Files.newDirectoryStream(Files.java:457)
at java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:300)
at java.nio.file.FileTreeWalker.next(FileTreeWalker.java:372)
at java.nio.file.Files.walkFileTree(Files.java:2706)
at java.nio.file.Files.walkFileTree(Files.java:2742)

未调用回调 preVisitDirectory():

            @Override
public FileVisitResult preVisitDirectory( Path aFile,
BasicFileAttributes aAttrs )
throws IOException
{
if ( "System Volume Information".equals( ( aFile.getFileName() ) ) )
{
return FileVisitResult.SKIP_SUBTREE;
}

return FileVisitResult.CONTINUE;
}

apache FileUtils.deleteDirectory( new File( "T:/") ) 都不能处理这种情况。

我编写了以下代码:

    public static void deleteDirRecursive( Path aDir ) throws IOException
{
if ( aDir == null )
{
throw new IllegalArgumentException( "aDir must not be null" );
}

if ( Files.notExists( aDir ) )
{
return;
}

if ( aDir.isAbsolute() && aDir.getRoot().equals( aDir ) )
{
myLog.debug( "Given path object is a root. On windows we cannot delete 'System Volume Information' folder!" );

// -> iterate over the entries in root and skip "System Volume information"
Arrays.asList( aDir.toFile().listFiles(
new FilenameFilter()
{
@Override
public boolean accept( File aDirectory, String aName )
{
return !"System Volume Information".equals( aName );
}
} )
).forEach
( dir ->
{
try
{
if ( dir.isDirectory() )
{
deleteDirRecursive( Paths.get( dir.getAbsolutePath() ) );
}
else
{
Files.delete( Paths.get( dir.getAbsolutePath() ) );

}
}
catch ( Exception e )
{
throw new IllegalArgumentException( "", e );
}
}
);

return;
}

if ( !Files.isDirectory( aDir ) )
{
throw new IllegalArgumentException( "given aDir is not a directory" );
}


Files.walkFileTree( aDir, new SimpleFileVisitor<Path>()
{
@Override
public FileVisitResult visitFile( Path file,
BasicFileAttributes attrs )
throws IOException
{
Files.delete( file );
return FileVisitResult.CONTINUE;
}

@Override
public FileVisitResult postVisitDirectory( Path dir, IOException exc )
throws IOException
{
Files.delete( dir );
return FileVisitResult.CONTINUE;
}

} );
}

请注意,这段代码的最大部分只是对“系统卷信息”的特殊处理(整个“if ( aDir.isAbsolute() ....”)。非常难看。

是否有更优雅的解决方案来从树遍历中排除此文件夹?

最佳答案

我知道已经晚了,但我也遇到了这个问题;我将在那里记录它。

FileVisitor有一个名为 FileVisitResult VisitFileFailed(T file, IOException exc)

的方法

SimpleFileVisitor 通过重新抛出异常来实现它。

只需在您自己的实现中重写该方法,并按照您认为必要的方式处理异常。

关于Windows 系统上的 java7 : Files. walkFileTree() 和 "System Volume information",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28793921/

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