工做中遇到要上傳下載的功能,而中間接收的服務器最大隻能接收200M的文件,對於大文件沒法知足,因此只能在上傳的時候對大於100M的文件進行分割,分割成的小文件爲原大文件名+.temp+i。在下載端,下載完成後再對其進行合併。服務器
思路:文件的分割與合併就是將文件先轉換成流再對其進行操做。string
/// <summary>
/// 分割文件方法
/// </summary>
/// <param name="filePath">被分割文件</param>it
/// <param name="cutFileSize">被分割文件大小</param>
/// <returns>分割後的文件</returns>
string[] CutFile(string filePath,int cutFileSize)
{
string[] result; io
//文件流讀取文件
using (FileStream cutFileStream = new FileStream(filePath, FileMode.Open))
{foreach
//二進制讀取器
using (BinaryReader cutFileReader = new BinaryReader(cutFileStream))
{
byte[] cutBytes;file
//分割的文件個數
int fileCount =Convert.ToInt32(Math.Ceiling((double)cutFileStream.Length / cutFileSize));
result = new string[fileCount];
for (int i = 0; i < fileCount; i++)
{
//分割文件保存路徑
string saveFilePath=Application.StartupPath+"\\cutfile\\";下載
//分割文件名
string cutFileName = Path.Combine(saveFilePath, Path.GetFileName(filePath)) + ".temp" + i;
result[i] = cutFileName;二進制
//分割文件流
using (FileStream tempStream = new FileStream(cutFileName, FileMode.OpenOrCreate))
{方法
//分割文件二進制寫入器
using (BinaryWriter tempWriter = new BinaryWriter(tempStream))
{
cutBytes = cutFileReader.ReadBytes(cutFileSize);
tempWriter.Write(cutBytes);
}
}
}
}
}
return result;
}協議
/// <summary>
/// 合併文件
/// </summary>
/// <param name="filePaths">要合併的文件列表</param>
/// <param name="combineFile">合併後的文件路徑帶文件名</param>
void CombineFiles(string[] filePaths,string combineFile)
{
using (FileStream CombineStream = new FileStream(combineFile, FileMode.OpenOrCreate))
{
using (BinaryWriter CombineWriter = new BinaryWriter(CombineStream))
{
foreach (string file in filePaths)
{
using (FileStream fileStream = new FileStream(file, FileMode.Open))
{
using (BinaryReader fileReader = new BinaryReader(fileStream))
{
byte[] TempBytes = fileReader.ReadBytes((int)fileStream.Length);
CombineWriter.Write(TempBytes);
}
}
}
}
}
}
上傳下載有不少現成的類方法能夠調用如WebClient或者經過http協議的HttpWebRequest,HttpWebResponse等均可實現。