zoukankan      html  css  js  c++  java
  • 文件切割与合并

      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 }
  • 相关阅读:
    js-YDUI 移动端解决方案
    js 关于网易淘宝移动端适配的学习
    JavaScript--数据结构与算法之排序
    《致橡树》
    JavaScript--Module模式
    js-轮播图的总结
    flex布局:
    JavaScript--模块化 JavaScript module designer
    JavaScript--数据结构之队列
    剑指offer——数组中的逆序对
  • 原文地址:https://www.cnblogs.com/SpeakHero/p/3182762.html
Copyright © 2011-2022 走看看