def _build_volume ( self, file_name ):
        """ Creates the image volume using the specified file name and the
            current user supplied information and input files.
        """
        # Set the current status:
        self.status = 'Saving to %s...' % file_name

        # Create an image volume to hold the information collected. Note that we
        # set a bogus time stamp to force the ImageLibrary to reload all of the
        # image information from the actual files so that we end up with the
        # correct image sizes:
        volume = ImageVolume(
            category   = self.category,
            keywords   = self.keywords,
            time_stamp = time_stamp_for( 0.0 ),
            info       = [ ImageVolumeInfo(
                               description = self.description,
                               copyright   = self.copyright,
                               license     = self.license ) ]
        )

        # Create an ImageInfo descriptor for each image file that will become
        # part of the volume:
        volume_name   = splitext( basename( file_name ) )[0]
        volume.images = [ ImageInfo(
                              name        = item.image_name,
                              image_name  = '@%s:%s' % ( volume_name,
                                                         item.image_name ),
                              description = self.image_description,
                              category    = self.image_category,
                              keywords    = self.image_keywords )
                          for item in self.build_files ]

        # Pre-compute the images code, because it can require a long time
        # to load all of the images so that we can determine their size, and we
        # don't want that time to interfere with the time stamp of the image
        # volume:
        images_code = volume.images_code

        # Create the new zip file:
        zf = ZipFile( file_name, 'w', ZIP_DEFLATED )

        # Assume that an error will occur:
        error = True
        fh    = None
        try:
            # Copy all of the image files from the file system to the new zip
            # file:
            for item in self.build_files:
                fh   = file( item.file_name, 'rb' )
                data = fh.read()
                fh.close()
                fh = None
                zf.writestr( item.image_name, data )

            # Write the volume manifest source code to the zip file:
            zf.writestr( 'image_volume.py', volume.image_volume_code )

            # Write the image info source code to the zip file:
            zf.writestr( 'image_info.py', images_code )

            # Done creating the new zip file:
            zf.close()
            zf = None

            # Add the new image volume to the image library:
            ImageLibrary.add_volume( file_name )

            # Now invoke the normal volume save so that it can add the correct
            # image info data and license file:
            volume = [ volume for volume in ImageLibrary.volumes
                       if volume.path == file_name ][0]
            volume.path     = file_name
            volume.zip_file = FastZipFile( path = file_name )

            volume.save()

            # Set the final status:
            self.status = '%s has been saved successfully.' % file_name

            # Indicate no errors occurred:
            error = False
        finally:
            if fh is not None:
                fh.close()

            if zf is not None:
                zf.close()

            if error:
                self.status = 'An error occurred trying to save %s.' % file_name
                remove( file_name )