天天看點

檔案和檔案夾操作——檔案操作實列

1、擷取檔案大小

思路:使用File類的Open方法打開指定的檔案,然後使用FileStream類的Length屬性擷取檔案的長度。

(1)、File類的Open方法:用來打開指定路徑上的FileStream,局域讀/寫通路權限文法格式:public static FileStream Open(string path,FileMode mode)

參數說明:path:要打開的檔案。 mode :FileMode枚舉值之一

枚舉值

說明

CreateNew

指定作業系統應建立新檔案

Create

指定作業系統應建立新檔案,如果檔案已經存在,它将被覆寫

Open

指定作業系統應打開現有的檔案

OpenOrCreate

指定作業系統應打開檔案(如果檔案存在,否則建立新檔案)

Truncate

指定作業系統打開現有檔案。檔案一旦打開,就将被截斷文為零位元組大小

Append

打開現有檔案并查找到檔案尾,或建立新檔案。

(2)、FileStream類的Length屬性

FileStream類的Length屬性用來擷取用位元組表示的流長度,文法:

Public override long Length{get;}

注:程式中使用與檔案相關的類時,都需要添加System.IO命名空間

檔案和檔案夾操作——檔案操作實列

private void button1_Click(object sender, EventArgs e)

       {

           OpenFileDialog openDialog = new OpenFileDialog();//建立打開檔案對話框對象

           if (openDialog.ShowDialog()==DialogResult.OK)//判斷是否選中檔案

           {

  MessageBox.Show("檔案長度:"+File.Open(openDialog.FileName,FileMode.Open).Length+"位元組");//彈出消息對話框

           }

       }

2、擷取檔案的字尾名:

     OpenFileDialog openDialog = new OpenFileDialog();

           if (openDialog.ShowDialog()==DialogResult.OK)

             string a = openDialog.FileName.Substring(openDialog.FileName.LastIndexOf(".") + 1, openDialog.FileName.Length - openDialog.FileName.LastIndexOf(".") - 1);

               MessageBox.Show(a);

3、擷取檔案的建立時間:

 OpenFileDialog openDialog = new OpenFileDialog();

               FileInfo f = new FileInfo(openDialog.FileName);

               MessageBox.Show(f.CreationTime.ToString());

注:擷取檔案的最新修改時間:FileInfo.LastWriteTime.ToString();

4、擷取檔案名中禁止使用的字元

思路:本執行個體主要用到了Path類的 GetInvalidFileNameChars()方法,文法:

  public static char[] GetInvalidFileNameChars();

傳回值:包含不允許在檔案名中使用的字元數組。

注:Path類位于System.IO命名空間中。

例:

char[] aa = Path.GetInvalidFileNameChars();

           foreach (char a in aa)

               listBox1.Items.Add(Convert.ToInt32(a).ToString());

5、建立和删除檔案

File類的Create方法指定路徑中建立檔案,該方法可重載方法,文法:

public static FileStream Create(string path);

參數說明:

Path:要建立的檔案的路徑及名稱。

傳回值:一個FileStream,它提供對path中指定的檔案的讀寫通路。

File類的Delete方法用來删除指定的檔案,如果不存在則不引發異常。文法:

  public static void Delete(string path);

  private void btn_Create_Click(object sender, EventArgs e)

           SaveFileDialog P_SaveFileDialog = new SaveFileDialog();//建立儲存檔案對話框對象

           if (P_SaveFileDialog.ShowDialog() == DialogResult.OK)//判斷是否确定儲存檔案

               File.Create(P_SaveFileDialog.FileName);//建立檔案

       private void btn_Remove_Click(object sender, EventArgs e)

           OpenFileDialog P_OpenFileDialog = new OpenFileDialog();//建立打開檔案對話框對象

           if (P_OpenFileDialog.ShowDialog() == DialogResult.OK)//判斷是否确定删除檔案

               File.Delete(P_OpenFileDialog.FileName);//删除檔案

6、清空資源回收筒

思路:清空資源回收筒主要用到系統的API函數 SHEmptyRecycleBin,文法如下:

   [DllImportAttribute("shell32.dll")]                                       //聲明API函數

