mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-12-13 11:40:29 +00:00
Switch FileMount to use Files.walkFileTree
This means we are already provided with file attributes, which halfs[^1] the time taken to scan folders. [^1]: This dropped the fastest scan time from ~1.3s to ~0.6. It's by no means a perfect benchmark, but this is still an obvious improvement.
This commit is contained in:
parent
0ffd5fcf85
commit
68762fe84c
@ -6,6 +6,7 @@
|
||||
package dan200.computercraft.core.filesystem;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import dan200.computercraft.ComputerCraft;
|
||||
import dan200.computercraft.api.filesystem.FileOperationException;
|
||||
import dan200.computercraft.api.filesystem.IWritableMount;
|
||||
|
||||
@ -13,9 +14,7 @@ import javax.annotation.Nonnull;
|
||||
import java.io.*;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.*;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.OpenOption;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.nio.file.*;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@ -404,23 +403,46 @@ public class FileMount implements IWritableMount
|
||||
}
|
||||
}
|
||||
|
||||
private static class Visitor extends SimpleFileVisitor<Path>
|
||||
{
|
||||
long size;
|
||||
|
||||
@Override
|
||||
public FileVisitResult preVisitDirectory( Path dir, BasicFileAttributes attrs )
|
||||
{
|
||||
size += MINIMUM_FILE_SIZE;
|
||||
return FileVisitResult.CONTINUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileVisitResult visitFile( Path file, BasicFileAttributes attrs )
|
||||
{
|
||||
size += Math.max( attrs.size(), MINIMUM_FILE_SIZE );
|
||||
return FileVisitResult.CONTINUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileVisitResult visitFileFailed( Path file, IOException exc )
|
||||
{
|
||||
ComputerCraft.log.error( "Error computing file size for {}", file, exc );
|
||||
return FileVisitResult.CONTINUE;
|
||||
}
|
||||
}
|
||||
|
||||
private static long measureUsedSpace( File file )
|
||||
{
|
||||
if( !file.exists() ) return 0;
|
||||
|
||||
if( file.isDirectory() )
|
||||
try
|
||||
{
|
||||
long size = MINIMUM_FILE_SIZE;
|
||||
String[] contents = file.list();
|
||||
for( String content : contents )
|
||||
Visitor visitor = new Visitor();
|
||||
Files.walkFileTree( file.toPath(), visitor );
|
||||
return visitor.size;
|
||||
}
|
||||
catch( IOException e )
|
||||
{
|
||||
size += measureUsedSpace( new File( file, content ) );
|
||||
}
|
||||
return size;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Math.max( file.length(), MINIMUM_FILE_SIZE );
|
||||
ComputerCraft.log.error( "Error computing file size for {}", file, e );
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user