/**
  * Replace physical file.
  *
  * @param AssetFileModel $oldFile        The assetFileModel representing the original file.
  * @param AssetFileModel $replaceWith    The assetFileModel representing the new file.
  * @param string         $filenameToUse  The filename to use for the replaced file. If left
  *                                       empty, will use the name of the new file.
  *
  * @return null
  */
 public function replaceFile(AssetFileModel $oldFile, AssetFileModel $replaceWith, $filenameToUse = "")
 {
     if ($oldFile->kind == 'image') {
         craft()->assetTransforms->deleteAllTransformData($oldFile);
         $this->deleteSourceFile($oldFile->getFolder()->path . $oldFile->filename);
         $this->purgeCachedSourceFile($oldFile->getFolder(), $oldFile->filename);
         // For remote sources, fetch the source image and move it in the old ones place
         if (!$this->isSourceLocal()) {
             if ($replaceWith->kind == 'image') {
                 $localCopy = $replaceWith->getTransformSource();
                 IOHelper::copyFile($localCopy, craft()->path->getAssetsImageSourcePath() . $oldFile->id . '.' . IOHelper::getExtension($oldFile->filename));
             }
         }
     }
     $newFileName = !empty($filenameToUse) ? $filenameToUse : $oldFile->filename;
     $folder = craft()->assets->getFolderById($oldFile->folderId);
     $filenameChanges = StringHelper::toLowerCase($newFileName) != StringHelper::toLowerCase($replaceWith->filename);
     // If the filename does not change, this can trigger errors in some source types.
     if ($filenameChanges) {
         $this->moveSourceFile($replaceWith, $folder, $newFileName, true);
     }
     // Update file info
     $oldFile->width = $replaceWith->width;
     $oldFile->height = $replaceWith->height;
     $oldFile->size = $replaceWith->size;
     $oldFile->kind = $replaceWith->kind;
     $oldFile->dateModified = $replaceWith->dateModified;
     $oldFile->filename = $newFileName;
     if (empty($filenameToUse)) {
         $replaceWith->filename = $this->getNameReplacement($folder, $replaceWith->filename);
         craft()->assets->storeFile($replaceWith);
     } else {
         // If the file name has not changed, we're reusing the source file,
         // so we have to prevent deletion of source file here.
         craft()->assets->deleteFiles($replaceWith->id, $filenameChanges);
     }
     craft()->assets->storeFile($oldFile);
 }