private static extern int SHEmptyRecycleBin(IntPtr handle, string root, int falgs);

參數說明:handle:父視窗句柄。

Root:将要清空的資源回收筒的位址,如果為null值時,将清空所有的驅動器上的資源回收筒。

Falgs:用于清空資源回收筒的功能參數。

注:使用系統API函數時,首先需要在命名空間區域添加System.Runtime.InterServices命名空間。

  const int SHERB_NOCONFIRMATION = 0x000001;   //整型常量在API中表示删除時沒有确認對話框

       const int SHERB_NOPROGRESSUI = 0x000002;                //在API中表示不顯示删除進度條

       const int SHERB_NOSOUND = 0x000004;                          //在API中表示删除完畢時不播放聲音

       [DllImportAttribute("shell32.dll")]                                       //聲明API函數

       private static extern int SHEmptyRecycleBin(IntPtr handle, string root, int falgs);

       private void button1_Click(object sender, EventArgs e)

           //清空資源回收筒

           SHEmptyRecycleBin(this.Handle, "", SHERB_NOCONFIRMATION + SHERB_NOPROGRESSUI + SHERB_NOSOUND);

7、修改檔案屬性

思路:修改檔案屬性用到了FileInfo類的Attributes屬性,文法格式如下:

檔案和檔案夾操作——檔案操作實列

public FileAttributes Attributes { get; set; }

FileAttribute枚舉之一。

private void button2_Click(object sender, EventArgs e)

           System.IO.FileInfo f = new System.IO.FileInfo(textBox1.Text);                          //執行個體化FileInfo類

           if (checkBox1.Checked == true)                                                                                  //如果隻讀複選框選中

               f.Attributes = System.IO.FileAttributes.ReadOnly;                                    //設定檔案為隻讀

           if (checkBox2.Checked == true)                                                                       //如果系統複選框選中

               f.Attributes = System.IO.FileAttributes.System;                                         //設定檔案為系統

           if (checkBox3.Checked == true)                                                                       //如果存檔複選框選中

               f.Attributes = System.IO.FileAttributes.Archive;                                        //設定檔案為存檔

           if (checkBox4.Checked == true)                                                                       //如果隐藏複選框選中

               f.Attributes = System.IO.FileAttributes.Hidden;                                         //設定檔案為隐藏

8、長檔案名轉換成短檔案名

GetShortPathName是一個核心API函數,該函數能将長檔案名轉換為短檔案名,文法格式如下:

[DllImport("Kernel32.dll")]//聲明API函數

private static extern Int16 GetShortPathName(string lpszLongPath, StringBuilder lpszShortPath, Int16 cchBuffer);

lpszLongPath:指定欲擷取路徑名的那個檔案的名字。可以是個完整路徑,或者由目前目錄決定。

lpszShortPath:指定一個緩沖區,用于裝載檔案的短路徑和檔案名。

cchBuffer:lpszShortPath緩沖區長度

檔案和檔案夾操作——檔案操作實列

  [DllImport("Kernel32.dll")]//聲明API函數

       private static extern Int16 GetShortPathName(string lpszLongPath, StringBuilder lpszShortPath, Int16 cchBuffer);

           OpenFileDialog OFDialog = new OpenFileDialog();//建立OpenFileDialog對象

           if (OFDialog.ShowDialog() == DialogResult.OK)//判讀是否選擇了檔案

               textBox1.Text = OFDialog.FileName;//顯示選擇的檔案名

               string longName = textBox1.Text;//記錄選擇的檔案名

               StringBuilder shortName = new System.Text.StringBuilder(256);//建立StringBuilder對象

               GetShortPathName(longName, shortName, 256);//調用API函數轉換成短檔案名

               string myInfo = "長檔案名:" + longName;//顯示長檔案名

               myInfo += "\n短檔案名:" + shortName;//顯示短檔案名

               label2.Text = myInfo;

9、單一檔案複制舉例

例1、BackgroundWorker實作異步複制檔案顯示進度條百分比源代碼

使用BackgroundWorker元件可以防止頁面出現假死的情況。

檔案和檔案夾操作——檔案操作實列

界面:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace WangHao

