gpt4 book ai didi

c++ - 使用 WriteFile 填充集群

转载 作者:太空狗 更新时间:2023-10-29 23:16:22 24 4
gpt4 key购买 nike

我想使用 Writefile 填充每个文件的末尾,直到它到达其最后一个簇的末尾。然后我想删除我写的东西并重复这个过程(试图删除可能存在的数据)。

我有两个问题:

  1. WriteFile 给我一个错误:ERROR_INVALID_PARAMETER
  2. 根据文件类型,WriteFile() 给出不同的结果

所以对于第一个问题,我意识到 WriteFile() 中的参数 nNumberOfBytesToWrite 必须是每个扇区字节的倍数(我的情况是 512 字节)。这是功能的限制还是我做错了什么?

在我的第二期中,我在外部硬盘驱动器上使用两个虚拟文件(.txt 和 .html)来写入随机数据。对于 .txt 文件,数据被写入文件的末尾,这正是我所需要的。但是,.html 文件只是写入文件的开头并替换已经存在的所有数据。

以下是一些与我的问题相关的代码片段:

hFile = CreateFile(result,          
GENERIC_READ | GENERIC_WRITE |FILE_READ_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE,
0,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
0);

if (hFile == INVALID_HANDLE_VALUE) {
cout << "File does not exist" << endl;
CloseHandle(hFile);
}



DWORD dwBytesWritten;
char * wfileBuff = new char[512];
memset (wfileBuff,'0',512);

returnz = SetFilePointer(hFile, 0,NULL,FILE_END);
if(returnz ==0){
cout<<"Error: "<<GetLastError()<<endl;
};


LockFile(hFile, returnz, 0, 512, 0)

returnz =WriteFile(hFile, wfileBuff, 512, &dwBytesWritten, NULL);
if(returnz ==0){
cout<<"Error: "<<GetLastError()<<endl;
}

UnlockFile(hFile, returnz, 0, 512, 0);

cout<<dwBytesWritten<<endl<<endl;

我目前使用静态数字只是为了测试功能。

不管是什么类型的文件,有没有办法一直写到文件末尾?我还尝试了 SetFilePointer(hFile, 0,(fileSize - slackSpace + 1),FILE_BEGIN); 但那没有用。

最佳答案

您需要注意documentation中的信息关于 FILE_FLAG_NO_BUFFERING。特别是这一部分:

As previously discussed, an application must meet certain requirements when working with files opened with FILE_FLAG_NO_BUFFERING. The following specifics apply:

  • File access sizes, including the optional file offset in the OVERLAPPED structure, if specified, must be for a number of bytes that is an integer multiple of the volume sector size. For example, if the sector size is 512 bytes, an application can request reads and writes of 512, 1,024, 1,536, or 2,048 bytes, but not of 335, 981, or 7,171 bytes.
  • File access buffer addresses for read and write operations should be physical sector-aligned, which means aligned on addresses in memory that are integer multiples of the volume's physical sector size. Depending on the disk, this requirement may not be enforced.

关于c++ - 使用 WriteFile 填充集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24330354/

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