C# split big file into small files as, and merge the small files into big one

复制代码
namespace ConsoleApp59
{
    internal class Program
    {
        static string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        static void Main(string[] args)
        {
            string filePath = @"D:\Software\WallStreetWolf\WallStreetWolf.mkv";
            int chunkSize = 100000000;
            SplitLargeFile(filePath, chunkSize);
            MergeSmallFilesIntoOne(chunkSize);
            Console.WriteLine("Finished!");            
        }

        static void MergeSmallFilesIntoOne(int chunkSize = 100000000)
        {
            var mkvFiles = Directory.GetFiles(path, "*.mkv")?.OrderBy(x => new FileInfo(x).CreationTime)?.ToList();
            using (var newFs = File.Create("WallStreetWolf.mkv"))
            {
                int filesCount = mkvFiles.Count();
                for(int i=0;i<filesCount; i++)
                {
                    string kvFile=mkvFiles[i];
                    using (var largeFileStream = File.OpenRead(kvFile))
                    {
                        var buffer = new byte[chunkSize];
                        int bytesRead;
                        while ((bytesRead = largeFileStream.Read(buffer, 0, chunkSize)) > 0)
                        {
                            newFs.Write(buffer, 0, bytesRead);
                            Console.WriteLine(kvFile);
                        }
                    }
                }
            }
            Console.WriteLine("Finised in MergeSmallFilesIntoOne!\n\n\n");
        }

        static void SplitLargeFile(string filePath, int chunkSize)
        {
            int idx = 0;
            
            string fileName = System.IO.Path.GetFileNameWithoutExtension(filePath);
            string extension = System.IO.Path.GetExtension(filePath);
            using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                var buffer = new byte[chunkSize];
                int bytesRead;
                while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
                {
                    byte[] destArray = new byte[bytesRead];
                    Array.Copy(buffer, destArray, bytesRead);
                    string splitFile = $"{fileName}_{idx++}{extension}";
                    using (FileStream destStream = new FileStream(splitFile, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                    {
                        using (MemoryStream ms = new MemoryStream(destArray))
                        {
                            ms.WriteTo(destStream);
                            Console.WriteLine(splitFile);
                        }
                    }
                }
            }
            Console.WriteLine("Finised in SplitLargeFile!\n\n\n");
        }
    }
}
复制代码

 

 

To be cautious,when merge split small bulks into bigger one,must order by created time as below

var mkvFiles = Directory.GetFiles(path, "*.mkv")?.OrderBy(x => new FileInfo(x).CreationTime)?.ToList();

 

 

复制代码
var mkvFiles = Directory.GetFiles(path, "*.mkv")?.OrderBy(x => new FileInfo(x).CreationTime)?.ToList();
using (var newFs = File.Create("WallStreetWolf.mkv"))
{
    int filesCount = mkvFiles.Count();
    for(int i=0;i<filesCount; i++)
    {
        string kvFile=mkvFiles[i];
        using (var largeFileStream = File.OpenRead(kvFile))
        {
            var buffer = new byte[chunkSize];
            int bytesRead;
            while ((bytesRead = largeFileStream.Read(buffer, 0, chunkSize)) > 0)
            {
                newFs.Write(buffer, 0, bytesRead);
                Console.WriteLine(kvFile);
            }
        }
    }
}
复制代码

 

 

 

posted @   FredGrit  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2019-09-01 Redis
点击右上角即可分享
微信分享提示