永久删除Qt中的文件

时间:2014-04-04 11:34:14

标签: c++ qt qtcore qfile shred

我不得不在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();
}

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

3 个答案:

答案 0 :(得分:2)

我个人只会通过shred使用QProcess或类似的工具。在这种情况下,这可能是效果/努力比最好的。

我认为你不应该自己发明这个,因为这不是Qt特定的东西,也不是常见的东西。

答案 1 :(得分: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();
}

答案 2 :(得分:1)

QDir destination;
destination.remove("path to file");
相关问题