Удалить файл навсегда в Qt

Мне пришлось изменить программу на Qt, которую я не писал. Я нашел место в коде и знаю, что я хочу, но я не знаю, что изменить, поэтому обратитесь за помощью.
Код выглядит следующим образом:

QFile file(path);
qint64 size = filesize(path);
qint64 blockSize = 10240;
bool ok = file.open(QIODevice::ReadWrite);

if (ok)
{
QTime t;
t.start();
file.seek(0);
for (int i = 0; i < ceil(double(size) / double(blockSize)); i++)
{
qint64 block = size - i * blockSize;
if (block > blockSize)
{
block = blockSize;
}

QByteArray data;
data.resize(block);
data.fill('0');
file.write(data, block);
}
file.close();
file.remove();
}

Здесь заменяется содержимое файла с нулями для невозможности восстановления после его удаления. Поиск в Google Я пришел к двум выводам: либо нет реальной записи в файл, либо он записывает новые данные в другие сектора диска, а старые остаются на месте. Как сделать так, чтобы содержимое файла действительно заменялось нулями для невозможности его восстановления?
Любая помощь будет по достоинству оценена!

4

Решение

Я бы лично использовал shred или аналогичный инструмент через QProcess, Это, вероятно, лучшее соотношение эффект / усилие в этом случае.

Я не думаю, что вы должны изобретать это сами, так как это не специфическая вещь Qt и не что-то общее.

2

Другие решения

Код довольно запутанный. Не стоит «чинить».

Ниже приведена разумно разумная реализация, которая должна работать, если такой подход может работать вообще в вашей системе. Если вы говорите, что это «не работает» — как вы это проверяете? На какой платформе? Какая версия Qt?

Обратите внимание, что в Windows этот инструмент бесполезен для сжатых, зашифрованных и разреженных файлов. Внутренне, запись в такие файлы сначала копирует кластеры, а затем вносит изменения в скопированные кластеры, оставляя исходные данные позади. SDelete Инструмент справляется с этим соответствующим образом.

bool shred(const QString & fileName) {
QFile file(fileName);
QFileInfo fi(file);
qint64 fileSize = fi.size();
if (! file.open(QIODevice::ReadWrite | QIODevice::Unbuffered)) return false;

QByteArray block(65536, '\0');
while (fileSize > 0) {
if (fileSize < block.size()) block.truncate(fileSize);
qint64 written = file.write(block);
if (written != block.size()) return false;
fileSize -= written;
}
Q_ASSERT(fileSize == 0);
fsync(file.handle());
return file.remove();
}
1

QDir destination;
destination.remove("path to file");
1
По вопросам рекламы [email protected]