Как удалить с помощью C++ безвозвратно файл? То есть без способа его восстановления
гарантированного универсального способа не существует, во-первых, потому что мы не знаем подробностей о том, как устроено хранение файлов в конкретной системе (ФС, вид памяти и носителя под ней и т. д.), во-вторых, ОС далеко не всегда предоставляет нам какие-то интерфейсы для того, чтобы этими деталями манипулировать
так что самое лучшее, что можно сделать средствами самого языка - это записать рандом поверх содержимого файла несколько раз (вряд ли сработает на чем-то, кроме ЖД) и потом удалить как обычно (см. std::filesystem)
В современном мире уничтожение информации гарантирует только физическое уничтожение носителя. Но спрятать файл от чайников, действительно, можно вышеописанным способом - записать в него ерунду и удалить. Восстановить-то его можно будет, конечно, но внутри будет ерунда. Ну а товарищ майор... Нет, товарищ майор, наверное, не справится. А вот агент Малдер - тот выпаяет микросхемы из твоего накопителя, прочитает их на низком уровне, загонит все в суперкомпьютер и при помощи мудрых алгоритмов найдет все уцелевшие куски твоего файла, поскольку мудрый же контроллер накопителя при перезаписи переназначает физические ячейки и информация, с некоторой вероятностью, может сохраниться. Ну а в случае с ЖД он вынет диски и прочитает то, что на них было записано раньше, методом чтения между дорожками на специальном устройстве... В общем, только сжечь и переплавить.
это очень просто, открой фаил на запись и запиши в него столько нулей сколько по размеру сам фаил, потом просто удали через filesystem. NTFS и ext4 гарантируют статичность адресов блоков файлов если не происходит запись с расширением или сохранение с усечением. это значит что все записанные данные будут примененны к тем-же блокам на которых находится старые.
И значит что все данные будут просто перезаписаны без возможности восстановления.
Наданный момент почти для всех популярных файловых систем, данный трюк успешно работает.
Псевдо пример:
void SecureDeleteFile(const String& filePath)
{
File f(filePath, WRITE | BINARY);
long long fileSize = f.size();
for (long long i = 0; i < fileSize; i++)
f.writeByte(0);
f.close();
File::deleteFile(f);
}
#include< cstdio >
using namespace std;
int main(){
remove("path");
}
Возможно будут проблемы, если файл может трогать только суперюзер, в этом случае программу следует запускать от имени администратора или если ты на линухе, то писать sudo ./program, а потом вводить пароль