代码之家  ›  专栏  ›  技术社区  ›  Rahul Manne

NTFS列出所有文件和目录

  •  -2
  • Rahul Manne  · 技术社区  · 10 年前

    我正在尝试列出装载的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个文件是由硬链接生成的吗?或者有更多的名称与符号链接无关?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Rahul Manne    10 年前

    (1)的解决方案:

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

    我使用以下两个文件作为unicode进行编写。处理wchar_t、wchar_t*、char、char*、无符号long和无符号long-long: UTF16.h , UTF16.c

    (2,3) :

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

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