ActiveX控件开发实例(3)
文件拷贝控件
要求:通过文件读写创建一个文件拷贝控件,该控件可以拷贝任意类型的文件,调用时宿主程序需要为控件提供源文件和目标文件的路径,要求在文件拷贝过程中显示拷贝的进度。
基本思想:从源文件中读取数据,然后将数据写到目标文件,从而实现文件的拷贝。但由于要实现对任意类型文件的拷贝,因而需要以字节流的方式从源文件中读取字节,然后以字节流的方式写到目标文件中,这样不管对什么类型的文件都可以进行拷贝。
文件拷贝进度的显示可用ProgressBar控件来实现。
步骤如下:
(1)在VS.NET 2008中选择“文件”|“新建”|“项目”命令,在打开的“新建项目”对话框中选择左边方框中的“Visual C#”项,在右边的方框中选择“Windows窗体控件库”,创建控件程序MyCopyControl。
(2)参照例8.1的方法,将默认的类名“UserControl1”改为“文件拷贝控件”(这将成为工具箱中要显示的控件名称)。
(3)在解决方案资源管理器中双击节点“UserControl1.cs”,打开控件的设计界面,适当调整容器对象——UserControl对象的大小,然后在其中添加一个ProgressBar控件,并将其Dock属性值设置为Fill,使之充满整个容器。
(4)右击节点“UserControl1.cs”,在弹出的菜单中选择“查看代码”项,打开代码编辑器,在此为控件添加一个Copy()方法和一个curValue属性。Copy()方法实现文件拷贝,curValue属性用于设置进度条的当前位置。
关键代码如下:
public int curValue //设置进度条的value属性值
{
set { progressBar1.Value = value; }
}
public int Copy(string sourcefilepath, string targetfilepath) //实现文件拷贝的方法 { FileStream fsr = null; FileStream fsw = null; BinaryWriter writer = null; BinaryReader reader = null; try { fsr = new FileStream(sourcefilepath, FileMode.Open, FileAccess.Read); fsw = new FileStream(targetfilepath, FileMode.OpenOrCreate, FileAccess.Write); byte b; int filelength = (int)fsr.Length; progressBar1.Minimum = 0; progressBar1.Maximum = filelength; while (fsr.Position < filelength) //以字节流的方式读写文件 { b = (byte)fsr.ReadByte(); fsw.WriteByte(b); progressBar1.Value = (int)fsr.Position; } return 1; } catch (Exception ex) MessageBox.Show(ex.ToString()); finally { if (reader != null) reader.Close(); if (fsr != null) fsr.Close(); if (writer != null) writer.Close(); if (fsw != null) fsw.Close(); } return 0;
(5)选择菜单“生成”|“生成解决方案”命令(或按F6),生成的dll文件即为我们所需的文件拷贝控件。
至此控件完成了。下面来测试该控件。
测试控件:
(1)在解决方案资源管理器中添加窗体应用程序testMyCopyControl,并将之设置为启动项目。在该程序窗体上添加一个刚生成的“文件拷贝控件”、一个Button控件和两个TextBox控件及Label控件,并设置相应的属性和适当调整它们的位置和大小:
(2)双击【拷贝】,增加如下代码:
private void button1_Click(object sender, EventArgs e) { int result = fileCopy1.copy(textBox1.Text, textBox2.Text); if (result == 1) { MessageBox.Show("拷贝成功"); } else { MessageBox.Show("拷贝失败"); } }
(3)双击【选择】,用于选择文件,完了之后再Textbox2中写入你的目标文件路径,即可!
程序运行如下图。谢谢大家!