打开通过蓝牙发送的已接收文件-如何等到完全接收? 我正在编写C++中的一些代码,监视Ubuntu通过蓝牙(~/下载)接收的文件。我使用图像作为示例文件,因为应用程序正在打开图像并显示它们

打开通过蓝牙发送的已接收文件-如何等到完全接收? 我正在编写C++中的一些代码,监视Ubuntu通过蓝牙(~/下载)接收的文件。我使用图像作为示例文件,因为应用程序正在打开图像并显示它们,c++,linux,ubuntu,C++,Linux,Ubuntu,代码每2秒轮询一次目录,并检查那里是否有任何文件。如果有,它会立即将文件放入子目录并加载。但是,它会在传输完成之前加载文件。它可以看到文件,移动文件,加载文件,并显示一个损坏的图像,所有这些都是在传输过程中进行的 子目录最终包含完整的图像 我尝试使用fcntl锁定文件,但即使文件仍在编写中,它也成功锁定: #ifndef WIN32 //We have to do a file lock on ubuntu... /* l_ty

代码每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有相同的问题。

解决这个问题的一个解决方法是维护一个包含文件名和文件大小的结构列表。每次检查目录时,获取文件列表,对照列表进行检查,如果列表中没有文件,则添加它。如果列表中有文件,请比较文件大小。如果文件大小相同,则(假设传输未中断)您知道传输已完成。

您是否尝试过其他锁定功能?如果锁坏了,我有办法解决。不,这差不多就是我所试过的。你的解决方法是什么?你使用什么文件格式?我找到了一个更好的解决方案,但只能确认它适用于jpeg。我们正在加载各种媒体,各种图像、视频、音频、文档,因此,不幸的是,检查最后一个字节充其量只是一件乏味的事情,而且可能不太可能some@LyndenShields如果传输操作未更改文件权限位,则锁定将不起作用。我会尝试我发布的其他解决方法(监控文件大小),这有点糟糕,但如果传输不遵守文件处理约定,我不知道你还会怎么做。你想重新提交答案吗,我想这就是我要做的。它工作得很好,而且当传输需要几十秒时,额外的延迟不是什么大问题。而且,我可以更频繁地对文件夹进行投票,这没什么大不了的。