Windows内存映射文件打造极速复制(速度已和ExtremeCopy商业软件相当)

如题,先贴图,后续上传源码和exe
测试文件大小7.08GB:

结果:


商业软件ExtremeCopy 2.1测试结果:
最新代码:
/*
* Copyright (c) purelib 2012-2015.
*/
#include <purelib/movable_window.h>
#include <purelib/file_mapping.h>
#include <purelib/controls.h>
#include <purelib/nsconv.h>
#include <thread>
using namespace purelib;
using namespace purelib::gui;
using namespace purelib::filesystem;

#ifdef _DEBUG
#pragma comment(lib, "purelib32_d.lib")
#else
#pragma comment(lib, "purelib32.lib")
#endif

class fixed_window : public movable_window
{
public:
    fixed_window()
    {
        append_style(WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU);
    }
};

class extremely_copier : public fixed_window
{
public:

    extremely_copier()
    {
		set_opacity(0.95f);
        set_text(L"extremely_copier");
        resize(700, 360);
        int delta = 30;

        this->input_.reset(new controls::xxedit(L"D:\\vs2013.4_ult_chs.iso", 17, 10, 200, 25, *this, WS_BORDER | ES_AUTOHSCROLL));
        this->input_->set_font(purelib::gui::DEF_FONT_NORM_10);
        this->input_->set_left(5);
        this->input_->set_top(5);

        this->output_.reset(new controls::xxedit(L"D:\\TDDOWNLOAD\\bak\\vs2013.4_ult_chs.iso", 17, 10, 200, 25, *this, WS_BORDER | ES_AUTOHSCROLL));
        this->output_->set_font(purelib::gui::DEF_FONT_NORM_10);
        this->output_->set_left(350 + 20);
        this->output_->set_top(5);


        this->time_used_.reset(new controls::xxedit(L"00:00:00", 17, 10, 200, 25, *this, WS_BORDER | ES_READONLY | ES_AUTOHSCROLL));
        this->time_used_->set_font(purelib::gui::DEF_FONT_NORM_10);
        this->time_used_->set_left(5);
        this->time_used_->set_top(100);

        this->launcher_.reset(new controls::xxbutton(L"启动复制", 17, 10, 118, 25, *this, WS_BORDER | BS_PUSHBUTTON));
        this->launcher_->set_font(purelib::gui::DEF_FONT_BOLD_10);
        this->launcher_->set_left(this->output_->get_location().x + this->output_->get_size().width);
        this->launcher_->set_top(280 + 15 + delta);

        this->cachesize_.reset(new controls::xxedit(L"8192", 17, 10, 200, 25, *this, WS_BORDER | ES_AUTOHSCROLL | ES_NUMBER));
        this->cachesize_->set_font(purelib::gui::DEF_FONT_NORM_10);
        this->cachesize_->set_left(this->output_->get_location().x + this->output_->get_size().width - delta - this->cachesize_->get_size().width);
        this->cachesize_->set_top(280 + 15 + delta);

        progress_.reset(new controls::xxprogressbar(17, 280, 670, 25, *this));

        register_event(WM_TIMER, [this](void){
            ++time_used_seconds_;

            auto hh = time_used_seconds_ / 3600;
            auto left = time_used_seconds_ - hh * 3600;
            auto mm = left / 60;
            auto ss = left % 60;

            static wchar_t svalue[128];
            swprintf(svalue, L"%02d:%02d:%02d", hh, mm, ss);
            time_used_->set_text(svalue);
        });

        register_event(this->launcher_->get_id(), [this](void){
			// start new worker thread, avoid block UI thread.
            std::thread copier([this]{
                auto input = input_->get_text();
                auto output = output_->get_text();
                auto cachesize = atol(nsc::transcode(cachesize_->get_text()).c_str());
                if (cachesize == 0)
                    cachesize = 8192;
                
                launcher_->set_text(L"正在复制...");
                launcher_->disable();
                progress_->set_value(0);

                uint64_t total_bytes = 0;
                
                time_used_seconds_ = 0;
                this->start_timer(1000);
                auto start = clock();
                if ((total_bytes = progress_->extremely_copy(input.c_str(), output.c_str(), cachesize)) > 0)
                {
                    auto seconds = (clock() - start) / (long double)CLOCKS_PER_SEC;
                    
                    this->stop_timer();

                    swprintf(message_, L"复制成功,共耗时%f秒, 平均速度%fMB/s", seconds, total_bytes / (SZ(1, M) * seconds));
                    
                    MessageBox(get_handle(), message_, L"提示", MB_OK | MB_ICONINFORMATION);
                }
                else
                {
                    MessageBox(get_handle(), L"复制失败", L"提示", MB_OK | MB_ICONERROR);
                }

                launcher_->set_text(L"启动复制");
                launcher_->enable();
            });

            copier.detach();
        });
    }

private:
    std::unique_ptr<controls::xxedit>        input_;
    std::unique_ptr<controls::xxedit>        output_;
    std::unique_ptr<controls::xxedit>        time_used_;
    std::unique_ptr<controls::xxedit>        cachesize_;
    std::unique_ptr<controls::xxbutton>      launcher_;

