我正在尝试列出装载的NTFS卷上的所有文件和文件夹的列表,到目前为止,我使用了两种方法,都得到了不同的结果(不幸的是)。
(注意:由于链接限制,我无法在此处包含其他来源)
有几件事我想澄清一下:
(1)
为什么某些文件/文件夹的名称中间有奇怪的无法识别的字符?我如何将它们写入到wstringstream,然后如何将它们正确写入到wofstream?
示例文件路径:C:\Users\Rahul\AppData\Local\Packages\winstore_cw5nh1h2txyewy\LocalState\Cache\4\4-httpswscont.apps.microsoft.comwinstore6.3.0.1100USen-usMS482features1908650c-22a4-485e-8e88-b12d01c84f2f.json.dat
如果在cmd:C:\Users\Rahul\AppData\Local\Packages\winstore_cw5nh1h2txyewy\LocalState\Cache\4\4-https中使用dir,效果如何???wscont.apps.microsoft.com?温斯顿?6.3.0.1?100?我们?对我们?毫秒?482?功能908650c-22a4-485e-8e88-b12d01c84f2f.json.dat
如果您在C++中使用wprintf,效果如何:C:\Users\Rahul\AppData\Local\Packages\winstore_cw5nh2txyewy\LocalState\Cache\4\4-https
文件名在windows资源管理器中显示正确,但在cmd中打印时遇到问题。它在记事本++中显示为一个框,但如果右键单击,它会正确显示,因此记事本++也可以正确显示字符(某种程度上,编码可能会更改?)。
我当前正在使用(ss是字符串流,初始化为wstingstream ss(“”);)
wstringstream ss("");
(my program methods here)
wofstream out("...", wofstream::out);
out << ss.rdbuf();
out.close();
我假设编码至少与它有关,但同时,我不确定要使用哪些标志。
(2)
MFT中是否列出了所有文件?
NTFS上的每个链接都表示所有文件信息和属性都存储在MFT中,但根据开源NTFSLib(有链接限制,可以通过搜索NTFS解析器库找到),共有131840个文件记录。
当我运行自己的程序时,我最终会这样
50MB file
(包括权限等)。我的程序使用FSCTL_MFT_ENUM_USN_DATA和CreateFile获取句柄,使用GetFileInformationByHandle获取扩展信息。
CreateFile通常接受WCHAR*,并且没有奇怪的空终止问题(我认为,也许,甚至不再确定,这可能是丢失文件的位置)。
它显示它可以读取129454个文件,我假设其他131840-129454=2386个文件是已删除但仍在USN日志中的文件。
(3)
为什么我的Java版本的代码输出的文件记录比MFT包含的还要多?
Java代码的输出是
150MB file
(包括权限,用名称而不是符号枚举,因为我不知道如何不这样做,所以它要大得多)。
正如您在这里看到的,这一个文件中有161430个文件记录。这比NTFSLib所说的还要多。是的,131840个文件记录中可能有很多是“附加名称”,但我在Java版本中明确避免了符号链接。这些额外的30000个文件是由硬链接生成的吗?或者有更多的名称与符号链接无关?