打开通过蓝牙发送的已接收文件-如何等待完全接收
Opening received files sent via bluetooth - how to wait until fully received?
我正在用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#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何让LLDB在成功时退出,在失败时等待
- 等待整个 omp 块完成,然后再调用第二个函数
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 等待被迷住了,没有回来
- 等待 WaitForMultipleObjects 窗口中的事件数量可变
- 一个线程等待多个线程事件
- 等待 qthread 终止的正确方法是什么?
- 不可预测的C++睡眠/等待行为
- Bison/flex 在识别规则后等待输入
- 使用记事本C++打开 txt 文件时无需等待
- 接受函数在发送数据包时等待
- 在Visual Studio中运行/调试C ++时,如何在结束时等待输入
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 在等待时破坏condition_variable
- 等待等待失效的子进程