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