大文件分割復制,每次復制100M 也可以復制別的較大數值。
小於1G的小文件就直接復制得了。代碼里沒寫 ,但是很簡單 直接寫進去就好了,難得是分割復制 所以沒寫. 好吧 我還是改了 改成小文件也可以復制了,全面一點是不
效果圖【圖片里的總文件大小 忘記除1024了。 文章里的代碼改了,圖片和源代碼文件改了 】
代碼寫得不是很好.請多多指教
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace FileStrem大文件分割復制 { public partial class Form1 : Form { private int WriterByetNub = 104857600;//100M復制速度 //源目標 private FileStream FileToRead; //復制到文件 private FileStream FileToWrite; //保存文件的地址 private string SaveFile_Add; //源文件的名字 private string File_Add; //設置正常寫入字節 private Byte[] byteToWrite; //設置剩余寫入字節 private Byte[] byteToLastWrite; //循環次數 private long WriteTimes; //循環后的剩余字節 private int L_Size; public Form1() { InitializeComponent(); } //設置委托 private delegate void OpenFile(); private void Cpy() { try { label_Add.Text = "源地址"; label_Cpy_Add.Text = "復制到"; label_Cpy_Lc.Text = "復制進程:"; label_Write.Text = "已經寫入"; label_FileSize.Text = "源文件總大小"; //文件選取 OpenFileDialog openfileDialog = new OpenFileDialog(); //show文件選取器 openfileDialog.ShowDialog(); File_Add = openfileDialog.FileName; label_Add.Text += ":" + File_Add; //保存地址選取 FolderBrowserDialog savefileDialog = new FolderBrowserDialog(); savefileDialog.ShowDialog(); SaveFile_Add = savefileDialog.SelectedPath; label_Cpy_Add.Text += ":" + SaveFile_Add + File_Add; FileToRead = new FileStream(File_Add, FileMode.Open, FileAccess.Read); FileToWrite = new FileStream(@SaveFile_Add + "\\" + openfileDialog.SafeFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); label_FileSize.Text = "源文件總大小"+(FileToRead.Length/1024).ToString()+"KB"; if (FileToRead.Length > WriterByetNub) //設置寫入字節數組 { byteToWrite = new byte[WriterByetNub]; //循環次數 WriteTimes = FileToRead.Length / WriterByetNub; //多次循環后剩余字節 L_Size = Convert.ToInt32(FileToRead.Length % WriterByetNub); //多次循環后字節數組 byteToLastWrite = new byte[L_Size]; for (long i = 0; i <= WriteTimes; i++) { //讀源文件 FileToRead.Read(byteToWrite, 0, WriterByetNub); //寫數據到目標文件 FileToWrite.Write(byteToWrite, 0, WriterByetNub); //設置進度條的值 progressBar.Value = Convert.ToInt32(i * 100 / WriteTimes); Application.DoEvents(); //設置Lable上的進度值 label_Cpy_Lc.Text = "復制進程:" + Convert.ToInt32((i * 100) / WriteTimes).ToString() + "%"; //設置寫入值 label_Write.Text = "已寫入" + (FileToRead.Position / 1024).ToString() + "KB"; } //剩余字節的讀和寫 if (L_Size != 0) { FileToRead.Read(byteToLastWrite, 0, L_Size); FileToWrite.Write(byteToLastWrite, 0, L_Size); } } else //當寫於分割的字節大小時 直接復制吧
{ //設置進度條的最大值 progressBar.Maximum =(int) FileToRead.Length; //設置字節 byteToWrite = new byte[FileToRead.Length]; //讀取到字節中 FileToRead.Read(byteToWrite, 0, (int)FileToRead.Length); //計算進程 label_Cpy_Lc.Text = "復制進程:" + Convert.ToInt32(FileToRead.Position/FileToRead.Length*100).ToString() + "%"; //設置寫入值 label_Write.Text = "已寫入" + (FileToRead.Position / 1024).ToString() + "KB"; //計算進度條的進度 progressBar.Value =(int )FileToRead.Position; //寫入完成 FileToWrite.Write(byteToWrite, 0, (int)FileToRead.Length); } FileToRead.Flush(); FileToWrite.Flush(); FileToRead.Close(); FileToWrite.Close(); MessageBox.Show("復制完成"); } catch(Exception ex) { FileToRead.Flush(); FileToWrite.Flush(); FileToRead.Close(); FileToWrite.Close(); MessageBox.Show(ex.ToString()); } } private void openFileBtn_Click(object sender, EventArgs e) { OpenFile getFile = new OpenFile(Cpy); this.Invoke(getFile); } } }