Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用0重写文件。我做错了什么?_C++_File_Boost_Filesystems - Fatal编程技术网

C++ 用0重写文件。我做错了什么?

C++ 用0重写文件。我做错了什么?,c++,file,boost,filesystems,C++,File,Boost,Filesystems,我想用0重写文件。它只写几个字节 我的代码: int fileSize = boost::filesystem::file_size(filePath); int zeros[fileSize] = { 0 }; boost::filesystem::path rewriteFilePath{filePath}; boost::filesystem::ofstream rewriteFile{rewriteFilePath, std::ios::trunc}; rewriteFile <

我想用0重写文件。它只写几个字节

我的代码:

int fileSize = boost::filesystem::file_size(filePath);

int zeros[fileSize] = { 0 };

boost::filesystem::path rewriteFilePath{filePath};
boost::filesystem::ofstream rewriteFile{rewriteFilePath, std::ios::trunc};
rewriteFile << zeros;
还有。。。这足以把文件撕碎吗?接下来我该怎么做才能使文件不可恢复

编辑:好的。我把代码改写成这样。这个代码可以这样做吗

int fileSize = boost::filesystem::file_size(filePath);

boost::filesystem::path rewriteFilePath{filePath};
boost::filesystem::ofstream rewriteFile{rewriteFilePath, std::ios::trunc};

for(int i = 0; i < fileSize; i++) {
    rewriteFile << 0;
}

您的代码有几个问题

int zeros[fileSize]={0}

您正在创建一个大小为sizeofint*fileSize字节的数组。对于您正在尝试的内容,您需要一个大小为fileSize字节的数组。因此需要使用1字节的数据类型,如unsigned char或uint8\t

<>但是,更重要的是,由于文件化的值直到运行时才知道,所以这种类型的数组被称为可变长度数组VLA,它是C++中的非标准特征。如果需要动态分配的数组,请使用std::vector

boost::filesystem::ofstream rewriteFile{rewriteFilePath,std::ios::trunc}

trunc标志将现有文件的大小截断为0。这需要更新文件的元数据以重置其跟踪的字节大小,并将文件的所有已用磁盘扇区标记为可重用。存储在这些扇区中的实际文件字节不会被擦除,直到随着时间的推移扇区被重新使用而被覆盖。但是,您随后写入被截断文件的任何字节都不能保证,也很可能不会覆盖磁盘上的旧字节。因此,根本不要截断文件


重写文件您的代码有几个问题

int zeros[fileSize]={0}

您正在创建一个大小为sizeofint*fileSize字节的数组。对于您正在尝试的内容,您需要一个大小为fileSize字节的数组。因此需要使用1字节的数据类型,如unsigned char或uint8\t

<>但是,更重要的是,由于文件化的值直到运行时才知道,所以这种类型的数组被称为可变长度数组VLA,它是C++中的非标准特征。如果需要动态分配的数组,请使用std::vector

boost::filesystem::ofstream rewriteFile{rewriteFilePath,std::ios::trunc}

trunc标志将现有文件的大小截断为0。这需要更新文件的元数据以重置其跟踪的字节大小,并将文件的所有已用磁盘扇区标记为可重用。存储在这些扇区中的实际文件字节不会被擦除,直到随着时间的推移扇区被重新使用而被覆盖。但是,您随后写入被截断文件的任何字节都不能保证,也很可能不会覆盖磁盘上的旧字节。因此,根本不要截断文件


重写文件只是为了好玩,用随机数据覆盖:


请注意,它在编译后会扰乱自己的源文件:

只是为了好玩,用随机数据覆盖:


请注意,它在编译后会对自己的源文件进行置乱:

我无法充分强调注释的重要性,即覆盖文件内容并不保证覆盖任何原始数据。因此,这个问题的所有其他答案在最近的任何操作系统上都是无关的

现代的归档系统是基于区段的,这意味着文件存储为已分配区块的链接列表。更新一个区块可能会更快,因为归档系统可以编写一个全新的区块并简单地调整链表,所以他们就是这么做的。实际上,即写即复制归档系统总是写入任何修改块的副本,并更新其当前有效范围的B树


此外,即使您的文件系统不这样做,您的硬盘也可能使用完全相同的技术来提高性能,而且任何SSD几乎肯定都会使用这种技术,因为闪存是如何工作的。因此,在现代系统中,覆盖数据以擦除数据是毫无意义的。不行。隐藏旧数据的唯一安全方法是全磁盘加密。你在欺骗你自己和你的用户。

