C++ 使用WriteFile填充群集
我想使用Writefile填充每个文件,然后结束,直到它到达最后一个集群的末尾。然后,我想删除我写的内容并重复这个过程(尝试删除可能存在的数据)。C++ 使用WriteFile填充群集,c++,winapi,C++,Winapi,我想使用Writefile填充每个文件,然后结束,直到它到达最后一个集群的末尾。然后,我想删除我写的内容并重复这个过程(尝试删除可能存在的数据)。 我有两个问题: WriteFile给了我一个错误:错误\u无效\u参数 根据文件的类型,WriteFile()会给出不同的结果 因此,对于第一个问题,我意识到WriteFile()中的参数nNumberOfBytesToWrite必须是每个扇区字节的倍数(我的情况是512字节)。这是功能的限制还是我做错了什么 在我的第二期中,我使用外部硬盘上的两个虚
我有两个问题:
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;
hFile=CreateFile(结果,
通用|读取|通用|写入|文件|读取|属性,
文件共享读取文件共享写入,
0,
开放式,
文件\u标志\u无缓冲,
0);
if(hFile==无效的句柄值){
cout您需要注意有关文件\u标志\u否\u缓冲的信息。具体而言,本节:
如前所述,应用程序必须满足某些要求
当使用文件\u标志\u无\u缓冲打开的文件时
以下细节适用:
- 文件访问大小,包括重叠结构中的可选文件偏移量(如果指定),必须为
是卷扇区大小的整数倍。例如,如果
扇区大小为512字节,应用程序可以请求读写
512、1024、1536或2048字节,但不是335、981或7171字节
字节
- 读写操作的文件访问缓冲区地址应该是物理扇区对齐的,这意味着在内存中的地址上对齐
是卷的物理扇区大小的整数倍。
根据磁盘的不同,可能不会强制执行此要求
哇,我完全考虑过了。谢谢!对我的文件类型问题有什么想法吗?我真的不相信。文件扩展名不能影响WriteFile
的工作方式。你说的对!它现在正在工作。所以要删除我刚才写的内容,我会将指针设置到文件的末尾,并用WriteFile
写空字符吗?或者是否存在一个更好的函数可以使用吗?理想情况下,我想再次释放空间。我并没有完全遵循这些。如果你想写你就用WriteFile
。没有别的了。再次释放空间?释放什么空间?无论如何,我想我回答了你的问题。我想删除我刚才用WriteFile
写的所有字符释放我刚才使用的空间。