    std::unique_ptr<controls::xxprogressbar> progress_;
    u_long                                   time_used_seconds_;

    wchar_t                                  message_[256];
};


purelibGUIEntry
{
    // enable_leak_check();

    extremely_copier copier;

    copier.update();
    copier.show();

    copier.message_loop();

    return 0;
}



extremely_copier可执行文件: http://pan.baidu.com/s/1hqEfBDU



ExtremeCopy和FastCopy、TeraCopy一样,都是加快Windows文件复制/移动的工具,是拷贝大文件必备利器,支持通配符。ExtremeCopy有标准版(免费)、便携版和专业版,支持简体中文,该软件无论在 Windows XP 还是在 Windows 7 都能获得比系统自带的复制功能要快20%~120% 的性能提升。根据官方的视频显示其不仅比Windows 7自带的文件复制功能要快,甚至还比目前国外流行的TeraCopy和SuperCopier还要快得多。这种高效率的文件复制功能对目前越来越多和越来越大的硬盘占用容量的文件用户来说是非常实用的工具。 一旦成功安装,ExtremeCopy 就会取代Windows的资源管理器的复制功能,把其作为你的默认复制工具,这是一个非常不错的功能,你仍然可以像往常一样按 Ctrl+C 和Ctrl+V 抑或用鼠标拖放文件复制或移动你的文件Windows会自动调用 ExtremeCopy复制/移动你的文件。当然你也可以使用Windows原来的复制功能,因为ExtremeCopy仍保留该操作在右键菜单项 "Windows 粘贴",只要在要复制到的目标文件夹右击菜单即可见到。除些之外,也可以用Windows 自带的复制功能作为默认的使用,而把ExtremeCopy 作为后备,只要在配置把“作为Windows 默认的文件复制器”前面的钩去掉并确认保存就行了。 ExtremeCopy 作为文件复制工具是能支持文件通配符的。诸如*.mp3, *.jpg之类的文件可以轻松搞定。双击启动ExtremeCopy 并显示任务编辑对话框后,把要复制文件夹拖放到源文件框里,然后高亮该文件夹,此时“过滤”按钮就变成有效了,点击该按钮,在过滤对话框里输入你想该文件夹只复制文件的通配符即可。 以最快的速度把同一堆的源文件,以最短的时间同时复制到多个目标文件夹里。这个功能是目 ExtremeCopy 任务对话框前所有文件复制工具中只有ExtremeCopy所特有的功能,该功能对很多文件文件夹要同时需要复制到多个文件夹需求的用户是非常有用的,而且也能节省大量的时间。 ------------------------------------------------------------------网友用 1.22 GB 文件大小作为测试对比现有的所有软件,其测试结果如下: ExtremeCopy Pro 2.0.4 - 33 秒. FastCopy 2.08 - 35 秒. KillCopy 2.85 - 45 秒. SuperCopier 2.2 Beta - 47 秒. Copy Handler 1.32 - 50 秒. RichCopy 4.0.211 - 50 秒. Windows XP (内建的文件复制) - 52 秒. FFCopy 1.0 - 58 秒. TeraCopy Pro 2.2 - 1 分 15 秒. Ultracopier 0.2.0.15 - 1 分 25 秒. ExtremeCopy Pro 2.3.0 注册码:J9I95-83JUN-8PD2H-ARTGF
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值