C++ 使用WriteFile填充群集

C++ 使用WriteFile填充群集,c++,winapi,C++,Winapi,我想使用Writefile填充每个文件,然后结束,直到它到达最后一个集群的末尾。然后,我想删除我写的内容并重复这个过程(尝试删除可能存在的数据)。 我有两个问题: WriteFile给了我一个错误:错误\u无效\u参数 根据文件的类型,WriteFile()会给出不同的结果 因此,对于第一个问题,我意识到WriteFile()中的参数nNumberOfBytesToWrite必须是每个扇区字节的倍数(我的情况是512字节)。这是功能的限制还是我做错了什么 在我的第二期中,我使用外部硬盘上的两个虚

我想使用Writefile填充每个文件,然后结束,直到它到达最后一个集群的末尾。然后,我想删除我写的内容并重复这个过程(尝试删除可能存在的数据)。

我有两个问题:

  • WriteFile给了我一个错误:错误\u无效\u参数
  • 根据文件的类型,
    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
    写的所有字符释放我刚才使用的空间。