我正在使用 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
?