文件切割与合并

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using System.Linq;
  5 
  6 namespace Client
  7 {
  8     /// <summary>
  9     /// 文件切割与合并
 10     /// </summary>
 11     public class FilePartitions
 12     {
 13         #region const params
 14         private const Int32 DefaultMaxEdges = 5 * 1024; //默认切割边界 5M
 15         private String TargetFilePrefix = "part_"; //生成文件的前缀
 16         #endregion
 17 
 18         #region private params
 19         private Int32 iMaxEdges = 0;
 20         private String strTargetDir = String.Empty;
 21         private Int32 iFileCount = 0;
 22         #endregion
 23 
 24         #region Attribute
 25         /// <summary>
 26         /// 文件切割边界
 27         /// </summary>
 28         public Int32 MaxEdges { get { return iMaxEdges > 0 ? iMaxEdges : DefaultMaxEdges; } set { iMaxEdges = value; } }
 29 
 30         /// <summary>
 31         /// 切割文件放置位置
 32         /// 未设置将与源文件放置同一目录
 33         /// </summary>
 34         public String TargetDir
 35         {
 36             get { return String.Empty.Equals(strTargetDir) ? Path.GetDirectoryName(SourceFile) : strTargetDir; }
 37             set { strTargetDir = value; }
 38         }
 39 
 40         /// <summary>
 41         /// 源文件
 42         /// </summary>
 43         public String SourceFile { get; set; }
 44 
 45         /// <summary>
 46         /// 总生成的文件数
 47         /// </summary>
 48         public Int32 FileCount { get { return iFileCount; } }
 49 
 50         /// <summary>
 51         /// 切割后文件前缀
 52         /// </summary>
 53         public String FilePrefix { get { return TargetFilePrefix; } set { TargetFilePrefix = value; } }
 54 
 55         #endregion
 56 
 57         public FilePartitions()
 58         {
 59 
 60         }
 61 
 62         public FilePartitions(String sourceFileName)
 63         {
 64             SourceFile = sourceFileName;
 65             if (!File.Exists(SourceFile))
 66                 throw new Exception(String.Format("待处理文件 {0} 不存在!", SourceFile));
 67         }
 68         /// <summary>
 69         /// 切割文件为小块文件流
 70         /// </summary>
 71         /// <param name="filename"></param>
 72         /// <returns></returns>
 73         public IEnumerator<byte[]> GetFileBytes(string filename)
 74         {
 75             FileStream sourceStream = null;
 76             BinaryReader SplitFileReader = null;
 77             int iFileSize = MaxEdges * 1024;
 78             byte[] TempBytes;
 79             using (sourceStream = new FileStream(SourceFile, FileMode.Open, FileAccess.Read))
 80             {
 81                 using (SplitFileReader = new BinaryReader(sourceStream))
 82                 {
 83                     if (sourceStream.Length % iFileSize == 0)
 84                     {
 85                         iFileCount = (int)(sourceStream.Length / iFileSize);
 86                     }
 87                     else
 88                     {
 89                         iFileCount = (int)(sourceStream.Length / iFileSize) + 1;
 90                     }
 91                     for (var i = 1; i <= iFileCount; i++)
 92                     {
 93                         TempBytes = SplitFileReader.ReadBytes(iFileSize);
 94                         yield return TempBytes;
 95                     }
 96                 }
 97             }
 98         }
 99         /// <summary>
100         /// 切割文件为小块文件流
101         /// </summary>
102         /// <returns></returns>
103         public IEnumerator<byte[]> GetFileBytes()
104         {
105             return GetFileBytes(SourceFile);
106         }
107         /// <summary>
108         /// 合并文件【文件还原】
109         /// </summary>
110         /// <returns></returns>
111         public Boolean OnMergeFiles()
112         {
113             Boolean bResult = true;
114             FileStream AddStream = null;
115             BinaryWriter AddWriter = null;
116             FileStream TempStream = null;
117             BinaryReader TempReader = null;
118             try
119             {
120 
121                 string[] arrFileNames = Directory.GetFiles(TargetDir);
122                 List<FileInfoExt> fileInfo = new List<FileInfoExt>();
123                 foreach (String fileName in arrFileNames)
124                 {
125                     String f1 = Path.GetFileName(fileName);
126                     if (f1.IndexOf(FilePrefix) == 0)
127                         fileInfo.Add(new FileInfoExt() { FileFullname = fileName, Filename = f1, FileCrTime = File.GetLastWriteTime(fileName) });
128                 }
129                 fileInfo = fileInfo.OrderBy(p => p.FileCrTime).ToList();
130                 iFileCount = fileInfo.Count;
131 
132                 AddStream = new FileStream(SourceFile, FileMode.OpenOrCreate);
133                 AddWriter = new BinaryWriter(AddStream);
134 
135                 foreach (FileInfoExt fileName in fileInfo)
136                 {
137                     TempStream = new FileStream(fileName.FileFullname, FileMode.Open, FileAccess.Read);
138                     TempReader = new BinaryReader(TempStream);
139                     AddWriter.Write(TempReader.ReadBytes((int)TempStream.Length));
140                     TempReader.Close();
141                     TempReader.Close();
142                 }
143 
144             }
145             catch (Exception ex)
146             {
147                 bResult = false;
148                 throw ex;
149             }
150             finally
151             {
152                 if (TempReader != null) TempReader.Close();
153                 if (TempStream != null) TempStream.Close();
154                 if (AddStream != null) AddStream.Close();
155                 if (AddWriter != null) AddWriter.Close();
156             }
157             return bResult;
158         }
159     }
160 
161     public class FileInfoExt
162     {
163         /// <summary>
164         /// 文件完整路径
165         /// </summary>
166         public String FileFullname { get; set; }
167         /// <summary>
168         /// 文件名
169         /// </summary>
170         public String Filename { get; set; }
171         /// <summary>
172         /// 最后修改时间
173         /// </summary>
174         public DateTime FileCrTime { get; set; }
175 
176     }
177 
178 }
原文地址:https://www.cnblogs.com/SpeakHero/p/3182762.html