- 題名: 大量ファイルコピーでエラー
- 日時: 2009/06/04 14:12:18
- ID: 24676
- この記事の返信元:
- (なし)
- この記事への返信:
- [24680] Re[1]: 大量ファイルコピーでエラー2009/06/05 7:47:53
- [24710] Re[1]: 大量ファイルコピーでエラー2009/06/07 4:10:59
- ツリーを表示
プログレスを表示する場合は、非同期で読み書きすると簡単になります。 フォームにボタンとプログレスバーを設定してから下記のソースを貼り付けてください。 4GByte程度のファイルで問題なくコピーできる事を確認しています。 エラー処理してないので、適度に行ってください。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fromInfo As New FileInfo("C:\hoge,dat") Dim toInfo As New FileInfo("C:\foo.dat") Dim bufferSize As Integer = 1048576 Me.ProgressBar1.Value = 0 Me.ProgressBar1.Maximum = fromInfo.Length / bufferSize Me.Button1.Enabled = False Dim status As New Status status.Buffer = New Byte(bufferSize) {} status.FromStream = fromInfo.OpenRead() status.ToStream = toInfo.Create() status.FromStream.BeginRead(status.Buffer, 0, status.Buffer.Length, AddressOf Me.ReadResult, status) End Sub Private Sub ReadResult(ByVal result As IAsyncResult) Dim status As Status = DirectCast(result.AsyncState, Status) Dim readCount As Integer = status.FromStream.EndRead(result) If (readCount <= 0) Then Me.Invoke(New Action(AddressOf Me.Completed)) Exit Sub End If status.ToStream.BeginWrite(status.Buffer, 0, readCount, AddressOf Me.WriteResult, status) End Sub Private Sub WriteResult(ByVal result As IAsyncResult) Dim status As Status = DirectCast(result.AsyncState, Status) status.ToStream.EndWrite(result) Me.Invoke(New Action(AddressOf Me.AddProgress)) Array.Clear(status.Buffer, 0, status.Buffer.Length) status.FromStream.BeginRead(status.Buffer, 0, status.Buffer.Length, AddressOf Me.ReadResult, status) End Sub Private Sub Completed() MessageBox.Show(Me, "完了") Me.Button1.Enabled = True End Sub Private Sub AddProgress() If (Me.ProgressBar1.Value < Me.ProgressBar1.Maximum) Then Me.ProgressBar1.Value = Me.ProgressBar1.Value + 1 End If End Sub Public Structure Status Public FromStream As FileStream Public ToStream As FileStream Public Buffer() As Byte End Structure
分類:[.NET]
お世話になっています。
Framework3.5 VB8の環境で、
FileStreamを使ってファイルのコピーを行っています。
合計で1.6GBぐらいまでは正常にコピーできるのですが、
ある程度の容量を超えると、
「GDI+ で汎用エラーが発生しました。」や
「メモリーが不足しています。」
が表示され止まってしまいます。
ソースは以下のような形で行っています。
Using inFile As New BinaryReader(New FileStream(strSouceFilePath, _
FileMode.Open, _
FileAccess.Read, _
FileShare.Read)), _
outFile As New BinaryWriter(New FileStream(strDestFilePath, _
FileMode.Create, _
FileAccess.Write, _
FileShare.Read))
Dim block() As Byte = inFile.ReadBytes(1024)
Do Until block.Length = 0
outFile.Write(block)
block = inFile.ReadBytes(glngCopyBlockSize)
Loop
inFile.Close()
outFile.Close()
End Using
回避する為の何かいい方法はありますでしょうか?
よろしくおねがいします。