The articles I've more recently submitted to CodeProject have been related to Windows' hooking and sub-classing and have reused a number of shared components.
These shared components also typically exist in a separate folder to the article project itself.
As a result, when I come to build the zip file containing the source, I have to build in files from two or more folders and ensure that files in those folders which are not relevant, are not included.
What this means in practice, is zipping the project folder and the shared folder in their entirety and then deleting from the zip, all the shared files which are not relevant.
Clearly, the risk of human error is fairly high and I often find myself doing a number of test zips and builds until I get it right. And then if I want to update the code later, as I generally do, I've got to do it all over again.
Enter ProjectZip, a Visual Studio add-in which provides tools to zip the active project and all its files to a single zip file. And all with a single button click.
The solution, in itself, is actually quite trivial; all the significant work was in developing the appropriate wrapper classes to Gilles Volant's Multi-File API built on top of the classic ZLib code base by Jean-loup Gailly and Mark Adler.
As a result, this article is not very long or detailed, but I hope that this is more than made up for, by the usefulness of the component.
The essence of the solution is this:
- When the user clicks to zip the project, the add-in first saves the current workspace and its contents.
- Then the path to the .dsp file is determined by querying the
IApplication object for the active project.
- The .dsp file is then parsed manually to build a file list (there seems to be no alternative to this and, although others have supplied code to do this, the format is really very simple so I parse it myself).
- Since the .dsp typically stores files as relative paths, I then convert the paths to full paths.
Then I parse the file list, iteratively building the longest path that is common to all files (what in the code I call the 'root path').
The point of establishing the root path is so that the zip file need only contain as much of a file's full path as is necessary to maintain the correct folder relationships when the zip is extracted at a later date.
- finally I create the zip file and then add each of the files in turn.
Because I found the writing of the add-in so straightforward, I began looking around for other related features that might be valuable.
And then it occurred to me that apart from zipping projects to send to CodeProject, I also regularly download and unzip projects before opening them in VC6.
So why not add this facility to the addin.
Again the implementation is fairly trivial since its just a case of unzipping the file to a user-specified location and then loading the appropriate .dsw or .dsp file.
In the case of multiple .dsw files (or multiple .dsp files when no .dsw is present), I show a simple dialog that allows the user to select which project file to open.
Other features include:
- Including the .dsw file
- Prompting before overwriting existing zip files or existing projects when unzipping
- Prompting to save the zip with an alternative name and/or location to the default (project_name.zip in the project folder)
- Opening the zip after zipping for verification
Using the add-in
To use the add-in, take the following steps:
- Close VC6 if its is open.
- Copy ProjectZip.dll to ..\Microsoft Visual Studio\Common\MSDev98\AddIns
- Restart VC6
- Select the 'Add-ins and Macro Files' tab from the 'Tools|Customize' dialog box.
- Select the checkbox next to the 'ProjectZip' entry.
- Switch to the 'Commands' tab on the same dialog and select 'Add-ins' from the 'Category' droplist.
- This will display the three ProjectZip toolbar buttons, which can be dragged and dropped onto any toolbar.
- Load a project and try it out!
The code is supplied here for you to use and abuse without restriction, except that you may not modify it and pass it off as your own.
- 1.6 (2 Apr 2004)
- option added to also zip 'non-essential' project files such as .clw, .ncb, .opt
- various bugs fixed relating to using the correct user preferences
- 1.4.1 (9 Mar 2004)
- code added to handle project file paths of the form ('\file.cpp') which are files in the root of the drive containing the proejct file (thanks to gjr)
- registry code fixed where direct registry access was failing (thanks to Peter Boulton)
- 1.4 (3 Mar 2004)
- option added to set zip filename to lowercase
- zip paths saved and restored to/from registry (keyed by workspace path)
- support added for workspaces with multiple projects
- File date/times correctly saved with the zip (thanks to IJamil)
- bug fix: correct workspace file picked
- bug fix: files with multiple '..\' handled correctly