おはようございます。
質問があり、書き込みします。
データを分割し複数毎にわたるFDのデータを
ファイル(C:\)をつくり、そこに、コピーしたファイルを書き込む方法を教えてください。
よろしくお願いします。
>ファイル(C:\)をつくり、そこに、コピーしたファイルを書き込む
えっと、
・データを分割し複数ごとに渡るFDデータ(※1)
↓
・C:\を作成し、※1をコピーする
・・・・を書き込む?
#コピーの他に何か書き込むんだろうか?
の箇所で?と詰まってしまいます。
ん…?
分割されたファイルを、分割された順番に連結していけばいいのでは…?
↑とりあえず、環境わからないのでどこでも言えることを書く…
やりたいことがいまいち伝わってきませんので、確認させて下さい。
>データを分割し複数毎にわたるFDのデータを
>ファイル(C:\)をつくり、
データをフロッピーに収まるサイズに分割するということでしょうか?
>そこに、コピーしたファイルを書き込む方法を教えてください。
ファイルを上書きするのでしょうか、それともその分割したファイルの
中に書き込むのでしょうか?
環境も含めてお返事いただけたらなと思います|o_o;
分割したファイルを結合したいということなのかな?
COPY /b データを分割し複数毎にわたるFDのデータ
環境を書き忘れてしまっていました。
しかも、おかしな日本語ですね。
大変お手数お掛けしました。
環境
win 2000 VB.NET2003 です。
説明不足ですみません。
圧縮したデータをFDに分割し、枚数ごとに順番・日付をつけ、
最後のFDには「FIN」をつけるやり方が分からないのと、
>分割されたファイルを、分割された順番に連結していけばいいのでは…?
どうやって分割されたFDの日付・順番を見て、1枚目のディスクと同じ日付のFDならば
そのファイルを C:\に作ったフォルダにコピーし順番にデータを書き込んでいけばよいのでしょうか・・・。
最終的にそのファイルを解凍したいのです。
解凍方法は理解しているのですが・・。
すみません。よろしくお願いします。
>圧縮したデータをFDに分割し
「データ」と言う言葉を使っていますが、
これは、もともと1つのサイズの大きい「ファイル」
のことを指しているで良いですよね?
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_t32.htm
でどうでしょう?
ごめんなさい、.NETでしたね、上記URLはVBでした。
忘れてください。
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=13375&rev=&no=0
↑と同じ様な内容ですが、日付けだけの判断での危険性は考えないと言う事ですね?
>そのファイルを C:\に作ったフォルダにコピーし順番にデータを書き込んでいけばよいのでしょうか・・・。
方向性が見えたのなら、その方向で調査を行い、自分で調査しきれない部分のみ
質問して下さい。
>解凍方法は理解しているのですが・・。
どんな方法を使うか?の情報は分割の方法にも影響します。自分の持っている情報は
全て公開するように心がけて下さい。後から追加で条件を付け加える事のないように
努力しましょう。
ファイルの分割、結合って最近はやってるのかな。(どぼんさんのとこにも同じよう
な質問あったし。)
> 圧縮したデータをFDに分割し、枚数ごとに順番・日付をつけ、最後のFDには「FIN」
> をつけるやり方が分からないのと、
>> 分割されたファイルを、分割された順番に連結していけばいいのでは…?
> どうやって分割されたFDの日付・順番を見て、1枚目のディスクと同じ日付のFDなら
> ばそのファイルを C:\に作ったフォルダにコピーし順番にデータを書き込んでいけ
> ばよいのでしょうか・・・。
>
とりあえず自分で分割するんですよね。
分割自体はバイナリとしてファイルを読み込み適当な大きさ毎(1.4M等)に1ファイル化
していけば出来そうですね。
それからファイルの頭部分にファイル情報(ファイルの最大分割数と番号、その他情報)
をつけておけばよいのではないですか。
#まぁ、分割、復元したいだけならWIN付属のバックアップツールを使うという手段も。
すみません、私の場合授業でやっていまして・・。
自分で書いてみた分割の部分のロジックです。
・
・
・
ElseIf Drive = "A:\" Then
Dim hFileInfo As New System.IO.FileInfo(フロッピーディスク)
' ファイルサイズを取得
Dim lFileSize As Long = hFileInfo.Length
size = ((lFileSize - 1) / 1457664) + 1
If size > 1 Then
MsgBox("バックアップに必要なフロッピーディスクは全部で" & size & " 枚です。")
End If
Dim count As Integer
Do While lFileSize = 0
A_Fname = Drive & " DISK" & count & " dt.ToString(yyMMddhhnnss)←作成日付"
'ドライブの空き容量を取得
Dim dv As String = "A:\"
Dim mo As New System.Management.ManagementObject("Win32_LogicalDisk=""" & dv & """")
Dim freeSpace As Int64 = Convert.ToInt64(mo.Properties("FreeSpace").Value.ToString)
If freeSpace < 512 Then
MsgBox("フロッピーディスクに空き容量がありません。フロッピーディスクを交換してください")
End If
分割処理
Dim bbb As Integer
bbb = lFileSize / freeSpace
If bbb <= freeSpace Then
'ファイル作成
A_FCreate = System.IO.File.Create(C:フォルダのパス)
'データベースのコピー
' コピー元 ・ コピー先
System.IO.File.Copy("C:\配管.LZH", "フロッピーディスク", False)
ElseIf bbb < freeSpace Then
'ファイル作成
A_FCreate = System.IO.File.Create(F_Pass)
'ファイル名変更
System.IO.File.Move(F_Pass, A_Fname)
'データベースのコピー
' コピー元 ・ コピー先
System.IO.File.Copy("C:\配管.LZH", フロッピーディスク, False)
'ファイル最後にFINをつける
System.IO.File.Move(フロッピーディスク, フロッピーディスク & "FIN")
Else
MsgBox("" & count & "枚目のフロッピーディスクをセットして下さい")
End If
count = count + 1
Loop
End If
>皆様の沢山のご指摘ありがとうございます。
>「データ」と言う言葉を使っていますが、
>これは、もともと1つのサイズの大きい「ファイル」
>のことを指しているで良いですよね?
はい、そのとおりです。
>そのファイルを C:\に作ったフォルダにコピーし順番にデータを書き込んでいけ
>ばよいのでしょうか・・・。
>方向性が見えたのなら、その方向で調査を行い、自分で調査しきれない部分のみ
>質問して下さい。
大変失礼しました.
分からないのは、順番にデータを書き込んでいく方法です。
解凍方法は、下記のサイト様で理解することができました。
http://d.hatena.ne.jp/kurazoo/searchdiary?word=%2a%5bLHA%bd%f1%b8%cb%c1%e0%ba%ee%5d
皆様ねお手数お掛けしてすみません。
ご指摘等よろしくお願いします。
>>すみません、私の場合授業でやっていまして・・。
ここは補講でも塾でもないと思うんだけどね?
>>すみません、私の場合授業でやっていまして・・。
>ここは補講でも塾でもないと思うんだけどね?
すみません、違う意味で捉えられたと思います.
そうではなくて、
現在課題のようなものでこれをしなければならないのです。
すみません。
> 現在課題のようなものでこれをしなければならないのです。
だからといって動かなくて見づらいコード書いてもいいわけではないと思うのですが…
とりあえず、「ちゃんと動くプログラム」ではなく、
「ちゃんと動く仕様」を書いてみては?
追記です。
すみません。
>ファイルの分割、結合って最近はやってるのかな。(どぼんさんのとこにも同じよ
>うな質問あったし。)
このGOD様の発言に対しての、発言だったのです。
追記ミスですみません。
> > 現在課題のようなものでこれをしなければならないのです。
> だからといって動かなくて見づらいコード書いてもいいわけではないと思うのですが…
>
> とりあえず、「ちゃんと動くプログラム」ではなく、
> 「ちゃんと動く仕様」を書いてみては?
ぁぁそうか…その仕様が無いから困ってたのか…
…全部書いてしまっては課題の意味がなくなるので、方向性だけ。
・連結できるように次の情報が無くてはならない
1 最初のファイルのファイル名
2 最初のファイルのファイルサイズ
3 全体の分割ファイル数
4 連結しているとき現在の、次のファイル名
あとは如何様にも作れましょう。
(大学のレポートで忙すぃ… orz)
皆様、本当にありがとうございます。
めちゃくちゃですみません。
自分で分割の仕様を書いてみました。
バックアップファイルのサイズで、FD何枚分かを調べる
何枚分必要かを表示
ディスクNOファイルを作成 このとき、ディスクNO・日付を書き込む
何枚目かをメッセージ表示
FDの空き容量を調べる
空き容量が512以下ならフロッピー交換のメッセージ
圧縮ファイルをFDに書き込み
最後のFDにはFINをつける
です。
>バックアップファイルのサイズで、FD何枚分かを調べる
>何枚分必要かを表示
>何枚目かをメッセージ表示
>FDの空き容量を調べる
>空き容量が512以下ならフロッピー交換のメッセージ
>圧縮ファイルをFDに書き込み
>最後のFDにはFINをつける
>
↑はプログラム作成時に行うべきチェックを羅列しているだけでは。
分割の仕様といえなくもないですが・・・まずは結合時に必要となる情報を考えてみてください。
あなたは結合する時にどこにどんな情報があれば結合できますか。
そっちを羅列してどうやってその情報を持たせるのかの方針を決めてください。
その情報が一番のかぎとなると思いますよ。
それさえ決まればあとば仕様通りにプログラム組むだけですから。
なるほど…上から下に向かって順に時系列で並んでいると思っていいのですね?
今回は「ファイルを分割してフロッピーに書き込む」問題ですが、
性質を考えると「一枚の大きな新聞紙」を「複数のレターケースに切って入れて」、
そして最後に「新聞紙を復元する」。
ということを考えれば上手くいくかもしれません。
ちょこっと順番を変えてみました。
> バックアップファイルのサイズで、FD何枚分かを調べる
一枚の大きな新聞紙の面積から、
レターケースの個数を求める。
> 何枚分必要かを表示
レターケースの個数を表示する。
> 何枚目かをメッセージ表示
便利のために、次のレターケースの番号を表示します。
> FDの空き容量を調べる
レターケースに詰め込める紙の面積を調べ、
> 空き容量が512以下ならフロッピー交換のメッセージ
少なすぎる場合はそのレターケースを拒否
> ディスクNOファイルを作成 このとき、ディスクNO・日付を書き込む
x個目のレターケースに番号をと日付を書き込み、
もし最後のレターケースなら、ついでに
> 最後のFDにはFINをつける
"FIN"と書き込んでおきます。
> 圧縮ファイルをFDに書き込み
レターケースに新聞紙を「切って」入れます。
…さて続いて、
今貴方の元に「"1 yy/mm/dd hh:mm:ss",...,"N-1 yy/mm/dd hh:mm:ss","N(FIN) yy/mm/dd hh:mm:ss"」
の様に書かれたレターケースがN個届きました。
これで元の新聞紙は復元できますか?
……………
→できそうですが、実は無理だと思います。
なぜなら、
「出来上がる新聞紙は?枚になる予定」
という情報が欠落していたからです。
というわけで、"出来上がる新聞紙"についても個数(または新聞紙の"名前")が必要になると思います。
さて…どこか誤爆してないかな…
分割、かなり、分かりやすい説明有難うございます!!
いまいちつかみきれていなかったのですが、なんとなりそうです。
あと、今思ったのですが、
FD枚に名前・No.・作成日時を書き込んでFDにデータを保存して
それを復元するときに、作成日付が同じであることを条件として結合していこう
としているのですが、作成日付でとると、(yymmddhhnnss)
続きのディスクNoでも作成日付は違いますよね・・・日付は同じでも、時間・・・分とか秒とか
作成日付の条件にすると整合性は取れませんよね・・・。
それに、名前・ディスクNo・日付でとってきてもやはり日付でひっかかりますよね・・・。
すみません、整合性のとり方が良く分からなくなってしまいました・・・。
> FD枚に名前・No.・作成日時を書き込んで
どこに情報を残すかですよね。
ファイル名部分に入れ込んだり、ヘッダ情報としてファイル先頭に書き込む
のだったら、基ファイルとか1枚目のファイル作成日時とかいう手もあると
思いますよ。
ただ今現実逃避中…。人の仕事の手伝いが割り込みまくって
一昨日くらいから自分の仕事が全然進んでない〜(i_i)
>整合性のとり方が良く分からなくなってしまいました・・・。
日付での整合性がいいものかどうかは分からないけど、作成日時は変更可能みたいですね。
http://dobon.net/vb/dotnet/file/filecopy.html
>「出来上がる新聞紙は?枚になる予定」
出来上がる新聞紙は1枚ですね。だって
>一枚の大きな新聞紙の面積から、
ですから。と突っ込んでおこうか。(笑
↓
正:いくつのレターケースに分割したのかの情報。
#例えば、4MBのファイルを3枚に分割して復元時に1枚目→3枚目(FIN)のと入れたときに正しくエラーメッセージが出せるかどうか。
#FD1枚に収まる時のソフトの挙動とか気になるとこかな。
ご教授ありがとうございます。
もう少し調べてみようと思います
>ただ今現実逃避中…。人の仕事の手伝いが割り込みまくって
>一昨日くらいから自分の仕事が全然進んでない〜(i_i)
あわわわわ!!
頑張ってくださいー。
私も現実逃避をしたいです・・・同じところを昨日からいったりきたり・・・
頭がオーバーヒートしそうです。
お仕事大変だろうけど頑張ってください!!
>整合性のとり方が良く分からなくなってしまいました・・・。
>日付での整合性がいいものかどうかは分からないけど、作成日時は変更可能みたい>ですね。
>http://dobon.net/vb/dotnet/file/filecopy.html
>「出来上がる新聞紙は?枚になる予定」
>出来上がる新聞紙は1枚ですね。だって
>一枚の大きな新聞紙の面積から、
>ですから。と突っ込んでおこうか。(笑
> ↓
>正:いくつのレターケースに分割したのかの情報。
うわ・・・そうでしたすみません。
お手数お掛けしました・・・(反省)。
>#例えば、4MBのファイルを3枚に分割して復元時に1枚目→3枚目(FIN)のと]
>入れたときに正しくエラーメッセージが出せるかどうか。
>#FD1枚に収まる時のソフトの挙動とか気になるとこかな。
エラー修正とかしていたので、まだ結果は試していません・・・。
これから、やってみます。
ご教授有難うございます!!
(`・ω・´)
> >「出来上がる新聞紙は?枚になる予定」
> 出来上がる新聞紙は1枚ですね。だって
> >一枚の大きな新聞紙の面積から、
> ですから。と突っ込んでおこうか。(笑
> ↓
> 正:いくつのレターケースに分割したのかの情報。
えーと、実はその直前で話が変わっていまして…
「一枚の大きな新聞紙の面積から(ry」
は分割するときの話でして、
後の方は何枚の新聞紙を切り刻んだかわからない状況で、
レターケース「だけ」が大量に届いた場合ですね。
そういう状況で、連結する時の話をしたかったのです。
とりあえず、スレ主さんファイトっす。
>そういう状況で、連結する時の話をしたかったのです。
>とりあえず、スレ主さんファイトっす。
有難うございます!
頑張ります。
それで、実行したのですが、
ドライブの空き容量をとってくるときに
↓
'ドライブの空き容量を取得
Dim dv As String = "A:\"
Dim mo As New System.Management.ManagementObject("Win32_LogicalDisk=""" & dv & """")
Dim freeSpace As Int64 = Convert.ToInt64(mo.Properties("FreeSpace").Value.ToString)
If freeSpace < 512 Then
MsgBox("フロッピーディスクに空き容量がありません。フロッピーディスクを交換してください")
End If
と記述したのですが、
『'System.Management.ManagementException' のハンドルされていない例外が system.management.dll で発生しました。
追加情報 : ?3?o?E?p?????[?^?A?・』
というエラーが発生してしまいました。
重ね重ねすみません。
ご教授賜れませんでしょうか・・・。
> Dim dv As String = "A:\"
Dim dv As String = "A:"
では?
すみません、みい様、フリーサイズとってこれました!有難うございました。
解決したならば、解決を入れてください
しつれいしました。
ツイート | ![]() |