2

检索文件的硬链接计数的更有效方法是什么,它可以随大量文件扩展?

我正在编写一个扫描卷上所有文件以绘制图形的应用程序。它类似于一个不方便地称为Scanner的免费软件程序,它确实考虑了硬链接,并且扫描速度非常快,甚至比我在 Java 中甚至不检查硬链接的速度都快。


我已经尝试通过以下(慢速)方式检查硬链接计数:

(为了便于阅读,示例非常简化)

通过 CMD 程序STAT(Windows)

process = Runtime.getRuntime().exec(new String[]{"stat", "--printf=%h", "\"" + filePath + "\""});

in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String inpMsg = in.readLine();
linkCount = Integer.parseInt(inpMsg);

并使用 JNI 调用GetFileInformationByHandle

String lpFileName = filePath;
int dwShareMode = Kernel32.FILE_SHARE_READ | Kernel32.FILE_SHARE_WRITE;
Pointer lpSecurityAttributes = null;
int dwCreationDisposition = Kernel32.OPEN_EXISTING;
int dwFlagsAndAttributes = 0;
int hTemplateFile = 0;
hFile = Kernel32.INSTANCE.CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);

Memory lpFileInformation = new Memory(56);
Kernel32.INSTANCE.GetFileInformationByHandle(hFile, lpFileInformation);

linkCount = lpFileInformation.getInt(40);

为了说明为什么我想要一个更快的方法,这里列出了不同进程可以多快地遍历我的 C: 驱动器上的所有文件(170000 个文件):

  • Alt+Enter on C:\:每秒 19000 个文件(9 秒)
  • 扫描仪(如上所述):每秒 7800 个文件(22 秒)
  • Java(无硬链接):每秒 1750 个文件(98 秒)
  • Java(使用 JNI):每秒 40 个文件(1:​​10 小时(预计))
  • Java(带有 STAT):每秒 8 个文件(5:50 小时(预计))

Java 比 Scanner 慢的事实可能与我使用File.listFiles()而不是 new的事实有关FileVisitor,但我不会接受 40 个文件/秒的速度,这比没有硬链接时慢 43 倍。

(我之前已经扫描了几次之后运行了这些测试。第一次扫描总是花费数倍的时间)

4

0 回答 0