Re: [問題] 確定fwrite有寫入到USB外接硬碟

看板C_and_CPP作者 (藍影)時間12年前 (2011/11/04 02:41), 編輯推噓0(0012)
留言12則, 3人參與, 最新討論串2/3 (看更多)
問這問題前,應先補上使用之作業系統、compiler 、tool 為佳, 因可議性非常大。 以下討論假定於 Windows 作業系統。 ※ 引述《CRAZYFAN (why so serious)》之銘言: 恕刪。 : temp=fread(buffer, 1, 128000, fsrc); : while(temp>0) : { : fwrite(buffer, 1, 128000, fsrc); : temp=fread(buffer, 1, 128000, fdst); : } 從敘述看來,直覺是這段有問題,以下為推測, 看其他版友有沒有不同看法。 原因是當最後一筆,假設檔案只剩 20 bytes, 最後仍寫入 128000 bytes,將造成檔案格式錯誤。 至於你說的「檔案大小」一樣,應是「用 windows」看起來長的一樣, 我猜是因 OS 在讀影片檔大小時,是去讀 header format, 而不是真的去算 filesize,於是建議改這樣 while(temp>0) { fwrite(buffer, 1, temp, fsrc); temp=fread(buffer, 1, 128000, fdst); } 當然 temp 改宣告成 unsigned 較佳 (因是 return size_t) , 先往這方面試試。 : fclose(fsrc); : fclose(fdst); : 補充說明(Supplement): : 這個程式是要指定寫入USB隨身碟或隨身硬碟的 : 以同樣達到300MB的檔案來說 : 寫入速度比較慢得USB隨身碟可以完整寫入 : 但是寫入速度比較快的隨身硬碟則無法完整寫入 : 操作過程其實是在複製完以後就會拔除隨身碟 : 但是立即拔除會發生寫入不完整,等個數十秒則可以完整寫入 你有試過等個二、三分鐘後,就會完整寫入嗎? 如果試過 waiting,且可以完整寫入話,下面的廢話就不用看了。 我認為不怎麼可能發生這情形,在 Windows 作業系統裡面, 用較柔性方式移除 USB (如右下角的硬體移除方式), 在該 disk 還有檔案進行讀寫時,應不可能移除成功的。 只要確定不是以硬體方式 (如以程式語言控制 USB power) 控制 on/off, 結果應不致於到不可預測。 : 有找過一些資料說因為fwrite是會先寫到buffer : 不過有試過fflush依舊無法正常寫入 : 用setvbuff設定不使用buffer也無法正常寫入 : 另外還有看到要同步的fsync fdatasync則沒有例子可以參考 : 不知道實際上要怎麼用 : 有辦法在fwrite執行完以後就確實寫入硬碟的方式嗎? 若真有這問題存在,我會追的應是用了什麼 API 去移除裝置, 還有那隻 API 有沒有 return value 。 (因基本假設是在於,還在寫的話是不會移除成功的) 若是 MFC / Win32 的話還蠻好解決的, http://msdn.microsoft.com/en-us/library/windows/desktop/ aa363480%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ aa363215%28v=vs.85%29.aspx 這兩篇看完應該就差不多了,一點小意見,參考。 -- No matter how gifted you are, alone, can not change the world. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41

11/04 02:57, , 1F
我還以為是因為fwrite(...,fsrc) (誤)
11/04 02:57, 1F

11/04 02:58, , 2F
我是覺得 fwrite 那裡原因比較大,只是原po又說他等十多
11/04 02:58, 2F

11/04 02:58, , 3F
秒就沒問題讓我覺得很奇怪。
11/04 02:58, 3F

11/04 03:00, , 4F
只是usb的問題..自己處理過後都不敢百分百的掛保證.
11/04 03:00, 4F

11/04 03:02, , 5F
其實我只是在說那段程式碼不知道有沒有筆誤而已XD
11/04 03:02, 5F

11/04 03:23, , 6F
我記得有看過說有些flash實際上還沒寫完就return的
11/04 03:23, 6F

11/04 03:24, , 7F
所以umount了還不能立即斷電
11/04 03:24, 7F

11/04 03:24, , 8F
實際上我也是有遇過這種情形的
11/04 03:24, 8F
真長見識了,我以為Win32 在這裡都是同步io設計, b 大的解決方案是 sleep 嗎??

11/04 03:28, , 9F
原文好像是寫隨身碟可完整寫入,隨身硬碟不行
11/04 03:28, 9F

11/04 03:29, , 10F
然後好像沒提到有沒有安全移除XD
11/04 03:29, 10F
嗯, 隨身碟 / 隨身硬體倒是沒注意到有講, 謝謝 w 大的補充。 > 操作過程其實是在複製完以後就會拔除隨身碟 > 但是立即拔除會發生寫入不完整,等個數十秒則可以完整寫入 「拔除」的意義可能還有待原 po 補充。 --- 我是真沒注意過這問題,以前處理 Device 時,一律不用 stdio.h f~系列函式,全都用 CreateFile 方式去做,當時的原因只是「道聽塗說」 f~系列函式私下還是調用較低階之 api 處理 (直覺是 CreateFile), 也可能是因處理檔案都比較小,所以沒遇到,這次真受教了,謝謝樓上二位。 ※ 編輯: tropical72 來自: 180.177.78.41 (11/04 03:46)

11/04 03:52, , 11F
找了一下資料,看來我運氣不錯, http://0rz.tw/IyHOB
11/04 03:52, 11F

11/04 03:52, , 12F
換個 CreateFile 試試看情況會不會改善。
11/04 03:52, 12F
文章代碼(AID): #1Eik1kXb (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Eik1kXb (C_and_CPP)