我在c#(.NET 2.0 Framework)中创建了一个复制实用程序,它复制文件,目录和递归子目录等.该程序有一个GUI,显示当前正在复制的文件,当前文件编号(序列),总数要复制的文件数和复制操作的完成百分比.还有一个进度条,它基于当前文件/总文件.
我的问题与复制大文件有关.我一直无法找到一种方法来指示大文件的总复制进度(使用我当前使用FileInfo.CopyTo方法的类结构).作为一种解决方法,我将文件复制操作和GUI显示分离到它们自己的线程,并设置一个视觉提示来显示正在完成的工作.至少用户知道程序没有被冻结并且仍在复制文件.
能够基于总字节数显示进度或者具有从FileInfo.CopyTo方法触发的某种类型的事件会更好,该方法指示从当前文件复制的总字节数.
我知道FileInfo.Length属性,所以我确信MacGuyver有一种基于此的事件,并且在GUI端有一个处理器读取更新的处理程序(可能基于检查FileInfo).使用某种类型的计时器的目标对象的长度属性?).
有谁知道我要忽视的方法.如果我可以避免它,我宁愿不重写我的类来通过流复制字节并以这种方式跟踪它(虽然我想我可能会坚持走那条路).
提前致谢
PS - 我现在一直坚持使用.NET 2.0框架,所以任何需要> = 3.0的功能的解决方案都不适合我.
PPS - 我对任何.NET语言的解决方案都很开放,而不仅仅是c#.
我想以小块的形式复制文件(如果需要,取消复制操作).
我试图在这里遵循无标记的解决方案:如何复制具有取消副本的文件?
但我得到一个0字节的文件
我做错了什么?
Public Class Form1
Dim cancelled As Boolean = Nothing
Dim input = New System.IO.FileStream("C:\1.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)
Dim output = New System.IO.FileStream("C:\Nueva carpeta\1.txt", System.IO.FileMode.CreateNew, System.IO.FileAccess.Write, System.IO.FileShare.Write)
Public Sub CopyStream(ByVal inputStream As System.IO.Stream, ByVal outputStream As System.IO.Stream)
'Dim buffer = System.IO.File.ReadAllBytes("C:\1.txt")
Dim buffer = New Byte((1024) - 1) {}
Dim bytesRead As Integer = 1
While (inputStream.Read(buffer, 0, buffer.Length) > 0)
outputStream.Write(buffer, 0, bytesRead)
'bytesRead += 1
If cancelled Then
MsgBox("operacion cancelada")
Return
End If
End …Run Code Online (Sandbox Code Playgroud)