如何在win32中的文件上附加数据

时间:2017-04-20 20:29:03

标签: file winapi visual-c++ win32gui

我已经搜索过这样做,但我找不到我做错了什么。我试图让这个函数在每次被调用时附加数据但是它总是这样做它一次。如果文件不存在,它会创建一个新文件,并且只在文件存在的情况下在文件上写入一次,如果该文件存在则不执行任何操作(或者可能会覆盖)

void WriteToFile (char data[],wchar_t filename[] )
{
    HANDLE hFile;
    DWORD dwBytesToWrite = (DWORD)strlen(data);
    DWORD dwBytesWritten ;
    BOOL bErrorFlag = FALSE;


    hFile = CreateFile((LPCWSTR)filename,            // name of the write
        GENERIC_WRITE,          // open for writing 
        0,                      // do not share
        NULL,                   // default security
        CREATE_NEW,             // create new file only
        FILE_ATTRIBUTE_NORMAL,  // normal file
        NULL);                  // no attr. template

    if (hFile == INVALID_HANDLE_VALUE)
    {
        DisplayError(TEXT("CreateFile"));
        _tprintf(TEXT("Terminal failure: Unable to open file \"%s\" for write.\n"), filename);
        return;
    }


    bErrorFlag = WriteFile(
    hFile,              // open file handle
    data,               // start of data to write
    dwBytesToWrite,     // number of bytes to write
    &dwBytesWritten,    // number of bytes that were written
    NULL);              // no overlapped structure

    if (FALSE == bErrorFlag)
    {
        DisplayError(TEXT("WriteFile"));
        printf("Terminal failure: Unable to write to file.\n");
    }
    else
    {
        if (dwBytesWritten != dwBytesToWrite)
        {
        // This is an error because a synchronous write that results in
        // success (WriteFile returns TRUE) should write all data as
        // requested. This would not necessarily be the case for
        // asynchronous writes.
        printf("Error: dwBytesWritten != dwBytesToWrite\n");
       }
       else
       {
        _tprintf(TEXT("Wrote %d bytes to %s successfully.\n"), dwBytesWritten, filename);
    }
}

CloseHandle(hFile);
}

这就是我在WM_COMMAND

中调用函数的地方
//When a menu item selected execute this code
case IDM_FILE_SAVE:
        saveBool = true;
        char Str[] = "this is my own data";
        wchar_t filename[] = L"data.txt";
        WriteToFile(Str, filename);
        break;

1 个答案:

答案 0 :(得分:5)

  

如果文件存在则无效

应该如此。根据{{​​3}}文档:

  

CREATE_NEW
  1
  创建一个新文件,仅当它尚不存在时

     

如果指定的文件存在,则函数失败,最后错误代码设置为ERROR_FILE_EXISTS(80)

     

如果指定的文件不存在且是可写位置的有效路径,则会创建一个新文件。

对于您尝试执行的操作,请改用OPEN_ALWAYS

  

OPEN_ALWAYS
  4
  始终打开文件。

     

如果指定的文件存在,则函数成功,最后一个错误代码设置为ERROR_ALREADY_EXISTS(183)。

     

如果指定的文件不存在并且是可写位置的有效路径,则该函数会创建一个文件,并将最后一个错误代码设置为零。

您可以使用FILE_APPEND_DATA访问说明符让CreateFile()在创建/打开文件后自动搜索到文件的末尾(否则,您必须先使用SetFilePointer/Ex()手动搜索)然后将新数据写入文件。

试试这个:

void WriteToFile (char *data, wchar_t *filename)
{
    HANDLE hFile;
    DWORD dwBytesToWrite = strlen(data);
    DWORD dwBytesWritten ;
    BOOL bErrorFlag = FALSE;

    hFile = CreateFileW(filename,  // name of the write
        FILE_APPEND_DATA,          // open for appending
        FILE_SHARE_READ,           // share for reading only
        NULL,                      // default security
        OPEN_ALWAYS,               // open existing file or create new file 
        FILE_ATTRIBUTE_NORMAL,     // normal file
        NULL);                     // no attr. template

    if (hFile == INVALID_HANDLE_VALUE)
    {
        DisplayError(TEXT("CreateFile"));
        wprintf(L"Terminal failure: Unable to create/open file \"%s\" for writing.\n", filename);
        return;
    }

    while (dwBytesToWrite > 0)
    {
        bErrorFlag = WriteFile(
            hFile,              // open file handle
            data,               // start of data to write
            dwBytesToWrite,     // number of bytes to write
            &dwBytesWritten,    // number of bytes that were written
            NULL);              // no overlapped structure

        if (!bErrorFlag)
        {
            DisplayError(TEXT("WriteFile"));
            printf("Terminal failure: Unable to write to file.\n");
            break;
        }

        wprintf(L"Wrote %u bytes to \"%s\" successfully.\n", dwBytesWritten, filename);

        data += dwBytesWritten;
        dwBytesToWrite -= dwBytesWritten;
    }

    CloseHandle(hFile);
}