Exercise
File splitter
Objetive
Create a program to split a file (of any kind) into pieces of a certain size. It must receive the name of the file and the size as parameters. For example, it can be used by typing:
split myFile.exe 2000
If the file "myFile.exe" is 4500 bytes long, that command would produce a file named "myFile.exe.001" that is 2000 bytes long, another file named "myFile.exe.002" that is also 2000 bytes long, and a third file named "myFile.exe.003" that is 500 bytes long.
Example Code
using System;
using System.IO;
using System.Text;
class FileSplitter
{
static void Main(string[] args)
{
if (args.Length != 2)
{
Console.WriteLine("Usage: FileSplitter ");
return;
}
string fileName = args[0];
int chunkSize;
bool isNumeric = Int32.TryParse(args[1], out chunkSize);
if (!isNumeric || chunkSize <= 0)
{
Console.WriteLine("Error: Chunk size must be a positive number.");
return;
}
if (!File.Exists(fileName))
{
Console.WriteLine("Error: The file does not exist.");
return;
}
try
{
using (FileStream inputFile = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
long fileLength = inputFile.Length;
int chunkCount = (int)(fileLength / chunkSize);
if (fileLength % chunkSize != 0) chunkCount++;
byte[] buffer = new byte[chunkSize];
int bytesRead;
for (int i = 0; i < chunkCount; i++)
{
string outputFileName = $"{fileName}.{i + 1:D3}";
using (FileStream outputFile = new FileStream(outputFileName, FileMode.Create, FileAccess.Write))
{
bytesRead = inputFile.Read(buffer, 0, chunkSize);
outputFile.Write(buffer, 0, bytesRead);
}
Console.WriteLine($"Created chunk {outputFileName} with {bytesRead} bytes.");
}
}
Console.WriteLine("File split complete.");
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
}