Использование файла записи для заполнения кластера

#c #winapi

#c #winapi

Вопрос:

Я хочу использовать Writefile для заполнения конца каждого файла, пока он не достигнет конца своего последнего кластера. Затем я хочу удалить то, что я написал, и повторить процесс (пытаясь избавиться от данных, которые могли там быть).

У меня есть 2 проблемы:

  1. Файл записи выдает ошибку: ERROR_INVALID_PARAMETER
  2. В зависимости от типа файла, 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 чтобы освободить пространство, которое я только что использовал.