我想使用Writefile来填充每个文件的结尾,直到它到达最后一个簇的末尾。然后我想删除我写的内容并重复这个过程(试图摆脱可能存在的数据)。
我有两个问题:
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);
,但那没有用。
答案 0 :(得分:0)
您需要注意有关FILE_FLAG_NO_BUFFERING
的{{3}}中的信息。具体这一节:
如前所述,应用程序必须满足某些要求 处理使用FILE_FLAG_NO_BUFFERING打开的文件时。该 以下具体内容适用:
- 文件访问大小,包括OVERLAPPED结构中的可选文件偏移量(如果指定),必须是多个字节, 是扇区大小的整数倍。例如,如果 扇区大小为512字节,应用程序可以请求读写 512,1024,1,536或2,048字节,但不包括335,981或7,171 字节。
- 读取和写入操作的文件访问缓冲区地址应该是物理扇区对齐的,这意味着在内存中的地址上对齐 它是卷的物理扇区大小的整数倍。 根据磁盘的不同,可能不会强制执行此要求。