{

   public partial class backgroundworder : Form

   {

       BackgroundWorker worker = null;

       public backgroundworder()

           InitializeComponent();

           progressBar1.Minimum = 0;

           progressBar1.Maximum = 100;

           worker = new BackgroundWorker();

           worker.WorkerReportsProgress = true;

           worker.WorkerSupportsCancellation = true;

           worker.DoWork += new DoWorkEventHandler(worker_DoWork);

           worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);

           worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

       void worker_DoWork(object sender, DoWorkEventArgs e)

         try

               if (e.Argument != null && e.Argument is FilePair)

               {

                   FilePair obj = (FilePair)e.Argument;

                   string orgFile = obj.OrgFile;

                   string newFile = obj.NewFile;

                   FileStream readFileStream = new FileStream(orgFile, FileMode.Open, FileAccess.Read);

                   FileStream writeFileStream = new FileStream(newFile, FileMode.Create, FileAccess.Write);

                   DateTime start = DateTime.Now;

                   TimeSpan ts;

                   long totalByte = readFileStream.Length;

                   int buffLength = 1024 * 1024 * 64;

                   byte[] buff = new byte[buffLength];

                   long writtenByte = 0;

                   int everytimeReadByteLength = readFileStream.Read(buff, 0, buffLength);

                   while (everytimeReadByteLength > 0)

                   {

                       writeFileStream.Write(buff, 0, everytimeReadByteLength);

                       everytimeReadByteLength = readFileStream.Read(buff, 0, buffLength);

                       writtenByte += everytimeReadByteLength;

                       int percent = (int)(writtenByte * 100 / totalByte);

                       ts = DateTime.Now.Subtract(start);

                       double speed = (double)writtenByte / ts.TotalMilliseconds * 1000 / (1024 * 1024);

                       obj.Speed = speed;

                       worker.ReportProgress(percent, obj);//傳遞使用者自定義對象

                   }

                   writeFileStream.Close();

                   readFileStream.Close();

                   worker.ReportProgress(100);

               }

           catch (Exception ex)

               worker.ReportProgress(100, ex);

       void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)

           FilePair obj = e.UserState as FilePair;

           progressBar1.Value = e.ProgressPercentage;

           label3.Text = e.ProgressPercentage + "%";

           if (obj != null)

           {              

               lblMsg.Text = "正在複制,複制速度為" + obj.Speed.ToString() + "M";

       void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

           lblMsg.Text = "檔案複制完成";

           progressBar1.Value = 0;

           string orgFile = textBox1.Text.Trim();

           string newFile = textBox2.Text.Trim();

           if (System.IO.File.Exists(orgFile))

               bool copy = true;

               if (System.IO.File.Exists(newFile))

                   if (DialogResult.Cancel == MessageBox.Show("新檔案已經存在,是不繼續複制,新檔案即被覆寫", "檔案已存在", MessageBoxButtons.OKCancel))

                       copy = false;

               if (copy)

                   FilePair fileObj = new FilePair(orgFile, newFile);

                   lblMsg.Text = "檔案開始複制";

                   worker.RunWorkerAsync(fileObj);

           else

               lblMsg.Text = "源檔案不存在";

   }

   public class FilePair

       private string _orgFile;

       private string _newFile;

       public FilePair(string orgfile, string newfile)

           _orgFile = orgfile;

           _newFile = newfile;

       public string OrgFile

           get { return _orgFile; }

           set { _orgFile = value; }

       public string NewFile

           get { return _newFile; }

           set { _newFile = value; }

       public double Speed { get; set; }

}

例2:多線程的方式複制單個檔案

檔案和檔案夾操作——檔案操作實列

using System.Linq;

using System.Threading;//線程式的命名空間

using Microsoft.Win32.SafeHandles;

using System.Runtime.InteropServices;

