The following scripts, inspired by @aprold's (link), compare the active tabs of both panels:
- Folders: Name, size, and number of files and subfolders (recursive).
- Files: Name, size, and modification date.
The first script selects different files and folders, and the second selects identical files and folders. The scripts are of the Functions type, so just create a button, select "Script" mode, and paste the code into it.
Thanks to @errante for his help!
Select different files and folders
function OnClick(clickData) {
var srcTab = clickData.func.sourcetab;
var dstTab = clickData.func.desttab;
var cmd = clickData.func.command;
var srcItems = {}; // Elementos (archivos y carpetas) únicos en el panel izquierdo
var dstItems = {}; // Elementos (archivos y carpetas) únicos en el panel derecho
var commonKeys = {}; // Elementos comunes
// Recopilar informaciones de elementos en el panel izquierdo
var srcEnum = new Enumerator(srcTab.all);
while (!srcEnum.atEnd()) {
var item = srcEnum.item();
var key;
if (item.is_dir) {
var stats = GetFolderStats(item);
// Si carpetas: nombre, tamano, y número de archivos y subcarpetas
key = "DIR|" + item.name + "|" + stats.size + "|" + stats.files + "|" + stats.subdirs;
} else {
// Si archivo: nombre, tamano y fecha de modificación
key = "FILE|" + item.name + "|" + item.size + "|" + item.modify;
}
srcItems[key] = item;
srcEnum.moveNext();
}
// Comparar con elementos del panel derecho
var dstEnum = new Enumerator(dstTab.all);
while (!dstEnum.atEnd()) {
var item = dstEnum.item();
var key;
if (item.is_dir) {
var stats = GetFolderStats(item);
// Si carpetas: nombre, tamaño, y número de archivos y subcarpetas
key = "DIR|" + item.name + "|" + stats.size + "|" + stats.files + "|" + stats.subdirs;
} else {
// Si archivo: nombre, tamano y fecha de modificación
key = "FILE|" + item.name + "|" + item.size + "|" + item.modify;
}
// Si existe en los dos paneles, y iguales
if (key in srcItems) {
commonKeys[key] = true;
// Eliminarlo de la lista únicos (panel izquierdo)
delete srcItems[key];
} else {
// Si no, el elemento es único en el panel derecho
dstItems[key] = item;
}
dstEnum.moveNext(); // Pasar al siguiente elemento del panel derecho
}
// Seleccionar elementos únicos en el panel izquierdo
cmd.deselect = false;
cmd.SetSourceTab(srcTab);
cmd.ClearFiles();
for (var key in srcItems) {
cmd.AddFile(srcItems[key]);
}
cmd.RunCommand("Select FROMSCRIPT DESELECTNOMATCH");
// Seleccionar elementos únicos en el panel derecho
cmd.SetSourceTab(dstTab);
cmd.ClearFiles();
for (var key in dstItems) {
cmd.AddFile(dstItems[key]);
}
cmd.RunCommand("Select FROMSCRIPT DESELECTNOMATCH");
}
// Obtener tamaño, y número de archivos y carpetas de forma recursiva
function GetFolderStats(item) {
var fsu = DOpus.FSUtil;
var folderEnum = fsu.ReadDir(item, "r"); // Recursivo
var totalSize = 0;
var fileCount = 0;
var folderCount = 0;
while (!folderEnum.complete) {
var entry = folderEnum.next;
if (entry.is_dir) {
folderCount++;
} else {
fileCount++;
totalSize += entry.size;
}
}
return {
size: totalSize,
files: fileCount,
subdirs: folderCount
};
}
Select equal files and folders
function OnClick(clickData) {
var srcTab = clickData.func.sourcetab;
var dstTab = clickData.func.desttab;
var cmd = clickData.func.command;
var srcItems = {}; // Elementos (archivos y carpetas) en el panel izquierdo
var commonSrcItems = {}; // Elementos del panel izquierdo, iguales a los del panel derecho
var commonDstItems = {}; // Elementos del panel derecho, iguales a los del panel izquierdo
// Recopilar informaciones de elementos en el panel izquierdo
var srcEnum = new Enumerator(srcTab.all);
while (!srcEnum.atEnd()) {
var item = srcEnum.item();
var key;
if (item.is_dir) {
var stats = GetFolderStats(item);
// Si carpetas: nombre, tamano, y número de archivos y subcarpetas
key = "DIR|" + item.name + "|" + stats.size + "|" + stats.files + "|" + stats.subdirs;
} else {
// Si archivo: nombre, tamano y fecha de modificación
key = "FILE|" + item.name + "|" + item.size + "|" + item.modify;
}
srcItems[key] = item;
srcEnum.moveNext();
}
// Comparar con elementos del panel derecho
var dstEnum = new Enumerator(dstTab.all);
while (!dstEnum.atEnd()) {
var item = dstEnum.item();
var key;
if (item.is_dir) {
var stats = GetFolderStats(item);
// Si carpetas: nombre, tamaño, y número de archivos y subcarpetas
key = "DIR|" + item.name + "|" + stats.size + "|" + stats.files + "|" + stats.subdirs;
} else {
// Si archivo: nombre, tamano y fecha de modificación
key = "FILE|" + item.name + "|" + item.size + "|" + item.modify;
}
// Si existe en los dos paneles, y iguales
if (key in srcItems) {
commonSrcItems[key] = srcItems[key]; // Guardarlo como elemento común izquierdo
commonDstItems[key] = item; // Guardarlo como elemento común derecho
}
dstEnum.moveNext(); // Pasar al siguiente elemento del panel derecho
}
// Seleccionar elementos comunes en el panel izquierdo
cmd.deselect = false;
cmd.SetSourceTab(srcTab);
cmd.ClearFiles();
for (var key in commonSrcItems) {
cmd.AddFile(commonSrcItems[key]);
}
cmd.RunCommand("Select FROMSCRIPT DESELECTNOMATCH");
// Seleccionar elementos comunes en el panel derecho
cmd.SetSourceTab(dstTab);
cmd.ClearFiles();
for (var key in commonDstItems) {
cmd.AddFile(commonDstItems[key]);
}
cmd.RunCommand("Select FROMSCRIPT DESELECTNOMATCH");
}
// Obtener tamaño, y número de archivos y carpetas de forma recursiva
function GetFolderStats(item) {
var fsu = DOpus.FSUtil;
var folderEnum = fsu.ReadDir(item, "r"); // Recursivo
var totalSize = 0;
var fileCount = 0;
var folderCount = 0;
while (!folderEnum.complete) {
var entry = folderEnum.next;
if (entry.is_dir) {
folderCount++;
} else {
fileCount++;
totalSize += entry.size;
}
}
return {
size: totalSize,
files: fileCount,
subdirs: folderCount
};
}