Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

File Splitter Utility in C# - WinForms

0.00/5 (No votes)
25 Sep 2003 3  
Simple File Splitter / Joiner utility that demonstrates FCL and Winforms UI processing

Sample Image - FileSplitter.jpg

Introduction

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).

Background

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 Test.zip, the segments are called Test.zip.0, Test.zip.1, 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 ".

Controller

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 } ); }

MainForm

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(
    this.statusBar_DrawItem);        

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;
    }
} 

History

  • 2003-09-25 1st Version

 

License

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