C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ディスクエラーに関して


(過去ログ 2 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■1746 / inTopicNo.1)  ディスクエラーに関して
  
□投稿者/ トラの尻尾しましま 一等兵(9回)-(2005/10/27(Thu) 17:29:41)

分類:[VB.NET] 


分類:[VB.NET] 

2005/10/27(Thu) 17:58:42 編集(投稿者)
2005/10/27(Thu) 17:30:43 編集(投稿者)

すみません、前回の
質問の続きにになり本当にすみません!!

http://f57.aaa.livedoor.jp/~jeanne/bbs/faq.cgi?mode=al2&namber=1712&rev=&no=0
昨日実行処理を実行したときは、問題なく2枚目(END付)のディスクも保存できたのですが、
本日確認のため、実行すると

Dim nokori As Long = FileSize
outFile.Write(B, 0, nokori)
outFile.Close()

'ファイル最後にENDをつける
File.Move(outfileName, A_Fname & "END.txt")

A_Fname ・・・現在A:\を保存先に設定しています。

の File.Move(outfileName, A_Fname & "END.txt") の部分でエラーが発生します。
※1枚目のデータはエラー発生せずに保存できました。

'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : 間違ったフロッピー ディスクがドライブに挿入されています。
%2 (ボリューム シリアル番号: %3) を
ドライブ %1 に挿入してください。
というエラーが発生してしまいます。

それで、試しに、
'ファイル最後にENDをつける
File.Move(outfileName, A_Fname & "END.txt")
のA_Fname部分を 『c:\test』に変更して保存処理を行うと、エラーも発生せず、問題なく
保存することができました。

どなたか、ご教授願います。

すみません。

0
引用返信 編集キー/
■1754 / inTopicNo.2)  Re[1]: ディスクエラーに関して
□投稿者/ まどか 中尉(39回)-(2005/10/27(Thu) 18:11:28)

分類:[VB.NET] 

> の File.Move(outfileName, A_Fname & "END.txt") の部分でエラーが発生します。
> ※1枚目のデータはエラー発生せずに保存できました。
>
> 追加情報 : 間違ったフロッピー ディスクがドライブに挿入されています。
> %2 (ボリューム シリアル番号: %3) を
> ドライブ %1 に挿入してください。
> というエラーが発生してしまいます。

ドライブのランプが完全に消灯しないで2枚目に入れ替えてないか確認してみましょう。
#そうなら、最悪データが読み取りできなくなりますので注意が必要です。


0
引用返信 編集キー/
■1758 / inTopicNo.3)  Re[2]: ディスクエラーに関して
□投稿者/ トラの尻尾しましま 伍長(11回)-(2005/10/27(Thu) 18:24:16)

分類:[VB.NET] 


> ドライブのランプが完全に消灯しないで2枚目に入れ替えてないか確認してみましょう。

MsgBox("" & count & "枚目のフロッピーディスクをセットして下さい")
と表示され、完全にランプが消えていることを確認し、
ディスクをセットし、okボタンをクリックしました。
そのとき、ランプが点灯し、残りの容量を書き込んでいます。
そのときに発生エラーが発生します。

もしかして分割できていないのでしょうか・・・。

0
引用返信 編集キー/
■1760 / inTopicNo.4)  Re[3]: ディスクエラーに関して
□投稿者/ まどか 大尉(40回)-(2005/10/27(Thu) 18:57:31)

分類:[VB.NET] 

> MsgBox("" & count & "枚目のフロッピーディスクをセットして下さい")

これは誰が表示してるのでしょうか?
OSですか?アプリですか?

エラー時の元と先のファイル名が変な形になってませんか?

エラーの内容から言えることは
ドライブ内でクローズされる前にフロッピーを入れ替えたときの症状です。

MoveをCopyに変えるとどうなるでしょうか?

0
引用返信 編集キー/
■1766 / inTopicNo.5)  Re[4]: ディスクエラーに関して
□投稿者/ トラの尻尾しましま 伍長(14回)-(2005/10/28(Fri) 12:10:55)

分類:[VB.NET] 

