CreateFile / WriteFile не уничтожает содержимое старого файла - PullRequest
4 голосов
/ 07 января 2012

Старое содержимое не стирается.Вместо этого данные переписываются, поэтому я все еще вижу старое содержимое.Что я не делал?

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

Ответы [ 3 ]

5 голосов
/ 07 января 2012

Вы указали неправильное значение для dwCreationDisposition. Вам необходимо указать CREATE_ALWAYS.

Всегда создает новый файл. Если указанный файл существует и доступен для записи, функция перезаписывает файл, функция завершается успешно, и для кода последней ошибки установлено значение ERROR_ALREADY_EXISTS (183). Если указанный файл не существует и является допустимым путем, создается новый файл, функция завершается успешно, а код последней ошибки устанавливается равным нулю.

1 голос
/ 07 января 2012

Вам нужно 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, который вы хотите использовать. См. Ответ Дэвида Хеффернана.

1 голос
/ 07 января 2012

В dwCreationDisposition вам нужно указать CREATE_ALWAYS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...