Compare active tabs on both panels

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
    };
}
3 Likes

Is it possibl to compare files bases on size? Both source and destination have same files with same name but with different size. I want to select file in destination having less size compare to source.

1 Like

Hi @priovo, welcome to the community. For more specific comparisons, try using Aprol's script

1 Like