使用WriteFile填充集群

时间:2014-06-20 15:07:39

标签: c++ winapi

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

我有两个问题:

  1. WriteFile给我一个错误: ERROR_INVALID_PARAMETER
  2. 根据文件类型,WriteFile()会给我不同的结果
  3. 因此,对于第一个问题,我意识到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);,但那没有用。

1 个答案:

答案 0 :(得分:0)

您需要注意有关FILE_FLAG_NO_BUFFERING的{​​{3}}中的信息。具体这一节:

  

如前所述,应用程序必须满足某些要求   处理使用FILE_FLAG_NO_BUFFERING打开的文件时。该   以下具体内容适用:

     
      
  • 文件访问大小,包括OVERLAPPED结构中的可选文件偏移量(如果指定),必须是多个字节,   是扇区大小的整数倍。例如,如果   扇区大小为512字节,应用程序可以请求读写   512,1024,1,536或2,048字节,但不包括335,981或7,171   字节。
  •   
  • 读取和写入操作的文件访问缓冲区地址应该是物理扇区对齐的,这意味着在内存中的地址上对齐   它是卷的物理扇区大小的整数倍。   根据磁盘的不同,可能不会强制执行此要求。
  •