4

私が書いていない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();
}

ここでは、削除後に回復できないように、ファイルの内容をゼロに置き換えます。ファイルに実際の書き込みがないか、新しいデータを他のディスクセクターに書き込み、古いデータがそのまま残っているかの2つの結論に達しました。ファイルを復元できないために、ファイルの内容が実際にゼロに置き換えられるようにするにはどうすればよいですか? どんな助けでも本当に感謝します!

4

3 に答える 3

2

個人的にはshredまたは同様のツールをQProcess. この場合、これがおそらく最良の効果/労力比です。

これは Qt 固有のものではなく、一般的なものでもないため、自分で発明するべきではないと思います。

于 2014-04-04T12:40:05.863 に答える
1
QDir destination;
destination.remove("path to file");
于 2015-06-25T20:38:26.663 に答える
1

コードはかなり複雑です。「修正」する価値はありません。

以下は、そのようなアプローチがシステムでまったく機能する限り、機能するはずの合理的に健全な実装です。「うまくいかない」と言う場合、どうやってそれを確認しますか? どのプラットフォームで?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();
}
于 2014-04-04T16:42:46.857 に答える