2017-04-20 2 views
0

Ich habe gesucht, um dies zu tun, aber ich kann nicht finden, was ich falsch mache. Ich versuche, diese Funktion hängt Daten jedes Mal, wenn es heißt, aber es immer tun Einmal. Wenn die Datei nicht existiert es ein neues erstellt und für nur einmal auf Datei schreiben, wenn die Datei existiert es tut nichts (oder vielleicht überschreiben)Wie man Daten an eine Datei in Win32 anfügt

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); 
} 

Und das ist, wo ich die Funktion in WM_COMMAND

nennen
//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

Warum die c nicht verwenden ++ Standard-Bibliothek? –

+2

brauchen Sie * OPEN_ALWAYS * in * dwCreationDisposition * statt * CREATE_NEW *. und in * dwDesiredAccess * muss * FILE_APPEND_DATA * sein, aber nicht * GENERIC_WRITE * – RbMm

+0

@RbMm Danke, das funktioniert gut –

Antwort

4

, wenn die Datei existiert es nichts tut

Wie es sein sollte. Per der CreateFile() Dokumentation:

CREATE_NEW
Erstellt eine neue Datei, nur dann, wenn es bereits existiert nicht.

Wenn die angegebene Datei vorhanden ist, schlägt die Funktion fehl, und der letzte Fehlercode ist auf ERROR_FILE_EXISTS (80) festgelegt.

Wenn die angegebene Datei nicht existiert und ein gültiger Pfad zu einem schreibbaren Speicherort ist, wird eine neue Datei erstellt.

Für das, was Sie zu tun versuchen, OPEN_ALWAYS statt:

OPEN_ALWAYS
öffnet eine Datei, immer.

Wenn die angegebene Datei existiert, ist die Funktion erfolgreich und der letzte Fehlercode ist auf ERROR_ALREADY_EXISTS (183) gesetzt.

Wenn die angegebene Datei nicht existiert und ein gültiger Pfad zu einem schreibbaren Speicherort ist, erstellt die Funktion eine Datei und der letzte Fehlercode wird auf Null gesetzt.

Sie den Spezifizierer FILE_APPEND_DATA Zugang nutzen können CreateFile() automatisch haben, bis zum Ende der Datei suchen nach dem Erstellen/Öffnen sie (sonst müssen Sie manuell SetFilePointer/Ex() verwenden wollen), bevor Sie dann neue Daten in die Datei schreiben.

Try this:

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); 
} 
Verwandte Themen