硬链接计数

时间:2012-11-15 18:18:26

标签: java windows filesystems

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

我正在编写一个扫描卷上所有文件的应用程序来绘制图形。它类似于一个不方便称为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个文件):

  • 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()而不是新FileVisitor的事实有关,但我不接受速度40个文件/秒,比没有硬链接慢43倍。

(我之前已经扫描了几次后进行了这些测试。第一次扫描总是需要几倍的时间)

0 个答案:

没有答案