gpt4 book ai didi

c++ - 打开通过蓝牙发送的接收文件 - 如何等到完全接收?

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:21 28 4
gpt4 key购买 nike

我正在用 c++ 编写一些代码来监视 ubuntu 放置通过蓝牙接收的文件的目录 (~/Downloads)。我使用图像作为示例文件,因为应用程序正在打开图像并显示它们。

代码每 2 秒轮询一次目录并检查那里是否有任何文件。如果有,它会立即将文件放入子目录并加载它。但是,它会在传输完成之前加载文件。它查看文件、移动文件、加载文件并显示损坏的图像,同时仍在传输中。

子目录最终包含完整图像。

我尝试使用 fcntl 来锁定文件,但即使在文件仍在写入时它也已成功锁定:

#ifndef WIN32
//We have to do a file lock on ubuntu...
/* l_type l_whence l_start l_len l_pid */
struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0 };
int fd;
fl.l_pid = getpid();
if((fd = open(newFile.c_str(),O_RDWR)) == -1){
DODEBUG(ALWAYS,("LOCKING FAILED!"));
continue;
}
if (fcntl(fd, F_SETLKW, &fl) == -1) {
DODEBUG(ALWAYS,("LOCKING FAILED!"));
close(fd);
continue;
}
DODEBUG(ALWAYS,("GOT LOCK"));
fl.l_type = F_UNLCK; /* set to unlock same region */
if (fcntl(fd, F_SETLK, &fl) == -1) {
DODEBUG(ALWAYS,("UNLOCKING FAILED!"));
}
close(fd);

#endif
newFile = moveFile(newFile);
const std::string s(newFile);
loadImage(newFIle);

请注意,我正在编写的代码也需要在 Windows 和 Mac 上运行。 Windows 版本已经可以完美运行,因为文件在完全接收之前无法访问。我没有尝试过 mac,但我认为它与 ubuntu 有相同的问题。

最佳答案

解决此问题的解决方法是维护一个包含文件名和文件大小的结构列表。每次检查目录时都会得到一个文件列表,根据列表检查它们,如果文件不在列表中,请添加它。如果文件在您的列表中,请比较文件大小。如果文件大小相同,则(假设传输未中断)您知道传输已完成。

关于c++ - 打开通过蓝牙发送的接收文件 - 如何等到完全接收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13830044/

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