2012-12-11 28 views
0

我在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有相同的問題。

+0

您是否嘗試過其他鎖定功能?我有一個解決辦法,如果鎖不起作用。 – evanmcdonnal

+0

不,這或多或少都是我嘗試過的。你的解決方法是什麼? –

+0

你使用什麼文件格式?我找到了一個更好的解決方案,但只能確認它適用於jpeg。 – evanmcdonnal

回答

1

解決此問題的解決方法是使用文件名和文件大小維護結構列表。每次檢查目錄時都會得到一個文件列表,在列表中檢查它們,如果文件不在列表中,請添加它。如果列表中有文件比較文件大小。如果文件大小相同,則(假設傳輸未中斷),則知道傳輸已完成。

+0

我們正在加載各種媒體,各種圖像,視頻,音頻,文件,因此檢查最後一個字節不幸會是單調乏味,並且可能對某些人來說不可能 –

+1

@LyndenShields如果文件權限位未被更改傳輸操作然後鎖定將不起作用。我會嘗試我發佈的其他解決方法(監視文件大小),這是一種低劣的,但如果傳輸不遵守文件處理約定,我不明白你會怎麼做。 – evanmcdonnal

+0

你想重新提交這個答案,這就是我想要的。它運行得很好,而且無論如何需要幾十秒的時間,額外的延遲並不是什麼大問題。此外,我可以更頻繁地輪詢文件夾,這不是什麼大不了的事情。 –

相關問題