文件拷貝控件
要求:通過文件讀寫創建一個文件拷貝控件,該控件可以拷貝任意類型的文件,調用時宿主程序需要為控件提供源文件和目標文件的路徑,要求在文件拷貝過程中顯示拷貝的進度。
基本思想:從源文件中讀取數據,然后將數據寫到目標文件,從而實現文件的拷貝。但由於要實現對任意類型文件的拷貝,因而需要以字節流的方式從源文件中讀取字節,然后以字節流的方式寫到目標文件中,這樣不管對什么類型的文件都可以進行拷貝。
文件拷貝進度的顯示可用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中寫入你的目標文件路徑,即可!
程序運行如下圖。謝謝大家!