Armadilloフォーラム

USBメモリーへのファイルコピー

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が完了するのを待つようにしていますが、ファイルコピーが完了する前にアンマウントしてしまっているような挙動となっているように思われます。

確実にファイルコピーが完了してからアンマウントする方法は無いでしょうか?
よろしくお願い致します。

コメント

at_ohsawa

2018年3月16日 18時04分

Qt4の実装を読んでみたのですが、QFile::copy()がtrueを返している時点で
copy先のQTemporaryFileで作られたファイルはリネーム済みでclose()まで
呼ばれているので、その状況が起きる原因が思いあたらないです。

widgetからのイベントではなく、コンソールアプリケーションとして
シンプルにmount -> QFile::copy -> unmount するコードを書いて
当該のUSBメモリに対して操作をした場合、問題が再現するか試してみてください。

また、ファイルシステムが壊れるという話ですが。そのときumountは成功しているか
確認されているでしょうか。

izawa

2018年3月19日 10時35分

毎度お世話様、伊澤です。
非常に曖昧な知見で申し訳ありませんが、心当たりがなくもないので投稿しておきます。

弊社で以前、Android端末でLinuxを運用していた時の話になりますが、
USBメモリにファイルコピー後ファイルシステムが壊れる現象が生じていました。
アプリケーションからではなく、手作業でcp、umountしてからの取り外しです。
コピーするファイルが小さい場合は現象が再現せず大きいファイルでも充分放置してから
取り外す分には起きないことから、USBメモリ内で遅延書き込みが行われていてすぐに
取り外すことで電源喪失して書き込みロストするのではないかと想定したようです。

以上から考えると、遅延書き込みが完了するまで取り外せないと言うことになります。
但しそれを検知することは、諸事情から見送ったようです。
尚、同じ現象はWindowsでも生じることがあるようです。
その場合、再挿入でscandisk起動を促すダイアログが出ます。

cat_jiji

2018年3月19日 10時57分

いつもお世話になっています。
福島と申します

以前、USBメモリに書き込めない現象が出て以下の内容でフォーラムに投稿しています。
「Armadilo440,420でUSBメモリ(FAT32)に書き込みができない現象」
ご参考になれば幸いです。
対策として、mount時に -o sync を付けて対処しました。(書き込みが遅くいまだに困っていますが。)

nic-segawa

2018年3月19日 16時37分

ご回答ありがとうございました。

今回問題が発生したUSBメモリーはバッファロー RUF3-PN32G-SVです。
紹介頂いたフォーラム内でもバッファロー RUF2-K2Gを使用されていたということで、バッファロー製の一部のUSBメモリーとは相性の問題があるのではないかと考えております。
ちなみに、ELECOM MF-NU204GBU、imation製のUSBメモリーでは問題は確認できませんでした。
社内で動作確認を行い、問題の無かったUSBメモリーを採用する方向で検討しようと思います。