namespace FileCopyPlan

   public delegate void SpeedAndProgress(double speed, double progress);//定義委托

   public partial class Frm_Main : Form

       public Frm_Main()

       private System.Threading.Thread thdAddFile; //建立一個線程

       private string str = "";

           if (openFileDialog1.ShowDialog() == DialogResult.OK)//打開檔案對話框

               textBox1.Text = openFileDialog1.FileName;//擷取源檔案的路徑

       private void button2_Click(object sender, EventArgs e)

           if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)//打開檔案夾對話框

               textBox2.Text = folderBrowserDialog1.SelectedPath;//擷取目的檔案的路徑

       private void button3_Click(object sender, EventArgs e)

           if (textBox1.Text.Length == 0 || textBox2.Text.Length == 0)

               MessageBox.Show("請選擇原檔案路徑或目的檔案路徑。");

               return;

           str = textBox1.Text;//記錄源檔案的路徑

           str = "\\" + str.Substring(str.LastIndexOf('\\') + 1, str.Length - str.LastIndexOf('\\') - 1);//擷取源檔案的名稱

           thdAddFile = new Thread(new ThreadStart(RunAddFile));//建立一個線程

           thdAddFile.IsBackground = true;

           thdAddFile.Start();//執行目前線程

       /// <summary>

       /// 對檔案進行複制,并在複制完成後關閉線程

       /// </summary>

       public void RunAddFile()

           FileOperation fo = new FileOperation();

           fo.OnSpeedAndProgress += new SpeedAndProgress(Frm_Main_OnSpeedAndProgress);

           fo.CopyFile(textBox1.Text, textBox2.Text + str, 1024 * 1024 * 64, progressBar1);//複制檔案

           MessageBox.Show("複制完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

           thdAddFile.Abort();//關閉線程

       /// 檔案的複制

       /// <param FormerFile="string">源檔案路徑</param>

       /// <param toFile="string">目的檔案路徑</param>

       /// <param SectSize="int">傳輸大小</param>

       /// <param progressBar="ProgressBar">ProgressBar控件</param>

       void Frm_Main_OnSpeedAndProgress(double speed, double progress)

       {//防卡死的關鍵,設定進度的時候調用窗體顯示,不調用的時候釋放UI線程,這樣就能保證主窗體不卡死

           this.BeginInvoke(new SpeedAndProgress(aa), new object[] { speed, progress });//線上程上執行指定的委托      

       void aa(double speed, double progress)

           progressBar1.Value = Convert.ToInt32(progress);

           label1.Text = speed.ToString();

           label1.Refresh();

   public class FileOperation

       public event SpeedAndProgress OnSpeedAndProgress;

       public const short FILE_ATTRIBUTE_NORMAL = 0x80;

       public const short INVALID_HANDLE_VALUE = -1;

       public const uint GENERIC_READ = 0x80000000;

       public const uint GENERIC_WRITE = 0x40000000;

       public const uint CREATE_NEW = 1;

       public const uint CREATE_ALWAYS = 2;

       public const uint OPEN_EXISTING = 3;

       public const uint FILE_FLAG_NO_BUFFERING = 0x20000000;

       public const uint FILE_FLAG_WRITE_THROUGH = 0x80000000;

       public const uint FILE_SHARE_READ = 0x00000001;

       public const uint FILE_SHARE_WRITE = 0x00000002;

       // Use interop to call the CreateFile function.

       // For more information about CreateFile,

       // see the unmanaged MSDN reference library.

       [DllImport("kernel32.dll", SetLastError = true)]

       static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,

       uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,

       uint dwFlagsAndAttributes, IntPtr hTemplateFile);

       public void CopyFile(string FormerFile, string toFile, int SectSize, ProgressBar progressBar1)

           bool useBuffer = true;

           SafeFileHandle fr = CreateFile(FormerFile, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

           SafeFileHandle fw = CreateFile(toFile, GENERIC_WRITE, FILE_SHARE_READ, IntPtr.Zero, CREATE_ALWAYS, 0, IntPtr.Zero);

           progressBar1.Value = 0;//設定進度欄的目前位置為0

           progressBar1.Minimum = 0;//設定進度欄的最小值為0

           int bufferSize = useBuffer ? 1024 * 1024 * 64 : 1024 * 1024 * 64;

           FileStream fsr = new FileStream(fr, FileAccess.Read);

           FileStream fsw = new FileStream(fw, FileAccess.Write);

           BinaryReader br = new BinaryReader(fsr);

           BinaryWriter bw = new BinaryWriter(fsw);

           byte[] buffer = new byte[bufferSize];

           Int64 len = fsr.Length;

           DateTime start = DateTime.Now;

           TimeSpan ts;

           while (fsr.Position < fsr.Length)

               int readCount = br.Read(buffer, 0, bufferSize);

               bw.Write(buffer, 0, readCount);

               ts = DateTime.Now.Subtract(start);

               double speed = (double)fsr.Position / ts.TotalMilliseconds * 1000 / (1024 * 1024);

               double progress = (double)fsr.Position / len * 100;

               if (OnSpeedAndProgress != null)

                   OnSpeedAndProgress(speed, progress);

           br.Close();

           bw.Close();

10、C#操作INI檔案

思路:對INI檔案操作,主要用到了系統API函數GetPrivateProfileString和WritePrivateProfileString函數。

GetPrivateProfileString該函數主要用來讀取INI檔案的内容。文法格式如下:[DllImport("kernel32")]

private static extern int GetPrivateProfileString(string lpAppName,string lpKeyName,

string lpDefault,StringBuilder lpReturnedString,int nSize,string lpFileName);

參數

lpAppName

表示INI檔案内部根節點的值

lpKeyName

表示根節點下子标記的值

lpDefault

表示當标記值未設定或不存在是的預設值。

lpReturnedString

表示傳回讀取節點的值

nSize

表示讀取的節點内容的最大容量

lpFileName

表示檔案的全路徑

WritePrivateProfileString函數用于向INI檔案中寫資料。

 [DllImport("kernel32")]

  private static extern long WritePrivateProfileString(string mpAppName,string mpKeyName,

string mpDefault,string mpFileName);

mpAppName

表示INI内部根節點的值

mpKeyName

表示将要修改的标記名稱

mpDefault

表示想要修改的内容

mpFileName

表示INI檔案的全路徑

檔案和檔案夾操作——檔案操作實列

namespace INIFileOperate

       #region 變量聲明區

       public string str = "";//該變量儲存INI檔案所在的具體實體位置

       public string strOne = "";

       [DllImport("kernel32")]

       private static extern int GetPrivateProfileString(

           string lpAppName,

           string lpKeyName,

           string lpDefault,

           StringBuilder lpReturnedString,

           int nSize,

           string lpFileName);

       public string ContentReader(string area, string key, string def)

           StringBuilder stringBuilder = new StringBuilder(1024);                                      //定義一個最大長度為1024的可變字元串

           GetPrivateProfileString(area, key, def, stringBuilder, 1024, str);                     //讀取INI檔案

           return stringBuilder.ToString();                                                                         //傳回INI檔案的内容

       private static extern long WritePrivateProfileString(

           string mpAppName,

           string mpKeyName,

           string mpDefault,

           string mpFileName);

       #endregion

       #region 窗體加載部分

       private void Form1_Load(object sender, EventArgs e)

           str = Application.StartupPath + "\\ConnectString.ini";                                                 //INI檔案的實體位址

           strOne = System.IO.Path.GetFileNameWithoutExtension(str);                                //擷取INI檔案的檔案名

           if (File.Exists(str))                                                                                                 //判斷是否存在該INI檔案

               server.Text = ContentReader(strOne, "Data Source", "");                                 //讀取INI檔案中伺服器節點的内容

               database.Text = ContentReader(strOne, "DataBase", "");                                //讀取INI檔案中資料庫節點的内容

               uid.Text = ContentReader(strOne, "Uid", "");                                                        //讀取INI檔案中使用者節點的内容

               pwd.Text = ContentReader(strOne, "Pwd", "");                                                    //讀取INI檔案中密碼節點的内容

       #region 進行修改操作

           if (File.Exists(str))                                                                                                  //判斷是否存在INI檔案

               WritePrivateProfileString(strOne, "Data Source", server.Text, str);               //修改INI檔案中伺服器節點的内容

               WritePrivateProfileString(strOne, "DataBase", database.Text, str);             //修改INI檔案中資料庫節點的内容

               WritePrivateProfileString(strOne, "Uid", uid.Text, str);                            //修改INI檔案中使用者節點的内容

               WritePrivateProfileString(strOne, "Pwd", pwd.Text, str);                        //修改INI檔案中密碼節點的内容

               MessageBox.Show("恭喜你,修改成功!", "提示資訊", MessageBoxButtons.OK, MessageBoxIcon.Information);

               MessageBox.Show("對不起,你所要修改的檔案不存在,請确認後再進行修改操作!", "提示資訊", MessageBoxButtons.OK, MessageBoxIcon.Information);

11、建立PDF檔案

思路:建立PDF文檔用到了第三方元件itextsharp.dll

檔案和檔案夾操作——檔案操作實列

using iTextSharp.text;

using iTextSharp.text.pdf;

namespace CreatePDFDocument

       //該變量儲存PDF的文檔名

       public static string filePath = "";

       //建立PDF文檔

           SaveFileDialog saveFileDialog = new SaveFileDialog();                              //給出檔案儲存資訊,确定儲存位置

           saveFileDialog.Filter = "PDF檔案(*.PDF)|*.PDF";

           if (saveFileDialog.ShowDialog() == DialogResult.OK)

               filePath = saveFileDialog.FileName;

               //開始建立PDF文檔,首先聲明一個Document對象

               Document document = new Document();

               //使用指定的路徑和建立模式初始化檔案流對象

               PdfWriter.getInstance(document, new FileStream(filePath, FileMode.Create));

               document.Open();                                                                                       //打開文檔

               BaseFont baseFont = BaseFont.createFont(@"c:\windows\fonts\SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

               iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, 20); //設定文檔字型樣式

               document.Add(new Paragraph(richTextBox1.Text, font));                       //添加内容至PDF文檔中

               document.Close();                                                                                       //關閉文檔

               MessageBox.Show("祝賀你,文檔建立成功!", "提示資訊", MessageBoxButtons.OK, MessageBoxIcon.Information);

12、判斷檔案是否被占用

[DllImport("kernel32.dll")]

public static extern IntPtr _lopen(string lpPathName, int iReadWrite);

public static extern bool CloseHandle(IntPtr hObject);

public const int OF_READWRITE = 2;

public const int OF_SHARE_DENY_NONE = 0x40;

public readonly IntPtr HFILE_ERROR = new IntPtr(-1);

   string vFileName = @"c:\temp\temp.bmp";

   if (!File.Exists(vFileName))

       MessageBox.Show("檔案都不存在!");

       return;

   IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE);

   if (vHandle == HFILE_ERROR)

       MessageBox.Show("檔案被占用!");

   CloseHandle(vHandle);

   MessageBox.Show("沒有被占用!");

13、實作檔案的拖放操作

思路:實作檔案的拖放操作主要用到了DragEventArgs類的Data屬性及DataObject類的GetDataPresent方法。

DragEventArgs類的Data屬性

DragEventArgs類包含與所有拖放事件(DragEnter、DragLeave、DragOver和Drop)相關的參數,其Data屬性用來讀取一個資料對象,該對象包含與對應拖動事件關聯的資料。Data屬性的文法如下:

public IDataObject Data { get; }

參數說明:屬性值,一個資料對象,該對象包含與對應拖動事件關聯的資料。

DataObject類的GetDataPresent方法

DataObject類主要實作資料傳輸機制,其GetDataPresent方法用來确定DataObject對象中存儲的資料是否與指定的格式關聯

bool GetDataPresent(string format);

參數說明:format:要檢查的格式。傳回值:如果DataObject對象存儲的資料與指定的格式關聯,或者可以轉換指定的格式,則為True;否則為false。

DataObject類的GetData方法

DataObject類的GetData方法用來傳回與所指定資料格式關聯的資料,文法如下:

object GetData(string format);

format:要檢查的資料的格式。

傳回值:與指定格式關聯的資料,或未null。

 public partial class Frm_Main : Form

           this.AllowDrop = true;

       private void Form1_DragEnter(object sender, DragEventArgs e)

           if (e.Data.GetDataPresent(DataFormats.FileDrop))

               string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);              //擷取拖入檔案的基本資訊

               for (int i = 0; i < files.Length; i++)                                                                //拖放入窗體的檔案的檔案名加入ListBox

                   listBox1.Items.Add(files[i]);                                                                                  //添加檔案的路徑

