C++ 快速文件复制与进度
我正在为Linux编写一个SDL应用程序,它可以从控制台(no X服务器)工作。我拥有的一个功能是文件复制机制,它将特定文件从HDD复制到USB闪存设备,并在UI中显示此复制的进度。为了做到这一点,我使用简单的while循环并按8kB块复制文件以获得复制进度。问题是,速度太慢了。我可以在近10分钟内复制一个100 MB的文件,这是不可接受的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,但我不知道我是否应该自己实现,因为这看
如何实现更快的文件复制?我在考虑一些异步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—您的问题不在于操作系统,而在于您自己的应用程序。