0

我正在使用 System Internals 提供的 SDelete 应用程序以安全的方式删除文件,但遇到了一些文件被遗留的问题。我设法获得了 SDelete 源代码,经过一番挖掘后,我发现问题只发生在使用文件系统压缩选项压缩的文件以及小于 728 字节的文件中。出错的代码行在这里:

    startVcn = 0;
    endOfPrevRun = LLINVALID;
    fileMappings = (PGET_RETRIEVAL_DESCRIPTOR) fileMap;
    while( !(status = NtFsControlFile( FileHandle, NULL, NULL, 0, &ioStatus, FSCTL_GET_RETRIEVAL_POINTERS, &startVcn, sizeof( startVcn ),fileMappings, FILEMAPSIZE * sizeof(ULONGLONG) ) ) 
        || status == STATUS_BUFFER_OVERFLOW 
        || status == STATUS_PENDING )

如果调用此函数以提供压缩文件的文件句柄且小于 728 字节,则返回值为 3221225489“到达文件末尾”。

大概这在首次编写应用程序时适用于较旧的文件系统(我在 Windows 7 上),但我认为 Windows 7 中的更改导致此失败。

目前我已经通过调用GetCompressedFileSize函数解决了这个问题,如果文件太小,我用垃圾填充它,直到它超过 728 个字节。虽然这可行,但我想知道是否有人可以提出更好的方法,或者是否有 Windows 7 替代方案NtFsControlFile

4

1 回答 1

0

NTFS 的工作原理

每个 MFT 记录的集群。每条记录的大小。NTFS 为每个文件创建一个文件记录,并为在 NTFS 卷上创建的每个文件夹创建一个文件夹记录。小于此大小的文件和文件夹包含在 MFT 中。

还:

NTFS 为每个文件创建一个文件记录,并为在 NTFS 卷上创建的每个文件夹创建一个文件夹记录。MFT 包括 MFT 本身的单独文件记录。这些文件和文件夹记录各为 1 KB,并存储在 MFT 中。文件的属性被写入 MFT 中分配的空间。除了文件属性之外,每个文件记录还包含有关文件记录在 MFT 中的位置的信息。图 MFT Entry with Resident Record 显示了小文件或文件夹的 MFT 记录的内容。小文件和文件夹(通常为 900 字节或更小)完全包含在文件的 MFT 记录中。

我想这就是你在这里所拥有的 - 文件数据完全在 MFT 中,而不存在于磁盘的“文件区域”中。

于 2013-05-23T11:31:04.230 回答