#c #winapi
#c #winapi
Вопрос:
Я хочу использовать Writefile для заполнения конца каждого файла, пока он не достигнет конца своего последнего кластера. Затем я хочу удалить то, что я написал, и повторить процесс (пытаясь избавиться от данных, которые могли там быть).
У меня есть 2 проблемы:
- Файл записи выдает ошибку: ERROR_INVALID_PARAMETER
- В зависимости от типа файла,
WriteFile()
дает мне разные результаты
Итак, для первой проблемы я понял, что параметр nNumberOfBytesToWrite в WriteFile()
должен быть кратен байтам на сектор (в моем случае это 512 байт). Это ограничение функции или я делаю что-то не так?
Во втором выпуске я использую два фиктивных файла (.txt и .html) на внешнем жестком диске для записи случайных данных. В случае файла .txt данные записываются в конец файла, что мне и нужно. Однако .html-файл просто записывает в начало файла и заменяет все данные, которые там уже были.
Вот несколько фрагментов кода, относящихся к моей проблеме:
hFile = CreateFile(result,
GENERIC_READ | GENERIC_WRITE |FILE_READ_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE,
0,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
0);
if (hFile == INVALID_HANDLE_VALUE) {
cout << "File does not exist" << endl;
CloseHandle(hFile);
}
DWORD dwBytesWritten;
char * wfileBuff = new char[512];
memset (wfileBuff,'0',512);
returnz = SetFilePointer(hFile, 0,NULL,FILE_END);
if(returnz ==0){
cout<<"Error: "<<GetLastError()<<endl;
};
LockFile(hFile, returnz, 0, 512, 0)
returnz =WriteFile(hFile, wfileBuff, 512, amp;dwBytesWritten, NULL);
if(returnz ==0){
cout<<"Error: "<<GetLastError()<<endl;
}
UnlockFile(hFile, returnz, 0, 512, 0);
cout<<dwBytesWritten<<endl<<endl;
В данный момент я использую статические числа только для тестирования функций.
Всегда ли я могу записать в конец файла, независимо от типа файла? Я тоже пытался SetFilePointer(hFile, 0,(fileSize - slackSpace 1),FILE_BEGIN);
, но это не сработало.
Ответ №1:
Вам необходимо учитывать информацию в документации, касающуюся FILE_FLAG_NO_BUFFERING
. В частности, этот раздел:
Как обсуждалось ранее, приложение должно соответствовать определенным требованиям при работе с файлами, открытыми с помощью FILE_FLAG_NO_BUFFERING . Применяются следующие особенности:
- Размеры доступа к файлам, включая необязательное смещение файла в структуре ПЕРЕКРЫТИЯ, если указано, должны составлять количество байтов, которое является целым числом, кратным размеру сектора тома. Например, если размер сектора равен 512 байтам, приложение может запрашивать операции чтения и записи объемом 512, 1024, 1536 или 2048 байт, но не 335, 981 или 7171 байт.
- Адреса буфера доступа к файлам для операций чтения и записи должны быть выровнены по физическому сектору, что означает выравнивание по адресам в памяти, которые являются целыми числами, кратными размеру физического сектора тома. В зависимости от диска это требование может не выполняться.
Комментарии:
1. Вау, я полностью прошел через это. Спасибо! Есть идеи по поводу моей проблемы с типом файла?
2. Я в это не очень верю. Расширение файла не может влиять на то, как
WriteFile
работает.3. Ваше право! Теперь это работает. Итак, чтобы удалить то, что я только что написал, я бы установил указатель на конец файла и записал пустые символы с
WriteFile
помощью или есть лучшая функция для использования? В идеале я хотел бы снова освободить место.4. Я действительно не понимаю всего этого. Если вы хотите написать, вы используете
WriteFile
. Больше ничего нет. Снова освободить место? Освободить какое пространство? В любом случае, я думаю, что ответил на ваш вопрос.5. Я хочу удалить все символы, которые я только что написал,
WriteFile
чтобы освободить пространство, которое я только что использовал.