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