Author Topic: 15.6 BETA  (Read 4384 times)

Mathias (Author)

  • Administrator
  • VIP Member
  • *****
  • Posts: 4718
    • View Profile
    • Multi Commander
15.6 BETA
« on: July 02, 2025, 14:44:23 »
  v15.6 *BETA*

 45+ Changes

  -- 3110 - ( 23-Jul-2025 )

  ADDED - New Virtual Filesystem extension "VFG" (Virtual Folder Group) - Group many folders to one virtual device.
          Still Experimental and missing things.
          Check forum for more information before using it

  ADDED - Language Editor can now generate a change report based on old language pack file.
  FIXED - FileOperationPlugin :ContentCopy - failed in some situations.
  FIXED - FileOperationPlugin :AutoSort - failed in some situations.
  FIXED - Backup of configuration missed some configuration files.   
  FIXED - 2 Stability issues

-- 3105 - 2025-07-02
  ADDED - Added text tool to Convert JSON file to compact / pretty format
  ADDED - MultiFileViewer can now show whitespaces
  ADDED - Copy file path to clipboard in Images Viewer (In right click popup menu)
  FIXED - Crash Issue after showing result from Picture action like Resize/Rotate/Convert.
  FIXED - TabSessionManager will now make sure menu system is loaded before loading the tab session. (Since this should be added to menu system)
  FIXED - Better error handling whern opening a 7Zip that is using unsupported compression method
  FIXED - FileOperations Result dialog for auto handled errors are changed a bit to better show result.
  FIXED - Change some dialogs to use Windows Built in TaskDialog instead of Emulated version.
  FIXED - 3 Stability issues



New / Changes Text Ids (for translators)

App - MultiCommander Core = D 3303,3304
App - MCPictureViewer = C 250,251,252
App - File Utils = M 2214 ,2215
App - File viewer = D 340, T 113





VFG - Virtual Folder Group
With VFG you can configuration can group 2 or more folders into a virtual folder that are accessed by VFG0: to VFG9:
What you see when you brose to the VFG0: is either the content of the folder that you configured as primary or an aggregation of all folders.
If it aggregate the contents it will not show duplicates.. If file 1.txt is located in folder1 and 2.txt is folder2  the VFG0: will show 1.txt and 2.txt

If you copy files FROM the VFG#: it will read the file from the Primary folder if the file is located there. else it will take the next one folder configured.
If you copy a file TO the VFG#: it will write the file to *ALL* locations that are configured as writeable.
If you delete a file it will be deleted from all locations in the group.

To configure it go to
Menu > Configuration > FileSystem Plugin Settings > "FS-Virtual Folder Groups"


Right now the error handling is not 100% correct.
So please report issues, when it fails, what you think is missing and so on. I really need you feedback if this is usable for you and want features around it you need.

If you show the shell context menu on a VFG item. YOu have a VFG submenu where you can see status and also sync file from primary to the other.

BTW.. VFG will also create its own Log Window so you can see exactly what it does..   Show log using Ctrl+L and there will popup a tab for the device when it is used




« Last Edit: July 23, 2025, 16:12:12 by Mathias (Author) »

Mathias (Author)

  • Administrator
  • VIP Member
  • *****
  • Posts: 4718
    • View Profile
    • Multi Commander
Re: 15.6 BETA
« Reply #1 on: July 23, 2025, 11:50:58 »
Image of VFG configuration

Ulfhednar

  • Contributor
  • VIP Member
  • *****
  • Posts: 542
    • View Profile
Re: 15.6 BETA
« Reply #2 on: July 29, 2025, 12:43:03 »
Thanks for the additional features Mathias.  8)

I think that the last update may have broken something in the MS execution. MC 15.6 b3110 x64 on Win11 24H2 b26100.4652
I get a ‘Cannot delete’ msg when attempting to delete or move files using my previously working scripts.
Stepping through in the debugger everything seems 100% until the delete command is reached, I tried with & without options & it always fails.
E.g.
Code: [Select]
@var $currentPath = GetSourcePath();
@var $Items = GetSourceItems(1);
@var $count = arrayCount($Items);
@var $curItem;
@var $fullFilename;
@var $array2[];

// Loop all items in the $Items array
for( $n = 0; $n < $count; $n++)
{
  $curItem = $Items[$n];
  $fullFilename = $currentPath ^ $curItem;
  @var $isMatch = StrIsRegExpMatchNoCase($fullFilename, "[a-z0-9]{30}");

  if($isMatch)
  {
      arrayAdd($array2, $curItem);
  }
}

@var $options[] = {"RECYCLE", "NODIALOG"};
DeleteFiles($array2, $options);
Breaks at last line with error msg (attached screenshot).

