gpt4 book ai didi

c++ - 有进度的快速文件复制

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:40 26 4
gpt4 key购买 nike

我正在为 Linux 编写一个 SDL 应用程序,它在控制台(没有 X 服务器)上运行。我有一个功能是文件复制机制,将特定文件从 HDD 复制到 USB 闪存设备,并在 UI 中显示此复制的进度。为此,我使用简单的 while 循环并按 8kB block 复制文件以获得复制进度。问题是,它很慢。我要在将近 10 分钟内复制一个 100 MB 的文件,这是 Not Acceptable 。

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

最佳答案

不要与复制进度同步更新您的 UI,这会大大降低速度。您应该在与主 UI 线程不同的线程上运行文件复制,以便文件复制可以尽可能快地进行,而不会妨碍应用程序的响应能力。然后,UI 可以自然速率(例如,以显示器的刷新率)自行更新。

您还应该使用大于 8 KB 的缓冲区大小。多做试验,但我认为使用更大的缓冲区大小(例如在 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

请注意,如果您要将文件发送到套接字 而不是另一个文件,您应该改为使用sendfile(2)。系统调用,它直接在内核空间中复制文件,而无需往返用户空间。当然,如果这样做,您将无法获得任何进度信息,因此这可能并不总是理想的。

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

关于c++ - 有进度的快速文件复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3895634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com