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();
}

这里被替换为带有零的文件内容,因为删除后无法恢复。谷歌搜索我得出两个结论,要么文件中没有真正的写入,要么将新数据写入其他磁盘扇区,而旧的仍然存在。如何使文件的内容真正被零替换而无法恢复?任何帮助将不胜感激!

4

3 回答 3

2

我个人会shred通过QProcess. 在这种情况下,这可能是最好的效果/努力比。

我认为您不应该自己发明它,因为这不是 Qt 特有的东西,也不是常见的东西。

于 2014-04-04T12:40:05.863 回答
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 回答
1
QDir destination;
destination.remove("path to file");
于 2015-06-25T20:38:26.663 回答