いつもお世話になっています。
数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
- 回答日時:
「正しく受信できたデータのみがファイルに書き込まれている」という条件さえ成り立っていれば, 「追加する」だけでできるはず.
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で質問しましょう!
似たような質問が見つかりました
- PHP どうして送信されないのでしょうか? 1 2022/12/09 05:23
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Outlook(アウトルック) w10からw11にバージョンアップ。アウトルックがクラウドと連携…そのためか、連絡先が消失!! 3 2023/05/09 18:34
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- PDF 保存したPDFファイルが開けなくなり、困っています 1 2022/09/15 21:08
- その他(ソフトウェア) 特定のpremiere proのファイルが開けなくなりました。 1 2022/11/16 12:31
- Outlook(アウトルック) 未読ならば受信トレイから削除する 2 2023/02/12 19:21
- Visual Basic(VBA) outlook マクロが終了しません。 1 2022/09/02 11:14
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Outlook(アウトルック) Outlookメールを立ち上げた(開いた)ときに常に『受信メール』一覧が表示される、という設定の方法 1 2023/04/30 17:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
共有フォルダに誰が何にアクセ...
-
特定のエクセルファイルを起動...
-
Access VBA を利用して、フォル...
-
ファイルの途中に文字列を挿入
-
VBAでCSVファイルが使用中かど...
-
C言語でのこぎり波を作る方法
-
Excelの複数人での参照について
-
excelを共有ファイルにすると行...
-
EXCELで列単位でスクロールさせ...
-
エクセルで上書き保存する度に...
-
Batch: フォルダ内の特定のファ...
-
AccessVBAで作成したExcelファ...
-
エクセルVBAでフォルダ内の全フ...
-
Accessのエラー対処法
-
Excel VBA 処理後データが重た...
-
ExcelVBAでの標準偏差の求め方
-
Androidのマルチユーザーでモン...
-
amifldrv64.sysについて教えて...
-
【アクセス】「ほかのユーザー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
共有フォルダに誰が何にアクセ...
-
【Excel】[Expression.Error] ...
-
特定のエクセルファイルを起動...
-
Batch: フォルダ内の特定のファ...
-
VBAでCSVファイルが使用中かど...
-
月が変わったら自動でシートが...
-
AccessVBAで作成したExcelファ...
-
tmpファイル なぜできる?削除...
-
Access VBA を利用して、フォル...
-
(Excelマクロ)datファイルをエ...
-
事務の派遣で働いています。多...
-
Excel VBA 処理後データが重た...
-
excelを共有ファイルにすると行...
-
【アクセス】「ほかのユーザー...
-
XMLデータを変換し印刷する方法
-
CSVの項目行を削除して一つのフ...
-
mdbファイル フォームを開くと...
-
社内Excel共有ブックでの保存ト...
-
ファイルの途中に文字列を挿入
-
拡張子が「cda」のファイルを聞...
おすすめ情報