nic-segawa
2018年3月6日 19時17分
お世話になります。
Armadillo-410にてmicroSDのデータをUSBメモリーへとコピーするQtプログラムを作成しています。
コピーボタンのクリックで、USBメモリーマウント→microSDからUSBメモリーへのファイルコピー→USBメモリーアンマウントの一連の処理を一括して行っております。
その際に書き込み速度の遅いUSBメモリーを接続した場合や10MBを超えるようなファイルをコピーした場合に正しくコピーできません。(temporary fileのようなファイルがUSBメモリーに作成されたり、ひどい場合はUSBメモリーのファイルシステムが壊れたりします)
ファイルをコピーする際にQFIle::copyがtrueを返して来るのを待ち、その後umountが完了するのを待つようにしていますが、ファイルコピーが完了する前にアンマウントしてしまっているような挙動となっているように思われます。
確実にファイルコピーが完了してからアンマウントする方法は無いでしょうか?
よろしくお願い致します。
コメント
izawa
毎度お世話様、伊澤です。
非常に曖昧な知見で申し訳ありませんが、心当たりがなくもないので投稿しておきます。
弊社で以前、Android端末でLinuxを運用していた時の話になりますが、
USBメモリにファイルコピー後ファイルシステムが壊れる現象が生じていました。
アプリケーションからではなく、手作業でcp、umountしてからの取り外しです。
コピーするファイルが小さい場合は現象が再現せず大きいファイルでも充分放置してから
取り外す分には起きないことから、USBメモリ内で遅延書き込みが行われていてすぐに
取り外すことで電源喪失して書き込みロストするのではないかと想定したようです。
以上から考えると、遅延書き込みが完了するまで取り外せないと言うことになります。
但しそれを検知することは、諸事情から見送ったようです。
尚、同じ現象はWindowsでも生じることがあるようです。
その場合、再挿入でscandisk起動を促すダイアログが出ます。
cat_jiji
nic-segawa
at_ohsawa
2018年3月16日 18時04分
Qt4の実装を読んでみたのですが、QFile::copy()がtrueを返している時点で
copy先のQTemporaryFileで作られたファイルはリネーム済みでclose()まで
呼ばれているので、その状況が起きる原因が思いあたらないです。
widgetからのイベントではなく、コンソールアプリケーションとして
シンプルにmount -> QFile::copy -> unmount するコードを書いて
当該のUSBメモリに対して操作をした場合、問題が再現するか試してみてください。
また、ファイルシステムが壊れるという話ですが。そのときumountは成功しているか
確認されているでしょうか。