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;