There are many reasons to want to split file into chunks - mainly for network transfer (e.g. e-mail attachments) but I\'m sure there are scenarios that could require such t
The example below will split a file, producing multiple output files all smaller than the maxChunkSize
supplied. To reassemble, you can use copy /b
.
SplitFile.cs
(compile with c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc /out:splitFile.exe SplitFile.cs
)
using System;
using System.IO;
namespace SplitFile
{
class Program
{
static void Main(string[] args)
{
long maxChunkSize;
if (args.Length != 3 || !long.TryParse(args[2], out maxChunkSize) || maxChunkSize <= 81920)
{
Console.WriteLine("Usage: splitfile.exe inputFile outputprefix maxchunksize");
Console.WriteLine(" inputfile: File to split");
Console.WriteLine(" outputprefix: Prefix to use for the output name");
Console.WriteLine(" Ex: out -> { out0001.bin, out0002.bin }");
Console.WriteLine(" maxchunksize: Maximum number of bytes in each file");
Console.WriteLine(" Note: this is the maximum size, not an exact size");
Console.WriteLine(" Note: chunk size cannot be smaller than 81920 bytes");
return;
}
string inputFilePath = args[0];
string outputFilePathFormat = string.Format("{0}{{0:0000}}.bin", args[1]);
using (Stream fsInput = File.Open(inputFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
byte[] buffer = new byte[81920 /* default from System.Stream */];
int cOutFileNo = 0;
Stream destination = getOutputFile(ref cOutFileNo, outputFilePathFormat);
try
{
int read;
while ((read = fsInput.Read(buffer, 0, buffer.Length)) != 0)
{
if (destination.Length + read > maxChunkSize)
{
destination.Dispose();
destination = getOutputFile(ref cOutFileNo, outputFilePathFormat);
}
destination.Write(buffer, 0, read);
}
}
finally
{
destination.Dispose();
}
}
}
private static Stream getOutputFile(ref int cOutFileNo, string outFileFormat)
{
string filename = string.Format(outFileFormat, cOutFileNo);
cOutFileNo++;
return File.Open(filename, FileMode.CreateNew, FileAccess.Write, FileShare.None);
}
}
}
Example Use:
C:\drop>splitFile.exe ubuntu-rescue-remix-12-04.iso Ubuntu_Split_ 10485760 C:\drop>dir 01/29/2015 17:21 244,570,112 ubuntu-rescue-remix-12-04.iso 01/30/2015 15:27 10,485,760 Ubuntu_Split_0000.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0001.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0002.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0003.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0004.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0005.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0006.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0007.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0008.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0009.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0010.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0011.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0012.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0013.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0014.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0015.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0016.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0017.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0018.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0019.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0020.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0021.bin 01/30/2015 15:27 10,485,760 Ubuntu_Split_0022.bin 01/30/2015 15:27 3,397,632 Ubuntu_Split_0023.bin C:\drop>copy /b Ubuntu_Split_* Ubuntu_recombined.iso Ubuntu_Split_0000.bin Ubuntu_Split_0001.bin Ubuntu_Split_0002.bin Ubuntu_Split_0003.bin Ubuntu_Split_0004.bin Ubuntu_Split_0005.bin Ubuntu_Split_0006.bin Ubuntu_Split_0007.bin Ubuntu_Split_0008.bin Ubuntu_Split_0009.bin Ubuntu_Split_0010.bin Ubuntu_Split_0011.bin Ubuntu_Split_0012.bin Ubuntu_Split_0013.bin Ubuntu_Split_0014.bin Ubuntu_Split_0015.bin Ubuntu_Split_0016.bin Ubuntu_Split_0017.bin Ubuntu_Split_0018.bin Ubuntu_Split_0019.bin Ubuntu_Split_0020.bin Ubuntu_Split_0021.bin Ubuntu_Split_0022.bin Ubuntu_Split_0023.bin 1 file(s) copied. C:\drop>dir Ubuntu*.iso 01/29/2015 17:21 244,570,112 ubuntu-rescue-remix-12-04.iso 01/30/2015 15:27 244,570,112 Ubuntu_recombined.iso C:\drop>fciv -sha1 ubuntu-rescue-remix-12-04.iso // // File Checksum Integrity Verifier version 2.05. // 02403c37cbdb3e03e00f5176807a793ef63d877c ubuntu-rescue-remix-12-04.iso C:\drop>fciv -sha1 Ubuntu_recombined.iso // // File Checksum Integrity Verifier version 2.05. // 02403c37cbdb3e03e00f5176807a793ef63d877c ubuntu-rescue-remix-12-04.iso C:\drop>