14、将檔案分割為多個小檔案和合并

思路:對檔案進行分割操作主要通過FileStream、BinaryReader和BinaryWriter類實作的。以檔案的全路徑對應的字元串和檔案打開模式來初始化FileStream檔案流,然後再以FileStream檔案流來初始化BinaryReader檔案閱讀器,最後通過for語句循環将大檔案分割成為多個小檔案。

BinaryReader類,該類主要用特定的編碼将基中繼資料類型讀作二進制值,其構造函數主要使用UTF8Encoding初始化BinaryReader類的執行個體。文法如下:

public BinaryReader(Stream input);

分割檔案用到了BinaryReader類的ReadBytes方法,該方法用來從目前流中将count個位元組讀入位元組數組,并是目前位置提升count個位元組。文法如下:

public virtual byte[] ReadBytes(int count);

BinaryWriter類,以二進制形式将濟源類型寫入流,并支援用特定的編碼寫入字元串,其構造函數主要使用UTF-8作為字元串編碼來初始化BinaryWriter類的執行個體,文法如下:public BinaryWriter(Stream output);

将内容寫入分割後的檔案中用到了BinaryWriter類的Write方法,該方法用來将值寫入目前,文法如下:public virtual void Write(byte[] buffer);

檔案和檔案夾操作——檔案操作實列

