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

时间:2012-12-11 23:07:54

标签: c++ linux ubuntu

我正在用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有同样的问题。

1 个答案:

答案 0 :(得分:1)

解决此问题的解决方法是使用文件名和文件大小维护结构列表。每次检查dir获取文件列表时,请根据列表检查它们,如果列表中没有文件,请添加它。如果列表中有文件,则比较文件大小。如果文件大小相同,则(假设传输没有中断)您知道传输已完成。