gpt4 book ai didi

c++ - 查找文件的簇信息

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:55 25 4
gpt4 key购买 nike

我一直在尝试使用 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;
}
}

最佳答案

我自己写了几乎相同的程序,就像 OP 一样,我发现我得到了 ERROR_HANDLE_EOF,我无法解释。当我去寻找解释时,我从未找到任何解释,而是偶然发现了这篇文章。 OP 的程序在我看来是正确的,所以我强烈怀疑对该行为的解释与我的相同。我意识到现在帮助 OP 已经太晚了,但是为了其他花费 1 一整天解决这个问题的人的利益,我认为答案是......

有根据的猜测:“小文件”没有分配给它们的簇,当您使用上述程序查询“小文件”时,您将收到 ERROR_HANDLE_EOF。这样说的有点道理,但是对我这种新手来说很不友好,没用。在机器上的实验让我相信一个“小文件”是 736 字节或更少。 737 字节或更多开始使用簇。我通过使用 Linux/cygwin 的“dd”命令对各种文件大小执行二进制搜索来生成所需大小的文件,从而发现了这些限制。

此时,我还没有发现任何人支持我关于 736 和 737 字节的说法,但是 http://www.ntfs.com/ntfs_optimization.htm确实说“在 NTFS 上,如果文件足够小,它可以存储在 MFT 记录本身中,而无需使用额外的簇。”

我的系统使用的是 Windows 10,NTFS 简单卷。我不太了解 NTFS、MFT 或属性。也许有一天我会找到合适的结构来解释为什么会出现这个数字(比如结构可以达到 1K 并且已经使用了 288 个字节??)。

关于c++ - 查找文件的簇信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com