>
> エラー時の元と先のファイル名が変な形になってませんか?
>
> エラーの内容から言えることは
> ドライブ内でクローズされる前にフロッピーを入れ替えたときの症状です。
>
> MoveをCopyに変えるとどうなるでしょうか?

原因がわかりました・・。
おっしゃるとおり、> MoveをCopyに変更しますと、上手くいきました。
お騒がせしました。

一つ、馬鹿な質問をさせてください。
データをバイナリファイルで読み込んで、分割し、
それらをテキスト形式で保存し、それを、作成した別のワークファイルで(テキスト形式)
に書き込んでいく場合は、
StreamWriter・BinaryWriter どちらで書き込んでいけばよいのでしょうか?

1枚目のディスクの場合
'ファイル作成
A_FCreate = File.Create(ワークファイル.txt")
'ファイル書き込み
Dim writer As StreamWriter = New StreamWriter(A_Cname, False, System.Text.Encoding.Default)
writer.Write(分割したバイナリファイルをテキスト形式で読み込んだファイル001.txt)
writer.Close()
writer = Nothing

2枚目ディスクの場合

'ファイル書き込み
Dim writer As StreamWriter = New StreamWriter(A_Cname, False, System.Text.Encoding.Default)
writer.Write(分割したバイナリファイルをテキスト形式で読み込んだファイル002.txt)
writer.Close()
writer = Nothing



後で、そのワークファイル.txt(二つのデータを合わせたもの)を  DAta.LZHにします。

上記のような記述にした場合、データが全くワークファイルに書き込まれていなかったので・・・。
すみません、よろしくお願いします.

0
引用返信 編集キー/
■1768 / inTopicNo.6)  Re[5]: ディスクエラーに関して
□投稿者/ まどか 大尉(41回)-(2005/10/28(Fri) 13:26:38)

分類:[VB.NET] 

> おっしゃるとおり、> MoveをCopyに変更しますと、上手くいきました。

これは原因ではありません。
フロッピーや「リムーバブル」と表示されるデバイスは物理的に遅いので
遅延書き込みという処理方式がおこなわれます。
それは物理的に書き込まずにハードウェアのキャッシュメモリなどに対しておこなわれます。
この処理が完了した時点で、例えばコピー中のダイアログが消えますが、
物理的なIOはまだ完了していません。
その未完了の状態でディスクを取り外すと。。。
今回の場合はその状態で次のフロッピーを入れたため、
裏でまだ続いている処理が「フロッピーが違う」と言っています。
Copyの場合、元ファイルは参照しかしないためMoveのコピー+削除に比べて
処理時間が若干短くなるので同じタイミングでもエラーにならなかったわけです。

> データをバイナリファイルで読み込んで、分割し、
> それらをテキスト形式で保存し、それを、作成した別のワークファイルで(テキスト形式)
> に書き込んでいく場合は、
> StreamWriter・BinaryWriter どちらで書き込んでいけばよいのでしょうか?

テキスト形式とはキャラクタ+改行コードのことを言うのですが、その意味でおっしゃっていますか?
基本的にはTextWriterとBinaryWriterを使い分けすればよいでしょう。

> 上記のような記述にした場合、データが全くワークファイルに書き込まれていなかったので・・・。

見る限り、書き込んでいませんよね。(汗

0
引用返信 編集キー/
■1769 / inTopicNo.7)  Re[6]: ディスクエラーに関して
□投稿者/ トラの尻尾しましま 軍曹(15回)-(2005/10/28(Fri) 15:40:29)

分類:[VB.NET] 

ディスクエラーに関してとても分かりやすい説明ありがとうございます。
理解できました・・・。
有難うございます.





コードですが、正しくは、

