function recurse(sfFilebasePluginFile $source, sfFilebaseDirectory $parent_dir, $file_mode)
 {
     try {
         foreach ($source as $file) {
             if ($file instanceof sfFilebasePluginDirectory) {
                 fwrite(STDOUT, sprintf("\n    Creating directory %s in %s\n", $source->getFilename(), $parent_dir->getFilename()));
                 $node = new sfFilebaseDirectory();
                 $hash = md5(uniqid(rand(), true));
                 $node->setHash($hash);
                 $node->setFilename($file->getFilename());
                 $node->save();
                 $node->getNode()->insertAsLastChildOf($parent_dir);
                 recurse($file, $node, $file_mode);
             } else {
                 fwrite(STDOUT, sprintf("\n    Copying %s to %s\n", $source->getPathname(), $parent_dir->getFilename()));
                 $copy = $file->copy($source->getFilebase()->getPathname(), true);
                 $hash = $hash = md5(uniqid(rand(), true)) . '.' . $copy->getExtension();
                 $node = new sfFilebaseFile();
                 $node->setFilename($copy->getFilename());
                 $node->setHash($hash);
                 $node->save();
                 $node->getNode()->insertAsLastChildOf($parent_dir);
                 $move = $copy->move($hash);
                 $move->chmod($file_mode);
             }
         }
     } catch (Exception $e) {
         throw new Exception((string) $e);
     }
 }
 /**
  * Returns the file's extension.
  * @param sfFilebasePluginFile | string $file extension
  * @return string $extension
  */
 public function getFileExtension($file)
 {
     $file = new sfFilebasePluginFile((string) $file, $this);
     $extension = pathinfo($file->getFilename(), PATHINFO_EXTENSION);
     if (!empty($extension)) {
         return $extension;
     }
     return null;
 }