2012-01-07 39 views
4

舊的內容不被消滅的內容。 數據正在被寫入,所以我仍然看到舊的內容。 我沒做什麼?的CreateFile/WriteFile的不摧毀舊文件

hFile = CreateFile(fname, // open testfile.txt 
    GENERIC_WRITE, // open for reading 
    0, // do not share 
    NULL, // default security 
    OPEN_ALWAYS, // 
    FILE_ATTRIBUTE_NORMAL, // normal file 
    NULL); // no attribute template 

dwBytesToWrite = buff.GetLength(); 
WriteFile(hFile, buff.GetBuffer(100), dwBytesToWrite, &dwBytesWritten, NULL); 

回答

5

您已指定了錯誤的價值dwCreationDisposition。您需要指定CREATE_ALWAYS

創建一個新的文件,始終。 如果指定的文件存在並且是可寫的,則該函數覆蓋文件,函數成功,並且最後的錯誤代碼被設置爲ERROR_ALREADY_EXISTS(183)。 如果指定的文件不存在並且是有效路徑,則會創建一個新文件,該函數成功,並且最後一個錯誤代碼被設置爲零。

+0

大衛,你是對的。我擔心重寫的問題,因爲這是OP正在經歷的。但是,我現在明白地看到它會覆蓋整個文件。我想刪除我的答案,但我不能,因爲它已被接受。 – 2012-01-07 20:14:26

+0

我們走了。現在我將留下我的答案作爲未來用戶的注意事項*不* *採取我的方法,並且肯定*不*合併這些標誌,因爲MSDN特別說*不* *。 – 2012-01-07 20:27:38

1

在dwCreationDisposition中,您需要指定CREATE_ALWAYS。

1

你需要dwCreationDisposition = TRUNCATE_EXISTING。但是:

打開一個文件並截斷​​它,使其大小爲零字節,只有當它存在 時。如果指定的文件不存在,則函數將失敗 ,並且最後一個錯誤代碼被設置爲ERROR_FILE_NOT_FOUND(2)。與GENERIC_WRITE位設置爲dwDesiredAccess參數 一部分 調用進程必須打開該文件。

所以我會試着用TRUNCATE_EXISTING先打開它。如果失敗,請使用ERROR_FILE_NOT_FOUND,然後用CREATE_NEW打開它。

hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, TRUNCATE_EXISTING, 
    FILE_ATTRIBUTE_NORMAL, NULL); 

if ((hFile == NULL) && (GetLastError() == ERROR_FILE_NOT_FOUND)) 
{ 
    hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, CREATE_NEW, 
    FILE_ATTRIBUTE_NORMAL, NULL); 
} 

編輯:這不是做到這一點的最好辦法。 CREATE_ALWAYS是您要使用的dwCreationDisposition。見David Heffernan的回答。

+0

設置爲:OPEN_ALWAYS | TRUNCATE_EXISTING – jdl 2012-01-07 19:58:19

+1

@jdl不,這兩個常量不能組合。 (它們分別具有值4和5,所以如果你將它們放在一起,那麼它們會掩蓋另一個。) – 2012-01-07 20:03:13

+0

爲我工作 – jdl 2012-01-07 20:07:24