1枚目のディスクの場合
'ファイル作成
A_FCreate = File.Create(ワークファイル.txt")
'ファイル書き込み
Dim writer As StreamWriter = New StreamWriter(分割したバイナリファイルをテキスト形式で読み込んだファイル001., False, System.Text.Encoding.Default)
writer.Write(txtA_Cname)
writer.Close()
writer = Nothing

2枚目ディスクの場合

'ファイル書き込み
Dim writer As StreamWriter = New StreamWriter(分割したバイナリファイルをテキスト形式で読み込んだファイル002.txt, False, System.Text.Encoding.Default)
writer.Write(A_Cname)
writer.Close()
writer = Nothing


になりますかね・・・


あの・・・すみません・・・
もしかして、圧縮して保存したファイルをStreamReaderで最後まで読み込んで
その読み込んだ内容をなにか変数に保存しておいてそれを新しく作ったファイルに書き込むという作業が必要なのでしょうか・・・。
話がどんどん違う方向に行ってしまっていたらすみません。

0
引用返信 編集キー/
■1772 / inTopicNo.8)  Re[7]: ディスクエラーに関して
□投稿者/ まどか 大尉(42回)-(2005/10/28(Fri) 16:55:39)

分類:[VB.NET] 

> もしかして、圧縮して保存したファイルをStreamReaderで最後まで読み込んで
> その読み込んだ内容をなにか変数に保存しておいてそれを新しく作ったファイルに書き込むという作業が必要なのでしょうか・・・。

#ワークファイルって今から作るファイルですよね?
#今からというのはプログラムの中でという意味です。

えっと、ワークファイルも単に出力しようとしているファイルのひとつですよね。
ですのでワークファイルへも出力という意味では同じことをする必要があります。
「ファイルへ出力する」に対して「オープン、出力、クローズ」があり
ファイルが違えばその分だけそれを用意する必要がありますよね。


0
引用返信 編集キー/
■1779 / inTopicNo.9)  Re[8]: ディスクエラーに関して
□投稿者/ トラの尻尾しましま 軍曹(16回)-(2005/10/31(Mon) 09:47:34)

分類:[VB.NET] 

土日、パソコンを触っていませんでしたので、
お返事が大変遅くなりまして、もうしわけございません。

丁寧なご説明ありがとうございます。
新しいファイルでも、開く・読み込み・書き込み・閉じる
の作業は必要ですよね。

それでなのですが、
エラー無く、1枚目・2枚目のデータをワークファイルに書き込めました。

ところが、いざ、
その、ワークファイル.txtを、DB.LZHファイルにして、UNLHA32.DLLで解凍させようとしたのですが、
『ファイルの一部が見つかりません』とでてしまいます。

さらに、Lhaca で強制的に解凍・展開させようとすると、元DB(アクセスのmdbファイル)
きちんと、拡張子はmdbファイルなのですが、
『認識できません』とでてしまいます。
何故なのでしょうか・・・
分割させたときに、そのデータをきちんと取ってこれていないということでしょうか・・・。
ちなみに、下記が分割させたものを各フロッピーに保存させるロジックです。



Dim fs As New BinaryReader(New FileStream("データ元パス・・・DB.LZH", FileMode.Open))
'15000ごとにデータを区切る
B = fs.ReadBytes(15000)
fs.Close()
outFile.Write(B, 0, B.Length)
outFile.Close()
'データベースのコピー 'tempのファイルをワークファイルとして読み込み最後に移動する方法
A_Fname = Drive & "DISK" & Format(count, "000") & "-" & DAY
File.Copy(outfileName, A_Fname & ".txt", False)
FileSize = FileSize - B.Length

count = count + 1
MsgBox("" & count & "枚目のフロッピーディスクをセットして下さい", MsIcon, Caption)
Else
'2枚目のとき
Dim nokori As Long = FileSize
outFile.Write(B, 0, nokori)
outFile.Close()
A_Fname = Drive & "DISK" & Format(count, "000") & "-" & DAY
'ファイル最後にENDをつける
File.Copy(outfileName, A_Fname & "END.txt")
FileSize = FileSize - nokori
End If

よろしくお願いします。

0
引用返信 編集キー/
■1780 / inTopicNo.10)  Re[9]: ディスクエラーに関して
□投稿者/ まどか 大尉(43回)-(2005/10/31(Mon) 11:08:31)

分類:[VB.NET] 

> その、ワークファイル.txtを、DB.LZHファイルにして、UNLHA32.DLLで解凍させようとしたのですが、
> 『ファイルの一部が見つかりません』とでてしまいます。

ワークファイルとは分割したファイルを結合して元に戻したファイルでよろしいですか?
だとしたら、その部分がわからないことには。。。
メッセージ文に少々違和感がありますが、LZH形式が矛盾してることは間違いないでしょう。

