C++ C++;复制文件的最可靠方法

C++ C++;复制文件的最可靠方法,c++,copy,memory-efficient,robustness,robust,C++,Copy,Memory Efficient,Robustness,Robust,好的,我知道磁盘写入错误是非常罕见的,所以请忽略这一点,因为我处理的数据非常重要(比如SSID)。所以,我想用绝对最小的内存量以绝对最健壮的方式复制一个文件。到目前为止,这是我所能做到的。它占用了很多内存,但我找不到来源。它的工作方式是反复检查数吨次,直到得到一个确认的结果(这可能会使错误的误报数量增加很多,但可能会大大降低实际错误的几率)。此外,底部的睡眠是为了让您有时间使用windows任务管理器分析程序的总体性能 #包括//fopen、fclose、fread、fwrite、BUFSIZ

好的,我知道磁盘写入错误是非常罕见的,所以请忽略这一点,因为我处理的数据非常重要(比如SSID)。所以,我想用绝对最小的内存量以绝对最健壮的方式复制一个文件。到目前为止,这是我所能做到的。它占用了很多内存,但我找不到来源。它的工作方式是反复检查数吨次,直到得到一个确认的结果(这可能会使错误的误报数量增加很多,但可能会大大降低实际错误的几率)。此外,底部的睡眠是为了让您有时间使用windows任务管理器分析程序的总体性能


#包括//fopen、fclose、fread、fwrite、BUFSIZ
#包括
#包括
#包括
使用名称空间std;
__内联复制文件(常量字符*从,常量字符*到)
{
文件填充=(*fopen(From,“rb”);
文件输出文件=(*fopen(到“rwb+”));
setvbuf(&infle,nullptr,_IONBF,0);
setvbuf(&outfile,nullptr,_IONBF,0);
fseek(&infle,0,SEEK_END);
长整型尺寸=ftell(&infle);
fseek(&infle,0,SEEK_SET);
无符号短错误金额;
成功;
字符c;
字符w;
查尔l;
对于(fpos_t i=0;(i!=size);+i){
错误金额=0;
fsetpos(&infle,&i);
c=fgetc(&INFLE);
fsetpos(&infle,&i);
成功=真实;
对于(l=0;(l!=126);+l){
fsetpos(&infle,&i);
success=(success=(fgetc(&infle)==c));
}
while(success==false){
fsetpos(&infle,&i);
如果(错误金额=32767){

cerr我只复制文件而不进行任何特殊检查,最后我将读取文件并将其哈希值与预期值进行比较。对于哈希函数,我将使用MD5或SHA-1。

我只复制文件而不进行任何特殊检查,最后我将读取文件并将其哈希值与预期值进行比较。对于hash函数,我将使用MD5或SHA-1。

\include
#include <boost/filesystem.hpp>
#include <iostream>

int main()
{
    try
    {
        boost::filesystem::copy_file( "C:\\Users\\Admin\\Desktop\\example file.txt",
                                      "C:\\Users\\Admin\\Desktop\\example copy.txt" );
    }
    catch ( boost::filesystem::filesystem_error const & ex )
    {
        std::cerr << "Copy failed: " << ex.what();
    }
}
#包括 int main() { 尝试 { boost::filesystem::copy_文件(“C:\\Users\\Admin\\Desktop\\example file.txt”, “C:\\Users\\Admin\\Desktop\\example copy.txt”); } 捕获(boost::filesystem::filesystem\u error const&ex) { 标准::cerr
#包括
#包括
int main()
{
尝试
{
boost::filesystem::copy_文件(“C:\\Users\\Admin\\Desktop\\example file.txt”,
“C:\\Users\\Admin\\Desktop\\example copy.txt”);
}
捕获(boost::filesystem::filesystem\u error const&ex)
{


既然你的代码已经运行了,你应该把问题转移到一个与你使用宏无关的地方:不要“重命名”常见的标准结构。没有人知道
文件
是什么,每个人都知道
文件
是什么。此外,您也不知道例如
fopen
如何创建它返回的结构指针。通过取消引用它并复制到您自己的结构,当您调用
fclose
时,您可能会有未定义的行为。如果
fopen,该怎么办E>调用<代码> MalOC/创建内存,和<代码> fCalth调用<代码>免费>代码>除了C++样式包含和输出之外,这是普通的旧C。什么使你将此标记为C++问题?“改名"常见的标准结构。没有人知道
文件
是什么,每个人都知道
文件
是什么。此外,您也不知道例如
fopen
如何创建它返回的结构指针。通过取消引用它并复制到您自己的结构,当您调用
fclose
时,您可能会有未定义的行为。如果
fopen,该怎么办E>调用<代码> MalOC/<代码>创建内存,和<代码> fCuts调用<代码>免费>代码>除了C++样式包含和输出外,这是普通的旧C。什么使你将此标记为C++问题?相关:校验和不是完全可靠的,因为鸽子洞原理,所以使用它们会挫败目的。stion更多的是为了避免罕见的磁盘写入错误。没有100%完美的解决方案。每个算法都有一个很小的机会报告复制成功,而实际上它失败了。即使你成功地完成了写入,也不能完美地保证一个字节不会在一分钟后被破坏。因此,我更喜欢一个简单且我所理解的解决方案是基于标准的,过于复杂的代码,很难理解,可能更健壮,也可能不更健壮。宾果!!!!!你是绝对正确的!!!!!!!!!!!!!!!!!!!!!基本上,我想做的是大大减少错误复制的机会,因此,校验和不是最好的方法。请阅读鸽子洞原理和我在这方面的另一篇文章:由于鸽子洞原理,校验和并不完全可靠,因此使用它们将无法达到目的。此外,这个问题更多的是关于避免罕见的磁盘写入错误。没有100%完美的解决方案。每个算法都有一个很小的机会报告副本已发生错误成功,但实际上失败了。即使您成功地完成了写入,也无法完美地保证一个字节不会在一分钟后被破坏。因此,我更喜欢一个基于标准的简单且易于理解的解决方案,而不是难以理解的复杂代码,而且可能更健壮,也可能更健壮你是绝对正确的!!!!!!!!!!!!!!!!!!!!!从本质上说,我想做的是大大减少错误抄写的机会,因此,检查总数不是办法。请阅读关于鸽子洞原理和我关于这个主题的另一篇帖子:很好,但是
#include <boost/filesystem.hpp>
#include <iostream>

int main()
{
    try
    {
        boost::filesystem::copy_file( "C:\\Users\\Admin\\Desktop\\example file.txt",
                                      "C:\\Users\\Admin\\Desktop\\example copy.txt" );
    }
    catch ( boost::filesystem::filesystem_error const & ex )
    {
        std::cerr << "Copy failed: " << ex.what();
    }
}