0

私は、ubuntuがbluetooth(〜/ Downloads)経由で受信したファイルを置くディレクトリを監視するc++でいくつかのコードを書いています。アプリケーションが画像を開いて表示しているため、サンプルファイルとして画像を使用しています。

コードは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と同じ問題があると思います。

4

1 に答える 1

1

この問題を解決するための回避策は、ファイル名とファイルサイズを含む構造体のリストを維持することです。dirをチェックするたびに、ファイルのリストを取得し、リストと照合します。ファイルがリストにない場合は、追加します。ファイルがリストにある場合は、ファイルサイズを比較してください。ファイルサイズが同じである場合、(転送が中断されていないと仮定して)転送が完了したことがわかります。

于 2012-12-11T23:23:52.117 に答える