と、思ってましたが、

> '15000ごとにデータを区切る
> B = fs.ReadBytes(15000)
>
> '2枚目のとき
> Dim nokori As Long = FileSize
> outFile.Write(B, 0, nokori)

2枚目のときにBを読み込んでいないのでしょうか?

えっと、やろうとしてることは、
1.MDBファイルをLHA圧縮する−>Bファイル
2.Bファイルを分割してフロッピーへ保存する
3.フロッピーからデータを結合する
4.結合したファイルをLHA解凍する
と思うのですが、
ワークファイルの位置付けがわかりません。
#先の説明だと分割時に作成しているようですが。。。


0
引用返信 編集キー/
■1781 / inTopicNo.11)  Re[10]: ディスクエラーに関して
□投稿者/ トラの尻尾しましま 軍曹(17回)-(2005/10/31(Mon) 11:37:13)

分類:[VB.NET] 

No1780に返信(まどかさんの記事)
>>その、ワークファイル.txtを、DB.LZHファイルにして、UNLHA32.DLLで解凍させようとしたのですが、
>>『ファイルの一部が見つかりません』とでてしまいます。
>
> ワークファイルとは分割したファイルを結合して元に戻したファイルでよろしいですか?
はい。
FD1枚・2枚目を ワークファイルに保存して、それをLZH方式で保存します。
名前は、INFile_DB.txtです。
outFile.txtという名前のワークファイルは、分割したデータを一度outFile.txtに読み込んで、FDに保存という方法をとっています。


> だとしたら、その部分がわからないことには。。。
> メッセージ文に少々違和感がありますが、LZH形式が矛盾してることは間違いないでしょう。
>
> と、思ってましたが、
>
>> '15000ごとにデータを区切る
>> B = fs.ReadBytes(15000)
> >
>> '2枚目のとき
>> Dim nokori As Long = FileSize
>> outFile.Write(B, 0, nokori)
>
> 2枚目のときにBを読み込んでいないのでしょうか?

>> '2枚目のとき
>> Dim nokori As Long = FileSize
>> outFile.Write(B, 0, nokori)
これで、てっきり、読み込んでいるのだとおもってしまっていました・・・。
すみません、どこをどうなおしたら良いのかが分かりません。
>> outFile.Write(B, 0, nokori)
の部分の(B, 0, nokori)の 『0』が問題なのでしょうか・・。
そのせいで、データが正しく取れていなくてエラーが発生するのでしょうか・・。


>
> えっと、やろうとしてることは、
> 1.MDBファイルをLHA圧縮する−>Bファイル
> 2.Bファイルを分割してフロッピーへ保存する
> 3.フロッピーからデータを結合する
> 4.結合したファイルをLHA解凍する
> と思うのですが、

そのとおりです。

> ワークファイルの位置付けがわかりません。
> #先の説明だと分割時に作成しているようですが。。。

分割時のワークファイル・結合時のワークファイルの名前が混在してしまい、
ややこしく、分かりにくい説明をしてしまってすみません。
大変失礼しました。


何度も何度も、お手数をお掛けしてしまい大変申し訳ないです.
よろしくお願いいたします。


0
引用返信 編集キー/
■1782 / inTopicNo.12)  Re[11]: ディスクエラーに関して
□投稿者/ まどか 大尉(44回)-(2005/10/31(Mon) 12:08:38)

分類:[VB.NET] 

> これで、てっきり、読み込んでいるのだとおもってしまっていました・・・。
> すみません、どこをどうなおしたら良いのかが分かりません。

Bは先頭から15000バイト読み込んだ結果ですよね。
ならば、残りとは15001バイト目以降です。
で、15001をどうやったら指定できるかですが、
ヘルプのReadBytesメソッドの最初に書いてある文章を見ればわかると思います。


#主題とは関係ないのですが、思ってることを書きます。

1.
システムフォルダへ書き込んでいるということでしたが、システムフォルダの必要が無ければ
一時フォルダなどを利用しいらなくなったら削除しましょう。
※一時フォルダの取得についてはTipsをご覧ください。