namespace FileComminuteUnite

       #region 分割檔案

       /// 分割檔案

       /// <param name="strFlag">分割機關</param>

       /// <param name="intFlag">分割大小</param>

       /// <param name="strPath">分割後的檔案存放路徑</param>

       /// <param name="strFile">要分割的檔案</param>

       /// <param name="PBar">進度條顯示</param>

       public void SplitFile(string strFlag, int intFlag, string strPath, string strFile, ProgressBar PBar)

           int iFileSize = 0;

           //根據選擇來設定分割的小檔案的大小

           switch (strFlag)

               case "Byte":

                   iFileSize = intFlag;

                   break;

               case "KB":

                   iFileSize = intFlag * 1024;

               case "MB":

                   iFileSize = intFlag * 1024 * 1024;

               case "GB":

                   iFileSize = intFlag * 1024 * 1024 * 1024;

           FileStream SplitFileStream = new FileStream(strFile, FileMode.Open);//以檔案的全路徑對應的字元串和檔案打開模式來初始化FileStream檔案流執行個體

           BinaryReader SplitFileReader = new BinaryReader(SplitFileStream);//以FileStream檔案流來初始化BinaryReader檔案閱讀器

           byte[] TempBytes;//每次分割讀取的最大資料

           int iFileCount = (int)(SplitFileStream.Length / iFileSize);//小檔案總數

           PBar.Maximum = iFileCount;

           if (SplitFileStream.Length % iFileSize != 0) iFileCount++;

           string[] TempExtra = strFile.Split('.');

           //循環将大檔案分割成多個小檔案

           for (int i = 1; i <= iFileCount; i++)

               //确定小檔案的檔案名稱

               string sTempFileName = strPath + @"\" + i.ToString().PadLeft(4, '0') + "." + TempExtra[TempExtra.Length - 1]; //小檔案名

               FileStream TempStream = new FileStream(sTempFileName, FileMode.OpenOrCreate);  //根據檔案名稱和檔案打開模式來初始化FileStream檔案流執行個體

               BinaryWriter TempWriter = new BinaryWriter(TempStream);   //以FileStream執行個體來建立、初始化BinaryWriter書寫器執行個體

               TempBytes = SplitFileReader.ReadBytes(iFileSize); //從大檔案中讀取指定大小資料

               TempWriter.Write(TempBytes);    //把此資料寫入小檔案

               TempWriter.Close();   //關閉書寫器,形成小檔案

               TempStream.Close();     //關閉檔案流

               PBar.Value = i - 1;

           SplitFileReader.Close();//關閉大檔案閱讀器

           SplitFileStream.Close();

           MessageBox.Show("檔案分割成功!");

       private void frmSplit_Load(object sender, EventArgs e)

           timer1.Start();//啟動計時器

       //選擇要分割的檔案

       private void btnSFile_Click(object sender, EventArgs e)

           if (openFileDialog.ShowDialog() == DialogResult.OK)

               txtFile.Text = openFileDialog.FileName;

       //執行檔案分割操作

       private void btnSplit_Click(object sender, EventArgs e)

           try

               if (txtLength.Text == ""||txtFile.Text.Trim()==""||txtPath.Text.Trim()=="")

                   MessageBox.Show("請将資訊填寫完整!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                   txtLength.Focus();

               else if (cboxUnit.Text == "")

                   MessageBox.Show("請選擇要分割的檔案機關!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                   cboxUnit.Focus();

               else

                   SplitFile(cboxUnit.Text, Convert.ToInt32(txtLength.Text.Trim()), txtPath.Text, txtFile.Text, progressBar);

           catch { }

       //選擇分割後的檔案存放路徑

       private void btnSPath_Click(object sender, EventArgs e)

           if (folderBrowserDialog.ShowDialog() == DialogResult.OK)

               txtPath.Text = folderBrowserDialog.SelectedPath;

       //監視“分割”/“合并”按鈕的可用狀态

       private void timer1_Tick(object sender, EventArgs e)

           if (txtFile.Text != "" && txtPath.Text != "")

               btnSplit.Enabled = true;

               btnSplit.Enabled = false;

對檔案合并

       #region 合并檔案

       /// 合并檔案

       /// <param name="list">要合并的檔案集合</param>

       /// <param name="strPath">合并後的檔案名稱</param>

       public void CombinFile(string[] strFile, string strPath, ProgressBar PBar)

           PBar.Maximum = strFile.Length;

           FileStream AddStream = null;

           //以合并後的檔案名稱和打開方式來建立、初始化FileStream檔案流

           AddStream = new FileStream(strPath, FileMode.Append);

           //以FileStream檔案流來初始化BinaryWriter書寫器,此用以合并分割的檔案

           BinaryWriter AddWriter = new BinaryWriter(AddStream);

           FileStream TempStream = null;

           BinaryReader TempReader = null;

           //循環合并小檔案,并生成合并檔案

           for (int i = 0; i < strFile.Length; i++)

               //以小檔案所對應的檔案名稱和打開模式來初始化FileStream檔案流,起讀取分割作用

               TempStream = new FileStream(strFile[i].ToString(), FileMode.Open);

               TempReader = new BinaryReader(TempStream);

               //讀取分割檔案中的資料,并生成合并後檔案

               AddWriter.Write(TempReader.ReadBytes((int)TempStream.Length));

               //關閉BinaryReader檔案閱讀器

               TempReader.Close();

               //關閉FileStream檔案流

               TempStream.Close();

               PBar.Value = i + 1;

           //關閉BinaryWriter檔案書寫器

           AddWriter.Close();

           //關閉FileStream檔案流

           AddStream.Close();

           MessageBox.Show("檔案合并成功!");

       //選擇要合成的檔案

       private void btnCFile_Click(object sender, EventArgs e)

               string Selectfile = "";

               string[] files = openFileDialog.FileNames;

               for (int i = 0; i < files.Length; i++)

                   Selectfile += "," + files[i].ToString();

               if (Selectfile.StartsWith(","))

                   Selectfile = Selectfile.Substring(1);

               if (Selectfile.EndsWith(","))

                   Selectfile.Remove(Selectfile.LastIndexOf(","),1);

               txtCFile.Text = Selectfile;

       //選擇合成後的檔案存放路徑

       private void btnCPath_Click(object sender, EventArgs e)

               txtCPath.Text = saveFileDialog.FileName;

       //執行合成檔案操作

       private void btnCombin_Click(object sender, EventArgs e)

               if (txtCFile.Text.Trim() == "" || txtCPath.Text.Trim() == "")

                   MessageBox.Show("請将資訊輸入完整!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                   if (txtCFile.Text.IndexOf(",") == -1)

                       MessageBox.Show("請選擇要合成的檔案,最少為兩個!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                   else

                       string[] strFiles = txtCFile.Text.Split(',');

                       CombinFile(strFiles, txtCPath.Text, progressBar);

       //監視“合并”按鈕的可用狀态

           if (txtCFile.Text != "" && txtCPath.Text != "")

               btnCombin.Enabled = true;

               btnCombin.Enabled = false;