2012-01-07 5 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으로 설정됩니다.

+0

David, 당신이 맞습니다. 덮어 쓰기에 관한 verbage에 관심을 가졌습니다. 그것이 OP가 겪었던 것이기 때문입니다. 그러나, 나는 그것이 분명히 전체 파일을 덮어 쓰는 것을 봅니다. 내 대답을 삭제하고 싶습니다만, 받아 들일 수 없으므로 그럴 수 없습니다. –

+0

우리가 간다. 이제는 MSDN에서 구체적으로 말하지 않는 * 미래의 사용자를위한 메모로 내 대답을 떠날 예정입니다. * 내 접근 방식을 사용하지 않고, 분명히 * 해당 * 플래그를 결합하지 않습니다. –

1

dwCreationDisposition에서 CREATE_ALWAYS를 지정해야합니다.

1

dwCreationDisposition = TRUNCATE_EXISTING이 필요합니다. 그러나 이것은

경우에만 파일을 열고 크기가 0 바이트가되도록 자릅니다. 지정된 파일이 없으면 함수는 으로 실패하고 마지막 오류 코드는 ERROR_FILE_NOT_FOUND (2)로 설정됩니다. 호출 프로세스는 dwDesiredAccess 매개 변수의 일부인 으로 설정된 GENERIC_WRITE 비트를 사용하여 파일을 열어야합니다.

그래서 저는 먼저 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_ALWAYSdwCreationDisposition입니다. David Heffernan의 대답을보십시오.

+0

: OPEN_ALWAYS | TRUNCATE_EXISTING – jdl

+1

@jdl 아니요,이 두 개의 상수는 결합 될 수 없습니다. (그들은 각각 4와 5의 값을 가지므로 하나 또는 둘 다 마스크하면 하나가됩니다.) –

+0

이 나를 위해 일했습니다. – jdl

관련 문제