Resource

Resource Basics

Resource Name Swap File Names
Resource Version 1.2
Category File System
Downloads 498
Release Date 1/10/2025 11:00:58 AM
 

Resource Details

Description This script will swap the file name from two selected thumbnails. The rename takes place on disk and in the catalog.
Installation Instructions n.a.
Usage Instructions In Photo Supreme:
1. Select two thumbs for which to swap the file name
2. Right click on a selected thumb
3. Select Run Script from Repository
4. Select File System -> Swap File Names
Changes in this version 1.2 Fix for missing parameter in RenameFile call
Special Requirements
 

Author Information

Author Name IDimager
 

Script

{
  This script takes two thumbnails as input and offers to
  swap the names of the files. The file extension is not
  changed, only the name, hence the script can be used with
  two files selected that have different extensions.
  Sidecar files will also be renamed.

  Eg. A.CR3 and B.JPG are selected, and the result will then be
      B.CR3 and A.JPG

  Initial date: 10 Jan 2025
  Initial Author: IDimager

  Current version     : 1.2
  Current version date: 29 apr 2025

  History:
  1.2   29 Apr 2025
        Fix for RenameFile parameter

  1.1   10 Jan 2025
        Fix when both files are in the same folder

  1.0   10 Jan 2025
        Initial version
}

  procedure HandleRename(AImg: TImageItem; ANewFileName: WideString);
  var
    ACatItem: TCatalogItem;
  begin
    if WideFileExists(ANewFileName) then
    begin
      Say('File ' + ANewFileName + ' already exists. Rename cannot take place.');
      exit;
    end;

    ACatItem := TCatalogItem.Create(nil);
      if not PublicCatalog.FindItemCombinedByGUID(AImg.GUID, ACatItem) then
        exit;
      if PublicCatalog.RenameItem(ACatItem, ANewFileName) then
      begin
        if not AImg.RenameFile(ANewFileName, AllIncludeSidecars) then
        begin
          Say('Could not rename the file on disk from ' + AImg.FileName + ' to ' + ANewFileName);
          exit;
        end;
      end
      else
      begin
        Say('Something went wrong while renaming ' + AImg.FileName + ' in the catalog');
        exit;
      end;
    ACatItem.Free;
  end;

  procedure SwapFileNames(AImg1, AImg2: TImageItem);
  var
    AFileName1, AFileName2: WideString;
    ANewFileName1, ANewFileName2: WideString;
    AIsSameFolder: Boolean;
    ATempFileName: WideString;
  begin
    AFileName1 := AImg1.FileName;
    AFileName2 := AImg2.FileName;

    if not WideFileExists(AFileName1) then
    begin
      Say('File ' + AFileName1 + ' can not be found on disk.');
      exit;
    end;

    if not WideFileExists(AFileName2) then
    begin
      Say('File ' + AFileName2 + ' can not be found on disk.');
      exit;
    end;

    ANewFileName1 := WideIncludeTrailingBackSlash(WideExtractFilePath(AFileName1)) +
                     WideChangeFileExt(WideExtractFileName(AFileName2), '') +
                     WideExtractFileExt(AFileName1);
    ANewFileName2 := WideIncludeTrailingBackSlash(WideExtractFilePath(AFileName2)) +
                     WideChangeFileExt(WideExtractFileName(AFileName1), '') +
                     WideExtractFileExt(AFileName2);

    if not AskYN(
              'Are you sure that you want to change file names:' +
              CrLfW + CrLfW +
              WideExtractFileName(AFileName1) + ' to ' + WideExtractFileName(ANewFileName1) +
              CrLfW + CrLfW +
              WideExtractFileName(AFileName2) + ' to ' + WideExtractFileName(ANewFileName2) +
              ''
       )
    then
      exit;

    AIsSameFolder := WideSameText(WideExtractFilePath(ANewFileName1), WideExtractFilePath(ANewFileName2));
    if AIsSameFolder then
    begin
      ATempFileName := WideIncludeTrailingBackslash(WideExtractFilePath(ANewFileName2)) +
                       '_temp_' + WideExtractFileName(ANewFileName2);
      HandleRename(AImg2, ATempFileName);
      AImg2.FileName := ATempFileName;
    end;

    HandleRename(AImg1, ANewFileName1);
    HandleRename(AImg2, ANewFileName2);

    //Say('done');
  end;

var
  AImg1, AImg2: TImageItem;
begin
  if Selected.Count <> 2 then
  begin
    Say('Please select exactly two thumbnails for which you would like to swap the file names.');
    exit;
  end;

  AImg1 := Selected.Items[0];
  AImg2 := Selected.Items[1];

  SwapFileNames(AImg1, AImg2);
end;