我一直在尝试使用CreateFile()和DeviceIoControl()来查找文件信息。但是我一直在运行ERROR_HANDLE_EOF,根据我的理解,即使我从0开始,起始虚拟集群号已超过文件末尾。这是我的代码的几个片段,如果你们有任何想法,请告诉我出了什么问题。
HANDLE hFile = INVALID_HANDLE_VALUE; //drive or file to be checked
LPWSTR txtFile = L"Text.txt"; //text file
hFile = CreateFile(txtFile, //target file
GENERIC_READ | GENERIC_WRITE, //read and write
FILE_SHARE_READ|FILE_SHARE_WRITE,//allows sharing of read and writes
NULL, //security prevents child process from inheriting the handle
OPEN_EXISTING, //open file or drive if it exist
FILE_ATTRIBUTE_NORMAL, //default settings for files
NULL); //template file with generiv read access rights
if (hFile == INVALID_HANDLE_VALUE) //error handling
{
cout<<"File does not exist"<<endl;
CloseHandle (hFile);
system("pause");
}
cout<<"you opened the file succesfully: "<<hFile<<endl;
STARTING_VCN_INPUT_BUFFER startVcn;
RETRIEVAL_POINTERS_BUFFER retrievalBuffer;
DWORD error =ERROR_MORE_DATA;
BOOL returns;
startVcn.StartingVcn.QuadPart = 0;
while( error ==ERROR_MORE_DATA){
DWORD bytesReturned;
returns = DeviceIoControl(hFile,
FSCTL_GET_RETRIEVAL_POINTERS,
&startVcn,
sizeof(STARTING_VCN_INPUT_BUFFER),
&retrievalBuffer,
sizeof(RETRIEVAL_POINTERS_BUFFER),
&bytesReturned,
NULL);
error = GetLastError();
switch(error){
case ERROR_HANDLE_EOF:
cout<<"ERROR_HANDLE_EOF"<<endl;
returns = true;
break;
case ERROR_MORE_DATA:
cout<<"ERROR_MORE_DATA"<<endl;
startVcn.StartingVcn = retrievalBuffer.Extents[0].NextVcn;
case NO_ERROR:
cout<<"NO_ERROR, here is some info: "<<endl
<<retrievalBuffer.StartingVcn.QuadPart<<endl
<<retrievalBuffer.Extents[0].Lcn.QuadPart<<endl
<<retrievalBuffer.Extents[0].NextVcn.QuadPart
- retrievalBuffer.StartingVcn.QuadPart<<endl;
returns = true;
break;
default:
cout<<"Error in the code or input error"<<endl;
break;
}
}
答案 0 :(得分:1)
我自己编写了几乎相同的程序,并且像OP一样,我发现我得到了ERROR_HANDLE_EOF,我无法解释。当我去寻找一种解释时,我找不到一个解释,但偶然发现了这篇文章。 OP的程序对我来说看起来是正确的,因此我强烈怀疑对此行为的解释与我的解释相同。我意识到为OP提供帮助为时已晚,但是为了使其他花1个全天进行这项工作的人受益,我认为答案是…
有根据的猜测:“小文件”没有分配到它们的集群,并且当您使用上述程序查询“小文件”时,您将收到ERROR_HANDLE_EOF。这种方式很有意义,但对像我这样的新手来说却非常不友好且没有用。在机器上进行的实验使我相信“小文件”等于或小于736字节。 737字节或更多字节开始使用群集。通过使用Linux / cygwin的“ dd”命令对各种文件大小执行二进制搜索来生成所需大小的文件,我发现了这些限制。
目前,我还没有人支持我的736 vs 737字节的声明,但是http://www.ntfs.com/ntfs_optimization.htm确实说过:“在NTFS上,如果文件足够小,则可以将其存储在MFT记录本身中,而无需使用其他群集。”
我的系统正在使用Windows 10,NTFS简单卷。我不太了解NTFS,MFT或属性。也许有一天我会找到适当的结构来解释为什么会出现这个数字(例如结构可以高达1K,并且已经使用了288个字节?)。