![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
いつもお世話になっています。
数GB単位のファイルデータを送受信するプログラムを作っています。
途中で受信が途切れても、途切れたとこから受信できるようにしたいと思います。
(途中からの受信不可のは組めました)
そこで以下のように考えました。(4MBごとに送信しています)
ファイル名受信
→ファイルが存在したら、ファイルサイズ取得
→ファイルサイズを4MBで割った商を求める。
→fseek( fp, 求めた商×4MB, SEK_SET)で書き込み始める場所を設定する
しかし、ファイルを開くタイプで、”wb”だと、ファイルは開いた瞬間に空になりますし、"ab"だと追加書き込みで消すことができません。
どうしたら、途中からデータを上書きすることができるのでしょうか?
No.9
- 回答日時:
>>途中だからと言って前回と今回のファイルの内容が同じとは限りませんよ
>え・・・・そうなんですか?ハッシュ値についてネットで調べてみましたが良く分かりませんでした・・・・・
その受信途中のファイルのファイル名を削除して
別のファイルを、そのファイル名にする。
とかされない保証はどこにもありませんから。
この回答への補足
>その受信途中のファイルのファイル名を削除して
>別のファイルを、そのファイル名にする。
>とかされない保証はどこにもありませんから。
なるほど。相手は友達ですし、そういうことはしないように頼むことにします。
No.8
- 回答日時:
rb+でオープンすれば、やりたいことはできると思いますが、
他の方も言っているとおり、通常追記だけで十分なように仕様を作った方がよいです。
レジューム機能を実現したいなら、
4MBとか区切りじゃなくても継続して受信できるように
接続時の初期化を工夫したほうがいいですよ。
送受信独自のアプリっぽいですし?
ところで、途中から始めるときにハッシュ値の採取してますか?
途中だからと言って前回と今回のファイルの内容が同じとは限りませんよ。
この回答への補足
>レジューム機能を実現したいなら、
日曜プログラマ程度ですし、友達にSkype使うより早く大容量データを送りたいというだけなので、難しい話は極力回避したいです。
>途中だからと言って前回と今回のファイルの内容が同じとは限りませんよ
え・・・・そうなんですか?ハッシュ値についてネットで調べてみましたが良く分かりませんでした・・・・・
No.7
- 回答日時:
>4MBを一発で受信できるとは限らないので、
>途中で回線が落ちたとかした場合、最後に保存されたデータが4MBに満たない可能性があるからです。
私なら4Mには設定しませんね…。
16kか32k、せいぜい64kくらいでしょうかね。
回線が速いとしても。
# LAN内しか想定しないのであれば、もう少し増やすかも知れませんが。
この回答への補足
インターネットを介して遠方の友人に送るつもりです。
>16kか32k、せいぜい64kくらいでしょうかね。
多ければいいと思っていました。
一番いいのは16kでしょうか?
No.6
- 回答日時:
「正しく受信できたデータのみがファイルに書き込まれている」という条件さえ成り立っていれば, 「追加する」だけでできるはず.
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?e8efa67)
No.5
- 回答日時:
ファイルタイプは、多分、r+b
たとえば、「ファイルを開くタイプ」で困ったら、fopen() のマニュアルを確認するような癖をつけておくと、幸せになれるかもしれません。
この回答への補足
一応、質問する前にこのサイト(http://www9.plala.or.jp/sgwr-t/c/sec17.html)で確認したのですが
w・a・w+・a+しか見てませんでした・・・・・
rは読み込みだからr+は脳内で勝手に(思い込みで)認識されなかったんじゃ・・・・
No.3
- 回答日時:
>数GB単位のファイルデータを
保存しようとしているファイルシステムによっては問題起こすこともあるのでご注意を。
ランタイムライブラリの方は…どうでしたかねぇ。
# 2Gを越える場合は_fseeki64()とかになる場合も。
ゲームのデータファイルで1ファイルが2G越えるとかは…ちょっと遠慮して頂きたいところではありますけどねぇ。
# もう少し分割するなりして管理すべき…でしょうし。
この回答への補足
>ゲームのデータファイルで1ファイルが2G越えるとかは…ちょっと遠慮して頂き>たいところではありますけどねぇ。
ゲームに限った話ではないんです。動画とかetc
まとめて圧縮ファイルにしてあるのですが、中身を一つずつ送るのも面倒ですし・・・・・
No.1
- 回答日時:
>しかし、ファイルを開くタイプで、”wb”だと、ファイルは開いた瞬間に空になりますし、"ab"だと追加書き込みで消すことができません。
"ab"でオープンした後、fseek()で移動させる。
でしょうかね。
ただし、Windowsの方ではファイルサイズを「切り詰める」のは難しそうです。
# APIならある…みたいですが。
切り詰めるのではなく、上書きするのであればfseek()で移動した後にそのままfwrite()で書き込んでいけばよいでしょう。
# fwrite()での上書きが元ファイルのサイズより小さい場合は後ろに意図しないゴミが残ることになるでしょうけど。
他の方法としては…
別名で新たにファイルを作成して必要な分だけ元ファイルから読み込んで新しいファイルに書き出す。
とかでしょうか。
コピーが終わった後で元ファイルは削除することになりますが。
この回答への補足
>切り詰めるのではなく、上書きするのであればfseek()で移動した後にそのまま>fwrite()で書き込んでいけばよいでしょう。
最初にやってみたのですが、
># fwrite()での上書きが元ファイルのサイズより小さい場合は後ろに意図しないゴミが残ることになるでしょうけど。
まさにこの状況でした。
>別名で新たにファイルを作成して必要な分だけ元ファイルから読み込んで新しいファイルに書き出す。
やっぱりその方が確実ですよね・・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
VBAでCSVファイルが使用中かど...
-
共有フォルダに誰が何にアクセ...
-
事務の派遣で働いています。多...
-
特定のエクセルファイルを起動...
-
tmpファイル なぜできる?削除...
-
Excel VBA 処理後データが重た...
-
0バイトのファイルを検知したい。
-
相手のPCにVBAからメッセ...
-
XMLデータを変換し印刷する方法
-
拡張子が「cda」のファイルを聞...
-
(Excelマクロ)datファイルをエ...
-
access関数を説明できる方いま...
-
【VBA】異なる行だけを抜き出す...
-
ファイルの途中に文字列を挿入
-
ファイルを削除する方法
-
AccessVBAで作成したExcelファ...
-
一時ファイルについて win32 Ge...
-
httpの画像urlが作りたいんです...
-
excelを共有ファイルにすると行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
共有フォルダに誰が何にアクセ...
-
特定のエクセルファイルを起動...
-
Batch: フォルダ内の特定のファ...
-
VBAでCSVファイルが使用中かど...
-
月が変わったら自動でシートが...
-
AccessVBAで作成したExcelファ...
-
(Excelマクロ)datファイルをエ...
-
tmpファイル なぜできる?削除...
-
Access VBA を利用して、フォル...
-
mdbファイル フォームを開くと...
-
Excel VBA 処理後データが重た...
-
【アクセス】「ほかのユーザー...
-
excelを共有ファイルにすると行...
-
ファイルの途中に文字列を挿入
-
XMLデータを変換し印刷する方法
-
拡張子が「cda」のファイルを聞...
-
特定のフォルダに入れたファイ...
-
社内Excel共有ブックでの保存ト...
-
access関数を説明できる方いま...
おすすめ情報