检索文件的硬链接计数的更有效方法是什么,可以使用大量文件进行扩展?
我正在编写一个扫描卷上所有文件的应用程序来绘制图形。它类似于一个不方便称为Scanner的免费程序,它确实考虑了硬链接,并且扫描速度非常快,比我在Java中实现的速度更快,甚至没有检查硬链接。
我已经尝试用以下(慢)方式检查硬链接计数:
(为了便于阅读,示例非常简化)
通过CMD程序STAT
(窗口)
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);
并使用对GetFileInformationByHandle
的JNI调用:
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个文件):
Java比Scanner慢的事实可能与我使用File.listFiles()
而不是新FileVisitor
的事实有关,但我不接受速度40个文件/秒,比没有硬链接慢43倍。
(我之前已经扫描了几次后进行了这些测试。第一次扫描总是需要几倍的时间)