Навсегда удалить файл в 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();
}

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


person user3497819    schedule 04.04.2014    source источник
comment
нет абсолютно никакой гарантии, что старого блока все еще нет на диске/в какой-либо резервной копии.   -  person ratchet freak    schedule 04.04.2014
comment
Это часто задаваемый вопрос — поиск безопасного стирания файлов. Пример 1 Пример 2 Это трудная проблема, и лучше оставить инструмент, который уже делает это, а не пытаться разработать свой собственный (Qt не предлагает для этого никаких функций, это будет сильно зависеть от ОС).   -  person Linville    schedule 04.04.2014
comment
если вы не хотите, чтобы кто-либо читал содержимое вашего файла, когда он вам не нужен, то, возможно, вы хотите того же, когда файл вам все еще нужен. Так что самый простой способ запретить кому-либо читать существующий и удаленный файл — зашифровать его. Я понимаю, что это не то, о чем вы спрашиваете, и сложно безопасно зашифровать файл, но это может помочь. Как правило, вы просто не можете быть уверены, что файл не может быть восстановлен, пока вы физически не расплавите диск.   -  person JustAnotherCurious    schedule 04.04.2014


Ответы (3)


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

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

person lpapp    schedule 04.04.2014
comment
shred делает почти то же, что и приведенный выше код... В Windows порта shred недостаточно. SDelete - единственное разумное решение (или точная повторная реализация). - person Kuba hasn't forgotten Monica; 05.04.2014
comment
Нет, как указывали другие, это зависит от платформы. Вы не можете просто реализовать это в Qt. Более того, shred делает гораздо больше и отличается от приведенного выше кода. Вот исходный код. Кроме того, я не помню, чтобы упоминался порт клочья. - person lpapp; 05.04.2014
comment
Помимо прямого ввода-вывода, shred больше не делает ничего интересного. Культ многократной перезаписи карго в наши дни довольно стар и скучен. Если вы однажды перезапишете что-то на современном жестком диске, данные исчезнут, и никто не сможет их восстановить. - person Kuba hasn't forgotten Monica; 05.04.2014
comment
Я не знаю, что вы имеете в виду. Давайте на секунду представим, что то, что вы пытаетесь сказать, правда, вокруг еще много старых жестких дисков, но я не уверен, что то, что вы говорите, правда. Возможно, вы пропустили чтение другой связанной ветки в вопросе ОП. Вы, кажется, очень упрощенно смотрите на эту вещь, хотя компании десятилетиями специализируются на этой задаче. - person lpapp; 05.04.2014
comment
Старый жесткий диск для целей этого обсуждения — это то, что может хранить ‹1 ГБ. Нет ни одной специализированной компании, и я в этом уверен на 100%, которая может восстановить данные с IDE/ATA/SCSI жесткого диска емкостью ›1 ГБ, перезаписанного нулями один раз. Было бы супер круто, если бы это было возможно, но это не так. - person Kuba hasn't forgotten Monica; 05.04.2014
comment
На самом деле, есть. На самом деле, я даже проходил собеседование на такую ​​роль в прошлом, ну да ладно, я не против, если вы напишете этот игнор. Я действительно понятия не имею, как это связано с 1 ГБ. - person lpapp; 05.04.2014
comment
техника Гутмана — единственный опубликованный метод восстановления данные. Это относится к приводам MFM/RLL, которые давно устарели. Сам Гутманн признает, что это неприменимо к современным накопителям PRML/EPRML (стандартным с конца 90-х), и никто не продемонстрировал возможности восстановления перезаписанных данных с этих типов. Кроме того, перезапись менее полезна для твердотельных накопителей — запись идет в какой-то другой свободный блок, и исходные данные могут оставаться нетронутыми, пока контроллер не очистит их. - person nobody; 01.06.2014

Код довольно запутанный. "Исправлять" не стоит.

Ниже приведена разумная реализация, которая должна работать, если такой подход вообще может работать в вашей системе. Если вы скажете, что это "не работает" - как вы это проверите? На какой платформе? Какая версия 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();
}
person Kuba hasn't forgotten Monica    schedule 04.04.2014
comment
Зачем открывать файл ReadWrite вместо WriteOnly? Кроме того, я думаю, что вы должны закрыть () перед удалением () для Windows. - person Frank Osterfeld; 04.04.2014
comment
Открытие WriteOnly может привести к усечению файла, а мы этого не хотим. Открытие ReadWrite не должно повредить, я не думаю. close() выполняется автоматически remove(), это поведение QFile и не зависит от платформы. - person Kuba hasn't forgotten Monica; 04.04.2014
comment
Я использую Qt Creator 2.6.0, основанный на Qt 4.8.3 (32-bit) на Windows 7. Пытался последовать вашему совету, но компилятор выдает ошибку: 'fsync' не был объявлен в этой области, как решить Это? - person user3497819; 08.04.2014

person    schedule
comment
гм, это должно иметь один и тот же строковый литерал, указанный дважды? - person o11c; 26.06.2015
comment
Пожалуйста, добавьте описание к вашему ответу. - person Mohit Jain; 26.06.2015
comment
Вы можете объявить QDir без пути назначения QDir; - person Marko Stojkovic; 26.06.2015