C++ 快速文件复制与进度

C++ 快速文件复制与进度,c++,file,copy,sdl,performance,C++,File,Copy,Sdl,Performance,我正在为Linux编写一个SDL应用程序,它可以从控制台(no X服务器)工作。我拥有的一个功能是文件复制机制,它将特定文件从HDD复制到USB闪存设备,并在UI中显示此复制的进度。为了做到这一点,我使用简单的while循环并按8kB块复制文件以获得复制进度。问题是,速度太慢了。我可以在近10分钟内复制一个100 MB的文件,这是不可接受的 如何实现更快的文件复制?我在考虑一些异步API,它可以将文件从HDD读取到缓冲区,并将数据存储到单独的线程中的USB,但我不知道我是否应该自己实现,因为这看

我正在为Linux编写一个SDL应用程序,它可以从控制台(no X服务器)工作。我拥有的一个功能是文件复制机制,它将特定文件从HDD复制到USB闪存设备,并在UI中显示此复制的进度。为了做到这一点,我使用简单的while循环并按8kB块复制文件以获得复制进度。问题是,速度太慢了。我可以在近10分钟内复制一个100 MB的文件,这是不可接受的


如何实现更快的文件复制?我在考虑一些异步API,它可以将文件从HDD读取到缓冲区,并将数据存储到单独的线程中的USB,但我不知道我是否应该自己实现,因为这看起来并不容易。也许你知道一些C++ API /库,可以为我吗?或者其他更好的方法?

让操作系统完成所有工作:

  • 将文件映射到内存:,将大大加快读取过程
  • 使用将其保存到文件中

  • 不要用复制进度同步更新UI,这会大大降低速度。您应该在主UI线程之外的单独线程上运行文件复制,以便文件复制可以在不妨碍应用程序响应的情况下尽可能快地进行。然后,用户界面可以按自然速率(例如显示器的刷新速率)进行自我更新

    您还应该使用大于8KB的缓冲区大小。尝试一下,但我认为如果缓冲区大小更大(例如,在64-128 KB范围内),您会得到更快的结果

    所以,它可能看起来像这样:

    #define BUFSIZE (64*1024)
    
    volatile off_t progress, max_progress;
    
    void *thread_proc(void *arg)
    {
        // Error checking omitted for expository purposes
        char buffer[BUFSIZE];
        int in = open("source_file", O_RDONLY);
        int out = open("destination_file", O_WRONLY | O_CREAT | O_TRUNC);
    
        // Get the input file size
        struct stat st;
        fstat(in, &st);
    
        progress = 0;
        max_progress = st.st_size;
    
        ssize_t bytes_read;
        while((bytes_read = read(in, buffer, BUFSIZE)) > 0)
        {
            write(out, buffer, BUFSIZE);
            progress += bytes_read;
        }
    
        // copy is done, or an error occurred
        close(in);
        close(out);
    
        return 0;
    }
    
    void start_file_copy()
    {
        pthread_t t;
        pthread_create(&t, NULL, &thread_proc, 0);
    }
    
    // In your UI thread's repaint handler, use the values of progress and
    // max_progress
    
    请注意,如果要将文件发送到套接字而不是另一个文件,则应使用系统调用,该调用将文件直接复制到内核空间,而无需往返到用户空间。当然,如果你这样做,你就无法获得任何进展信息,因此这可能并不总是理想的


    对于Windows系统,您应该使用,它既高效又为您提供了一个进度回调例程。

    “我使用简单的while循环并按8kB块复制文件以获得复制进度。”-这类似于标准
    cp
    的工作方式。你确定没有别的东西让你慢下来吗?您确定您的USB驱动器没有
    sync
    mount选项吗?Linux针对这种情况进行了优化,在10分钟内优化100MB—您的问题不在于操作系统,而在于您自己的应用程序。