我再怎么强调这些评论的重要性也不为过,因为覆盖文件的内容并不能保证覆盖任何原始数据。因此,这个问题的所有其他答案在最近的任何操作系统上都是无关的

现代的归档系统是基于区段的,这意味着文件存储为已分配区块的链接列表。更新一个区块可能会更快,因为归档系统可以编写一个全新的区块并简单地调整链表,所以他们就是这么做的。实际上,即写即复制归档系统总是写入任何修改块的副本,并更新其当前有效范围的B树

此外,即使您的文件系统不这样做,您的硬盘也可能使用完全相同的技术来提高性能,而且任何SSD几乎肯定都会使用这种技术,因为闪存是如何工作的。因此,在现代系统中,覆盖数据以擦除数据是毫无意义的。不行。隐藏旧数据的唯一安全方法是全磁盘加密。随便
ng否则你是在欺骗你自己和你的用户。

VLA是C语言的东西,也许是编译器的扩展。为什么不使用碎纸机工具呢?无论如何,在TRUC之后,无法保证操作系统将写入原始文件占用的相同磁盘扇区。覆盖现有文件上的0是否足够?你的选择,你的要求,所以你告诉我们。你可以看看一些商业工具。。。许多年前,我使用了一种名为ZTree的产品,它的磁盘清洗功能带有DoD消毒选项。我还发现:美国国防部在《清除和消毒标准DoD 5220.22-M》中建议使用一个字符覆盖所有可寻址位置,然后输入一个随机字符并验证。请参阅带有注释的表格,以清除和清理可写介质上的信息。为了证实这一点,VLA是C语言的东西,可能是编译器扩展。为什么不使用碎纸机工具呢?无论如何,在trunc之后,无法保证操作系统将写入原始文件占用的相同磁盘扇区。覆盖现有文件上的0是否足够?你的选择,你的要求,所以你告诉我们。你可以看看一些商业工具。。。许多年前,我使用了一种名为ZTree的产品,它的磁盘清洗功能带有DoD消毒选项。我还发现:美国国防部在《清除和消毒标准DoD 5220.22-M》中建议使用一个字符覆盖所有可寻址位置,然后输入一个随机字符并验证。请参阅带有注释的表格,以清除和清理可写介质上的信息。为了证实这一点……谢谢。我有另一个主意。在用0重写文件后,我也想用随机字符重写文件。我该怎么做?@RichardZavodny你接受这个答案并编写代码用随机字符重写文件,你应该用不同类型的随机数据,而不仅仅是零,多次重写文件。这将更彻底地扰乱扇区中的信号。如果数据存储在ZFS或BTRFS等写拷贝文件系统中,所有这些都可能无关紧要……谢谢。我有另一个主意。在用0重写文件后,我也想用随机字符重写文件。我该怎么做?@RichardZavodny你接受这个答案并编写代码用随机字符重写文件,你应该用不同类型的随机数据,而不仅仅是零,多次重写文件。这将更彻底地扰乱扇区中的信号。如果数据存储在ZFS或BTRFS等写时拷贝文件系统中,所有这些都可能无关紧要。。。
int fileSize = boost::filesystem::file_size(filePath);

std::vector<char> zeros(fileSize, 0);

boost::filesystem::path rewriteFilePath(filePath);
boost::filesystem::ofstream rewriteFile(rewriteFilePath, std::ios::binary);
rewriteFile.write(zeros.data()/*&zeros[0]*/, fileSize);
int fileSize = boost::filesystem::file_size(filePath);

const char zeros[1024] = {0}; // adjust size as desired...

boost::filesystem::path rewriteFilePath(filePath);
boost::filesystem::ofstream rewriteFile(rewriteFilePath, std::ios::binary);

int loops = fileSize / sizeof(zeros);
for(int i = 0; i < loops; ++i) {
    rewriteFile.write(zeros, sizeof(zeros));
}
rewriteFile.write(zeros, fileSize % sizeof(zeros));
#include <boost/iostreams/device/mapped_file.hpp>
#include <random>
namespace bio = boost::iostreams;

int main() {
    bio::mapped_file dst("main.cpp");

    std::mt19937 rng { std::random_device{} () };
    std::uniform_int_distribution<char> dist;

    std::generate_n(dst.data(), dst.size(), [&] { return dist(rng); });
}