查找文件的群集信息

时间:2014-05-29 16:12:52

标签: c++ windows

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

1 个答案:

答案 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个字节?)。