Source to Destination File Compare?

I'm not sure if this is a feature request or if I am looking for the tool that is already there! I've recently been familiarizing myself with the Synchronize and Find Duplicates Features in Dopus and am wondering if there is a similar feature that pairs well with the Navigation Lock between Source and Destination folders.

I am looking for something that actively compares files from source to destination while Nav Lock is on and, say, highlights byte matching files as green, source unique files as blue, destination unique files as yellow. Or perhaps newer versions of files might be green, older might be red etc. synchronous file selections would be fantastic as well! (selecting on one side highlights matching files on the other)

I am often copying job files from Work to dropbox at beginning/end of day and have large projects with the same folder structure across two different locations. I am looking for a visually easier way to ensure I have moved the files I modified back. I know that the Synchronize function can do this on a large scale but am looking for a more granular approach, where I don't accidentally copy over or overwrite files unintentionally.

Is there such a tool out there already? Any advice is appreciated!

I have no ideas about color coding synchronization.

This code in a button labeled "Filter File Names Unique to Each File Display Toggle" might give some ideas of a direction to go:

@if:$glob:Unique
@set glob:Unique
Select NOPATTERN SHOWHIDDEN 
Set SOURCE=toggle
Select NOPATTERN SHOWHIDDEN
Set SOURCE=toggle

@if:else

Select DESTTOSOURCE=notin DESELECTNOMATCH
Select SOURCETODEST=notin DESELECTNOMATCH HIDEUNSEL=files
Select NOPATTERN HIDEUNSEL=files

@set glob:Unique=on

As far as I know there's no file bytes comparison, but there's a way to compare filenames, exactly the way you want, don't know if it would be useful to you

SOURCETODEST /O
(no value) Selects all files and folders in the destination file display that are currently selected in the source. The comparison is only done on the filename - the files are not actually compared.
Example: Select SOURCETODEST

I use a button which launches Beyond Compare on the source and destination folders to quickly compare contents when the built-in sync function isn’t enough.

There are a few buttons in the Buttons & Scripts area for integrating different Diff tools like Beyond Compare and WinMerge.

FYI: For complex needs and situations, Duplicate Cleaner Pro 5 (by Digital Volcano) finds duplicates as you specify, but there’s also a ‘show remaining’ option for listing the files that don’t have a duplicate–those that are different. Then you can move or copy those ‘remaining’ files.

I have used this many times for complex syncing.

Opus 13.18.7 and later give script columns expanded access to both the source and destination. This allows labels to be assigned according to Filter values, which are determined by the results returned from script columns.

The example below shows a script column that compares files in the source with those in the destination, returning either unique, same_name, or same_hash.

In Preferences / Labels / Label Assignments, these three filter labels can be configured to display as red, orange, or green, depending on the script column’s output.

script match DestDupeCheck/DestDupeCheck same_hash

script match DestDupeCheck/DestDupeCheck same_name

script match DestDupeCheck/DestDupeCheck unique

The script column can also be used in a Find filter. Note that the script looks for files directly in the destination and won't dive into subfolders, so be careful when checking Search subfolders.

Toggle the column (optionally) via

Set COLUMNSTOGGLE=scp:DestDupeCheck/DestDupeCheck

and the Label Filters via

Set ENABLELABELFILTER="57366 same_hash",toggle
Set ENABLELABELFILTER="57366 same_name",toggle
Set ENABLELABELFILTER="57366 unique",toggle
JScript
var err = 'error';
var sh = 'same_hash';
var sn = 'same_name';
var un = 'unique';

function OnInit(initData) {
    initData.name = 'DestDupeCheck';
    initData.version = '2025-10-14';
    initData.url = 'https://resource.dopus.com/t/source-to-destination-file-compare/57366/5';
    initData.default_enable = true;
    initData.min_version = '13.18.7';
}

function OnAddColumns(addColData) {
    var col = addColData.AddColumn();
    col.name = 'DestDupeCheck';
    col.method = 'OnColumn';
    col.justify = 'right';

    col.match.push_back(err);
    col.match.push_back(sh);
    col.match.push_back(sn);
    col.match.push_back(un);

    col.namerefresh = true;
    col.autorefresh = 2;
}

function OnColumn(scriptColData) {
    scriptColData.value = err;
    var item = scriptColData.item;

    var tab = scriptColData.tab;
    if (!tab) {
        // DOpus.Output('no tab:\t' + item);
        return;
    }

    if (!tab.path) {
        // DOpus.Output('no tab.path:\t' + item);
        return;
    }

    var dtab = tab.lister.desttab;

    if (!dtab) {
        // DOpus.Output('no dtab:\t' + item);
        return;
    }

    if (!dtab.path) {
        // DOpus.Output('no dtab.path:\t' + item);
        return;
    }

    var fsu = DOpus.FSUtil();

    var itemToCheck = fsu.GetItem(dtab.path + '\\' + item.name);

    var ret = fsu.Exists(itemToCheck) ? HasSameHash(item, itemToCheck) ? sh : sn : un;

    scriptColData.value = ret;
}

function HasSameHash(item, itemToCheck) {
    var size1 = String(item.size);
    var size2 = String(itemToCheck.size);

    if (size1 == '0' && size2 == '0') return true;

    if (size1 != size2) return false;

    var fsu = DOpus.FSUtil();
    var hash1 = fsu.Hash(item, 'md5');
    var hash2 = fsu.Hash(itemToCheck, 'md5');

    return hash1 == hash2;
}

Save ColumnnDestDupeCheck.js.txt to   

%appdata%\GPSoftware\Directory Opus\Script AddIns

How to use buttons and scripts from this forum

Wow, thank you for this excellent script and setup workflow @lxp! I am however having an issue with the ColumnnDestDupeCheck.js you provided.

It seems to always identify files in the destination lister as "same_hash". The Active lister identifies files correctly. Not sure what may be causing it to do this as your screenshot clearly shows it working.

I am using Dopus 13.19
See screenshot below where I replicated your example, top lister is the Active lister:

Edit:
After some experimenting - I believe there is nothing wrong with the script per se, but it is an issue with the destination tab not refreshing when the script is run or when folders change

Thank you Leo!

Missing or delayed refreshes/hash calculations (potentially caused by the cloud storage) are the only explanation I can think of at the moment. I haven't been able to reproduce it otherwise.

Try setting this to 1:

col.autorefresh = 2;