|
■No36113 (ms さん) に返信 > ■No36109 (Hongliang さん) に返信 >>さすがに数百 MB をオンメモリで処理しようというのは難しいかと思います。 >>FileStream から一気にすべて読み出すのではなく、たとえば数 MB ずつ読み出しては CryptoStream に書き込むのを繰り返す、とかすればどうでしょう。 >
実装してみたのですが、どうにもうまくいきません。 最初のファイルを少しづつ読み込むのは、できたのですが、その後、少しづつファイルへ書き込むことができません。ですので、暗号化のファイルを書き込むところまで、たどり着いていません。 ファイルをバイト配列に読み込んだ後、ファイルに書き出す方法をどなたかご教授いただけないでしょうか? お願いします。
コードは以下になります。 mports System.IO Public Class Form1 'ファイル読み込み用(バイトで読込む) Dim readByte As Byte() = Nothing Dim WriteByte As Byte() = Nothing Dim fileName As String = "" Dim outFileName As String = ""
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'読み込むファイル名 fileName = "C:\TEST.txt" '読み込んだファイルを書き出すファイル名 outFileName = "C:\TEST2.txt" '配列のインスタンスを生成する readByte = New Byte(1023) {}
'ファイルの有無確認 If IO.File.Exists(fileName) = True Then
'ファイルを開く Dim fs As New System.IO.FileStream(fileName, _ System.IO.FileMode.Open, _ System.IO.FileAccess.Read, _ System.IO.FileShare.Read, _ &H1000, _ True)
'非同期の読込みを開始する fs.BeginRead(readByte, 0, readByte.Length, _ New AsyncCallback(AddressOf ReadBytescallback), fs)
End If
End Sub
'ファイルを読込む Private Sub ReadBytescallback(ByVal ar As IAsyncResult)
'バイト配列にファイルを読込む 'fileStreamの取得 Dim fs As System.IO.FileStream = _ CType(ar.AsyncState, System.IO.FileStream)
'読込んだサイズを取得 Dim readSize As Integer = fs.EndRead(ar)
If readSize > 0 Then '読み込み始めたとき '残りの読み込みを行う 'readByteに読込んだデータが格納されている fs.BeginRead(readByte, 0, readByte.Length, _ New AsyncCallback(AddressOf ReadBytescallback), fs)
Else 'ファイルを閉じる fs.Close()
'ファイルを開く'アクセス権(書き込み) Dim fsWrite As New System.IO.FileStream(outFileName, _ System.IO.FileMode.Append, _ System.IO.FileAccess.Write, _ System.IO.FileShare.None, _ &H1000, _ True)
'非同期の書き込みを開始する fsWrite.BeginWrite(readByte, 0, readByte.Length, _ New AsyncCallback(AddressOf WriteBytescallback), fsWrite)
End If
End Sub
'ファイルを書き込む Private Sub WriteBytescallback(ByVal ar As IAsyncResult)
'バイト配列にファイルを読込む 'fileStreamの取得 Dim fs As System.IO.FileStream = _ CType(ar.AsyncState, System.IO.FileStream)
'読込んだサイズを取得■■■■■■■■■■ここでエラーが出ます。"IAsyncResult オブジェクトは、この型の対応する非同期 メソッドから派生していません。"
Dim readSize As Integer = fs.EndRead(ar)
If readSize > 0 Then '非同期の書き込みを開始する fsWrite.BeginWrite(readByte, 0, readByte.Length, _ New AsyncCallback(AddressOf WriteBytescallback), fsWrite)
end If
end Sub
|