Click here to Skip to main content
13,557,740 members
Click here to Skip to main content
Add your own
alternative version


46 bookmarked
Posted 25 Sep 2003

File Splitter Utility in C# - WinForms

, 25 Sep 2003
Rate this:
Please Sign up or sign in to vote.
Simple File Splitter / Joiner utility that demonstrates FCL and Winforms UI processing
<!-- Article image -->

Sample Image - FileSplitter.jpg


This project is a simple file splitter / joiner application.  It's comprised of a simple UI that interfaces with a simple controller class. The controller class is responsible for coordinating the requests from the UI, initiation of the 2 worker classes (FileSplitter & FileJoiner), and deal with updating the UI with the progress of the activity.

The project introduces some nice features of the Streams present in the .NET Base Classes. Stuff that would be lots more code in C++ can be cut down considerably.  It also provides for tying events & delegates between the tiers (UI, Controller, Processing).


I originally created the worker classes in order to split up large MPEG files so they could fit onto 600 MB CD's.  Routinely, however, I find a need to split files when transfering files over the internet using FTP, email, etc.  While utilities such as WinRar do this for you, in the end you have to pay for the software for a simple task.  They do add zip capabilities to the mix, but MPEG files, and existing Zip files are already zipped.  So, I just needed a splitter/joiner tool and here it is.

Using the code

FileSplitter / File Joiner Classes

These classes expose a set of simple methods and an event called ProgressNotify.  This event will just provide the percent of completion of the task in process.  There's further control capabilities for tuning of the size of the internal buffer used along with the size of the file segments.  Not all properties of the class are utilized by the UI.  It also just uses a simple filename mechanism for the output files.  If the input file is called, the segments are called,, etc.

FileSplitter has one real method that just takes a filename to split and uses the file naming convention.

FileJoiner has a bunch of extra methods for joining files, but only 1 is used by the UI. 

In the end, FileJoiner does the equivalent of a DOS command "copy /b file1 + file2 + file3 finalfile ".


Within the UI project, there's a controller class that is responsible for accepting the requests from the UI and spawning, using the ThreadPool, a worker thread. 

The constructor for Controller accepts the form and a delegate on that form that will process the progress updates.  The form has a handler as well that just updates the progress bar within the status bar using OwnerDraw.

public Controller( Form owner, Delegate senderDelegate)
    m_sender = owner;
    m_senderDelegate = senderDelegate;

It then registers for the FileSplitter/FileJoiner using it's NotifyHandler delegate to accept the events.

fs.ProgressNotify += new ProgressNotifyHandler(NotifyHandler);

NotifyDelegate then in turn, uses the following method to asynchronously update the UI with the progress of the task.

private void NotifyHandler( int i ) { m_sender.BeginInvoke( 
      m_senderDelegate, new object[] { i } ); }


The main form is simple.  Double clicking on the File Name text field just brings up a file selection dialog.  Choosing a file, then either Megabytes or Kilobytes, then click "Split File". 

When joining files, if the file chosen doesn't end in a '0' (indicating it's the 1st in the series) you'll get an exception.  Also, it's only smart enough to join files in sequence numerically.  If there's file missing on the join, it will continue without fail - although this is probably not the correct behavior a simple change to FileJoiner could deal with that.

The other interesting thing is having a progress bar appear on the status bar within a panel.

That is accomplished using the following - 1st add the progress bar to the controls collection

progressBar1 = new ProgressBar();
this.Controls.Add(progressBar1); //not really sure if I need this!!!
this.statusBar.Controls.Add( this.progressBar1 );

Then, there's adding a method for the statusbar's OwnerDraw event and wiring it up.

The wireup:

this.statusBar.DrawItem += 
  new System.Windows.Forms.StatusBarDrawItemEventHandler(

The method to draw:

private void statusBar_DrawItem(object sender, 
  System.Windows.Forms.StatusBarDrawItemEventArgs sbdevent)
    if ( sbdevent.Panel == this.statusBarPanel1 )
        this.progressBar1.Bounds = sbdevent.Bounds;


  • 2003-09-25 1st Version



This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Shawn Cicoria
Web Developer
United States United States
I have over 15 years of experience in the Application Development. Unfortunately, I still remember punch cards from College and VisiCalc on the Apple II.

My recent experience (about 6 years) covers the 2 main camps in distributed computing: J2EE based and COM[+] / .NET.

Lately, it's been deep .NET, C#, ASP.NET and the rest of the .NET Framework.

I've been working on Internet related technologies since 1993, initially writing Perl scripts under the original NCSA Http server.

You may also be interested in...

Comments and Discussions

GeneralExcellent Job Pin
wakhtar6-Jan-10 10:38
memberwakhtar6-Jan-10 10:38 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.180515.1 | Last Updated 26 Sep 2003
Article Copyright 2003 by Shawn Cicoria
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid