使用SetFilePointerEx移动磁盘的文件指针

时间:2014-06-16 15:20:23

标签: c++ winapi

我尝试使用SetFilePointerEx()将磁盘的文件指针移动到特定的偏移量(文件的最后一个群集)。计算出的偏移量见:

LARGE_INTEGER dist;
dist.QuadPart = (output1.QuadPart * dwBytesPerSect) + ((lastExtent + lengthOfExtent - 1) * totalClusterSize);
BOOL res = SetFilePointerEx(hDevice, dist, nullptr, FILE_BEGIN);
if (!res){
    // handle error
    DWORD error = GetLastError();
    cout<<GetLastError()<<endl;
    cout << "'There is an error with SetFilePointerEX" << endl;
}
cout<<"This is the SetFilePointer distance: \n\n"<<dist.QuadPart;

然后我使用Readfile()读取最后4k群集块:

DWORD nRead;
unsigned char *buff;
buff = new unsigned char[totalClusterSize];

BOOL fileFromVol = ReadFile(hDevice,   //C drive
                buff,
                4096,
                &nRead,
                NULL);

if (fileFromVol == 0){         //Error handling
    cout << "Error with fileFromVol" << "\n\n";
    DWORD error = GetLastError();
    cout<<error<<endl;
        if (error == ERROR_ACCESS_DENIED){
            cout << "error_access_denied"<<endl;
        }
}
cout<<"\n\n"<<buff<<"\n\n";
memset(buff,NULL,4096);

因此,我的文件偏移量dist.QuadPart始终是常量,但每次在同一文件上运行程序时,我的读缓冲区(buff)都会更改十六进制值。

首先运行的例子:

This is the SetFilePointer distance:

3689362889266376704

008F4264

第二轮示例:

This is the SetFilePointer distance:

3689362889266376704

00E53CE8

为什么它不断变化的任何想法?

对于我的下一步,我需要向群集写入零。我可以使用memset()在最后一个群集位置写入零吗?

1 个答案:

答案 0 :(得分:0)

您要打印的值是缓冲区的地址,而不是其内容。并且缓冲区的地址不固定。当然,争论为什么缓冲区的地址可以改变是有点没有实际意义,因为你真的想打印出缓冲区的内容。

打印出数组的第一个元素:

cout<<"\n\n"<<buff[0]<<"\n\n";

你应该看到从磁盘读取的值。

其他一些评论:

  1. 不要硬编码缓冲区大小。您必须确保它是扇区大小的倍数。
  2. 您的缓冲区应为unsigned char*,而不是unsigned int*
  3. 如果缓冲区仅部分填充,请检查值nRead