Re: [問題] 確定fwrite有寫入到USB外接硬碟
問這問題前,應先補上使用之作業系統、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
11/04 02:57, 1F
→
11/04 02:58, , 2F
11/04 02:58, 2F
→
11/04 02:58, , 3F
11/04 02:58, 3F
→
11/04 03:00, , 4F
11/04 03:00, 4F
→
11/04 03:02, , 5F
11/04 03:02, 5F
→
11/04 03:23, , 6F
11/04 03:23, 6F
→
11/04 03:24, , 7F
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
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
11/04 03:52, 11F
→
11/04 03:52, , 12F
11/04 03:52, 12F
討論串 (同標題文章)