我在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有相同的問題。
您是否嘗試過其他鎖定功能?我有一個解決辦法,如果鎖不起作用。 – evanmcdonnal
不,這或多或少都是我嘗試過的。你的解決方法是什麼? –
你使用什麼文件格式?我找到了一個更好的解決方案,但只能確認它適用於jpeg。 – evanmcdonnal