我试图在已安装的NTFS卷上列出所有文件和文件夹,到目前为止我做了2种方法,所有这些都产生了不同的结果(不幸的是)。
(注意:我在这里不能包含其他来源,因为链接限制)
我想清理一些事情:
(1)为什么某些文件/文件夹在名称中间有奇怪的无法识别的字符?如何将它们打印到wstringstream,然后我如何正确地将它们写入wofstream?
示例文件路径:C:\ Users \ Rahul \ AppData \ Local \ Packages \ winstore_cw5n1h2txyewy \ LocalState \ Cache \ 4 \ 4-https∺∯∯wscont.apps.microsoft.com∯winstore∯6.3.0.1∯100∯ US∯en-us∯MS∯482∯features1908650c-22a4-485e-8e88-b12d01c84f2f.json.dat
如果你在cmd中使用dir,它是如何出现的:C:\ Users \ Rahul \ AppData \ Local \ Packages \ winstore_cw5n1h2txyewy \ LocalState \ Cache \ 4 \ 4-https ??? wscont.apps.microsoft.com? winstore?6.3.0.1?100?US?EN-US?MS?482?features1908650c-22a4-485e-8e88-b12d01c84f2f.json.dat
如果你在C ++中使用wprintf,它会出现:C:\ Users \ Rahul \ AppData \ Local \ Packages \ winstore_cw5n1h2txyewy \ LocalState \ Cache \ 4 \ 4-https
文件名在Windows资源管理器中正确显示,但无法在cmd中打印。它在notepad ++中显示为一个框,但是如果你右键单击它会正确显示它,那么notepad ++也可以正确显示字符(排序,编码可能会改变吗?)。
我目前正在使用(ss是字符串流,初始化为wstingstream ss("");)
wstringstream ss("");
(my program methods here)
wofstream out("...", wofstream::out);
out << ss.rdbuf();
out.close();
我假设编码至少与它有关,但与此同时,我不确定要使用哪些标志。
(2) MFT中是否列出了所有文件? NTFS上的每个链接都表示所有文件信息和属性都存储在MFT中,但根据开源NTFSLib(有链接限制,可以通过Google搜索An-NTFS-Parser-Lib找到),有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文件是从硬链接生成还是以某种方式拥有更多名称独立于符号链接的情况?
答案 0 :(得分:0)