Any ideas?  Thanks!

Mathias (Author)

  • Administrator
  • VIP Member
  • *****
  • Posts: 4718
    • View Profile
    • Multi Commander
Re: 15.6 BETA
« Reply #3 on: July 29, 2025, 15:14:47 »
Thanks for the additional features Mathias.  8)

I think that the last update may have broken something in the MS execution. MC 15.6 b3110 x64 on Win11 24H2 b26100.4652
I get a ‘Cannot delete’ msg when attempting to delete or move files using my previously working scripts.
Stepping through in the debugger everything seems 100% until the delete command is reached, I tried with & without options & it always fails.
E.g.
Code: [Select]
@var $currentPath = GetSourcePath();
@var $Items = GetSourceItems(1);
@var $count = arrayCount($Items);
@var $curItem;
@var $fullFilename;
@var $array2[];

// Loop all items in the $Items array
for( $n = 0; $n < $count; $n++)
{
  $curItem = $Items[$n];
  $fullFilename = $currentPath ^ $curItem;
  @var $isMatch = StrIsRegExpMatchNoCase($fullFilename, "[a-z0-9]{30}");

  if($isMatch)
  {
      arrayAdd($array2, $curItem);
  }
}

@var $options[] = {"RECYCLE", "NODIALOG"};
DeleteFiles($array2, $options);
Breaks at last line with error msg (attached screenshot).

Any ideas?  Thanks!

Can you give me example on how filenames should be for the script to try to delete them ? so I can do some testing

Ulfhednar

  • Contributor
  • VIP Member
  • *****
  • Posts: 542
    • View Profile
Re: 15.6 BETA
« Reply #4 on: Yesterday at 12:30:00 »
Thanks for looking at this Mathias.
The names are 'random' so it can be things like:

  • 16591096719370948hik1082696166279904.txt
  • ak9735409sdf4059hfsifhisajxilh.JPG
  • lfgkfgkfkjkffkkkiiiiiiiyhhufyiffkkkyuasydq.png

The extension is unimportant as I don't specify that, just a long [a-z0-9] string.

In the case of rename & move it fails at the delete line also.  The file is renamed (I used Jungles name as folder script & a move command which did work perfectly up to now), but it doesn't move the file.
It displays a cannot copy msg when reaching this line:-
Code: [Select]
MoveFile( $targetPath, $sourceFile, "NODIALOG");
See attached.
I assume it is related to the delete op as that is where it halts & move requires deletion, but as you can see this msg is showing 'copy'.  Maybe the options segment e.g. as NODIALOG is a common element?
Hopefully you will be able to see why...

Full script is
Code: [Select]
Log( 1, 10, "Renaming files to %%parent_folder_name%%[_N].*" );

@var $src_path = GetSourcePath();
@var $arr = PathGetParts( $src_path );
@var $name = $arr[0];
@var $prefix = StrReplace( PathGetPathPart( $src_path, 1 ), $name, "" );

@var $n = StrRFind( $prefix, "\\" );

if ( $n > 0 )
{
  $prefix = StrSub( $prefix, $n + 1, StrLen( $prefix ) - $n - 1 );

  @var $i;
  @var $s;
  @var $file;
  @var $files;

  $arr = GetSourceSelectedPaths();

  for ( $i = 0; $i < arrayCount( $arr ); $i++ )
  {
    $file = $arr[$i];
    $s = PathGetFileExtPart( $file );
    $name = $prefix + "*" + $s;

    $files = FindFiles( $src_path + $name );
    $n = arrayCount( $files );

    if ( $n == 0 )
    {
      $s = "";
    }
    else
    {
      if ( $n == 1 )
      {
        $s = $files[0]; 
        RenameFile( $s, StrReplace( $name, "*", "_0" ), "RENAME_RO" );
      }

      $s = "_" + numtostr( $n );
    }           

    RenameFile( $file, StrReplace( $name, "*", $s ), "RENAME_RO" );
  }
}
else
{
  Log( 1, 10, "It seems parent folder is root. Renaming impossible." );
}

// move

@var $arr1 = GetSourceSelectedPaths();
@var $items1 = arrayCount($arr1);
@var $MoveNameFullPath;
@var $targetPath;
@var $sourceFile;
@var $n1 = 0;

for( $n1 = 0; $n1 < $items1; $n1++ )
{
  $MoveNameFullPath = $arr1[ $n1 ];
  $targetPath = GetTargetPath();
  $sourceFile = $MoveNameFullPath;
 
  MoveFile( $targetPath, $sourceFile, "NODIALOG");
 
}