c# 大文件分割 復制 Filestream 進度條


  大文件分割復制,每次復制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); } } }

 

 源代碼 https://pan.baidu.com/s/1dE2RMRf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM