Java 列出所有文件和目录的NTFS

Java 列出所有文件和目录的NTFS,java,c++,windows,visual-c++,ntfs,Java,C++,Windows,Visual C++,Ntfs,我试图列出一个挂载的NTFS卷上的所有文件和文件夹,到目前为止,我用了两种方法,但都产生了不同的结果(不幸的是) (注意:由于链接限制,我无法在此处包含其他来源) 有几件事我想澄清一下: 强>(1)< /强>为什么某些文件/文件夹在名称中间有奇怪的不可识别字符?如何将它们写入并打印到wstringstream,然后如何正确地将它们写入wofstream 示例文件路径:C:\Users\Rahul\AppData\Local\Packages\winstore\u cw5n1h2txyewy\Lo

我试图列出一个挂载的NTFS卷上的所有文件和文件夹,到目前为止,我用了两种方法,但都产生了不同的结果(不幸的是)

(注意:由于链接限制,我无法在此处包含其他来源)

有几件事我想澄清一下:

<>强>(1)< /强>为什么某些文件/文件夹在名称中间有奇怪的不可识别字符?如何将它们写入并打印到wstringstream,然后如何正确地将它们写入wofstream

示例文件路径:C:\Users\Rahul\AppData\Local\Packages\winstore\u cw5n1h2txyewy\LocalState\Cache\4\4-https∺∯∯wscont.apps.microsoft.com∯温斯托尔∯6.3.0.1∯100∯美国∯美国英语∯太太∯482∯特性1908650C-22a4-485e-8e88-b12d01c84f2f.json.dat

如果在cmd: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?功能1908650C-22a4-485e-8e88-b12d01c84f2f.json.dat

在C++中使用wprintf时的效果:C:\Users\Rahul\AppData\Local\Packages\winstore\U cw5n1h2txyewy\LocalState\Cache\4\4-https

文件名在windows资源管理器中正确显示,但在cmd中打印时遇到问题。它在notepad++中显示为一个框,但如果右键单击,它会正确显示,因此notepad++也可以正确显示字符(某种程度上,编码可能会改变?)

我当前正在使用(ss是stringstream,初始化为wstingstream ss(“”;)

wstringstream ss(“”);
(这里是我的编程方法)
wofstream out(“…”,wofstream::out);
(1)的解决方案:

您必须编写自己的库来写入UTF-16,因为写入有时会遇到字符未对齐的情况,并且会认为存在空字符,例如: 在未对齐期间,0xD00A可能会遇到0x00字符,因此将终止

我使用以下两个文件以unicode格式写出。处理wchar\u t、wchar\u t*、char、char*、unsigned long和unsigned long-long: ,

(2,3)

是的,他们都在那里。您可以在GetInformationByHandle方法中找到链接的数量,这将累计到Java one包含的文件数量


仍在寻找:如何在MFT中列出指向文件记录的所有链接的名称?

如果在C++中使用wprintf,它的外观是什么:
很可能,
wprintf
在第一个空字节处停止,因此无法获得整个字符串。NTFS使用unicode(16位字符)作为文件名和目录。此外,一些程序,如securerom,使用一些乱码文件名,使其难以修改或删除。还有一些类似“伪造”的旧目录路径,如“文档和设置”。Windows FindFirstFile和FindNextFile应该可以工作,但您可能必须将进程令牌权限设置为“备份”之类的权限才能访问所有目录。对于文件路径中的URL,
/
是非法字符,因此必须替换它们,并且
(U+223A几何比例)和
(U+222F表面积分)恰好是由任何应用程序创建的文件所替换的。@ PulcMcKunZi,但是为什么在字符串的中间会有一个空字节?!我该怎么处理呢?我的意思是,Java的原生文件.walkFileTree(…)似乎非常擅长,windows资源管理器也是如此。如何使其正确打印?@RahulManne:您显示的字符串中没有空值,因此
wprintf()
决定在无法处理的第一个UTF-16代理上停止(碰巧是
字符),或者控制台显示本身在命中该字符时停止输出。
wstringstream ss("");
(my program methods here)
wofstream out("...", wofstream::out);
out << ss.rdbuf();
out.close();