2.
ご提示のコードでは分割元ファイルがオープンしたままフロッピーへの保存処理がおこなわれます。
まずローカルディスクに対して分割ファイルを作成してしまってからフロッピーへの保存をおこなったほうがよいでしょう。
※よほど分割元ファイルが巨大で入力待ちになるのならこの限りではありません。
分割ファイルが出来上がれば、あとはそれを処理することに専念できます。

3.
今のままではフロッピーが1、2枚しか処理できません。
2で分割されたファイルを作る際に枚数を求めることができれば
フロッピーへの保存処理をループ処理として記述できます。

0
引用返信 編集キー/
■1784 / inTopicNo.13)  Re[12]: ディスクエラーに関して
□投稿者/ トラの尻尾しましま 軍曹(18回)-(2005/11/01(Tue) 09:36:49)

分類:[VB.NET] 

ご教授・アドバイスありがうございます。
早速、2枚以上のときの処理 loopでまわす。
ファイルは壊れやすいので、ファイルのcloseを。
1.番ですが、圧縮前に最適化しています、そのときに一時ファイルを使っていますので、
気をつけて利用していきたいと思います。

えっと、

>Bは先頭から15000バイト読み込んだ結果ですよね。
>ならば、残りとは15001バイト目以降です。
>で、15001をどうやったら指定できるかですが、
>ヘルプのReadBytesメソッドの最初に書いてある文章を見ればわかると思います。

と、ありますが、


FileStream.ReadByte メソッド [Visual Basic]参照
ファイルからバイトを読み取り、読み取り位置を 1 バイト進めます。
[Visual Basic]
Overrides Public Function ReadByte() As Integer

戻り値
int にキャストしたバイト。またはストリームの末尾から読み取る場合は -1。


で、良いのですよね、しかし、
現在、
B = fs.ReadBytes(区切りバイト数)
としていますが、それの中の fsにあたる部分は B(先頭から15000バイト読み込んだ結果)
ということになりますよね・・・。
で、実際そのように記述すると、エラーが発生してしまいます。
すみせん、頭がグチャグチャになってきました。
折角、ご教授いただいているのに申し訳ないです。(泣)


その書き込みの指定がキチンとできていないから、
だから、結果的にFDに分割して保存したデータが
途中までしか取れていないのですよね。
なので、復元させようとしても
『a.LZH ハフマンコードが壊れています』という結果に・・。


0
引用返信 編集キー/
■1788 / inTopicNo.14)  Re[13]: ディスクエラーに関して
□投稿者/ まどか 少佐(45回)-(2005/11/01(Tue) 14:20:19)

分類:[VB.NET] 

まず、分割元ファイルをFileStreamで開いた際にLengthが取得できることは既知ですね。
ここで15000という数字が決まってるわけですから、枚数と分割最終ファイルのバイト数がわかります。
#4枚の場合、15000,15000,15000,余り
ReadBytesメソッドは指定されたバイト数を現在のポインタから読み取ります。
#オープン直後のポインタは先頭です。
その結果、ポインタが実際に読み込んだ分位置がずれます。
なので、オープンしてポインタとサイズを同期して読み込んでいく分にはReadBytesメソッドを連続で呼ぶだけです。
#連続とは間にポインタをずらすようなメソッド等が無いこと

任意の位置から読み取る場合は、FileStream.SeekとBinaryReader.Readを調べてください。

> FileStream.ReadByte メソッド [Visual Basic]参照
> で、良いのですよね、しかし、

sがついてません。。。

> その書き込みの指定がキチンとできていないから、

書き込みではなく、読み込みがうまくいってません。
前回の場合ですと、15000バイト目以降を読んでいないので
最初の内容がすべてのフロッピーに書かれているわけです。

0
引用返信 編集キー/
■1800 / inTopicNo.15)  ご報告
□投稿者/ トラの尻尾しましま 軍曹(19回)-(2005/11/02(Wed) 17:17:24)

分類:[VB.NET] 

まどか様

ありがとうございました!!!
無事、完成しました!!
分割・結合・復元出来ました!!
数日間大変お世話になりました。
かなり、勉強させていただきました。
すごく感謝しています。
有難うございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -