Folder compare
Each side shows the name, size and modified time. The column in the middle shows the status. Sub-folders are scanned recursively, and folders that contain differences are expanded when the comparison opens. On Windows, names are matched without regard to case, so Readme.md pairs with README.md.
Statuses
| Mark | Status | Meaning |
|---|---|---|
| = | Same | Identical under the current compare mode. A folder is Same when everything inside it is. |
| ≠ | Different | The files differ, or the folder contains differences. |
| ◀ | Left only | Exists on the left side only. |
| ▶ | Right only | Exists on the right side only. |
| ⚠ | Type mismatch | A file on one side and a folder (or link) with the same name on the other. |
| ! | Error | Could not be read, for example because access was denied. Hover the mark for the reason. |
The status bar counts each status and shows the path and status of the selected row.
Compare modes
The drop-down in the toolbar sets how two files are judged equal:
| Mode | Two files are the same when | Command line |
|---|---|---|
| Compare contents | Every byte matches (default). Files of different size are known to differ without being read. | --compare=content |
| Size & date | Sizes match and modified times are within 2 seconds of each other. | --compare=size-mtime |
| Size only | Sizes match. | --compare=size |
Size & date and Size only are much faster on large trees, because no file contents are read.
Filters
The filter buttons choose which rows are shown. The counts in the status bar always cover the whole tree.
- All: every entry.
- Differences: everything that is not Same.
- Same: identical files only.
- Orphans: entries that exist on one side only.
Folders stay visible when something inside them matches the filter. Expand all and Collapse all open or close the whole tree.
Exclude patterns
Type patterns in the Exclude box, separated by ; (or ,), and press Enter. Matching files and folders are left out of the scan completely. On the command line, repeat --exclude once per pattern.
| Pattern | Matches |
|---|---|
* | Any run of characters within one name (does not cross /). |
? | Any single character except /. |
** | Anything, including /. **/ matches zero or more folders. |
[abc], [a-z], [!abc] | One character from the set or range, or not in it. |
A pattern without / | Matches the entry's name at any depth: node_modules, *.obj. |
A pattern with / | Matches the path from the compare root: build/out, /docs/*.pdf. A leading / is optional. |
A trailing / | Matches folders only: bin/. |
Backslashes count as path separators, so build\out works too. Matching ignores case on Windows.
.git; node_modules; bin/; obj/; *.user; **/generated/*.cs
Opening a file pair
Double-click a file row, select it and press Enter, or use the compare button in the toolbar. The pair opens in a new window, in the text or hex compare depending on the files, with the same ignore options. Files that exist on one side only cannot be opened as a pair. Double-clicking a folder expands or collapses it.
Use F7 and Shift+F7 to jump between differing rows (collapsed folders are expanded as needed), and the arrow keys to move through and open or close the tree. All keys are listed in Keyboard shortcuts.
Refresh (F5) scans again, and Swap sides exchanges left and right.
Top level only
Start with --no-recursive to compare only the top level. Sub-folders that exist on both sides are then listed as Same without being scanned.
Hex compare
Binary files open in the hex view automatically. Use --hex to force it for text files too. Each row shows the offset, 16 bytes in hex and the same bytes as ASCII. Differing bytes are highlighted in both panes, and the overview strip shows where the differences are.
- Byte for byte. Bytes are compared at the same offset in both files. An inserted byte is not realigned, so everything after it shows as different. Bytes past the end of the shorter file count as differences.
- Streaming. The comparison reads the files in chunks, and the view loads only the bytes on screen, so files of hundreds of megabytes open without being read into memory. Rows that are still loading show
ยทยท. - Very different files. The list of differing ranges stops after 100,000 ranges. The status bar then says list truncated.
The status bar shows the current range ("Difference 2 of 7"), the number of differing bytes, the offset of the first difference, both file sizes and the size difference.
Navigation
- F7 / Alt+↓ and Shift+F7 / Alt+↑ go to the next and previous differing range.
- Ctrl+Home and Ctrl+End go to the start and the end.
- F5 reloads both files; Swap sides exchanges them.
Go to offset
Press Ctrl+G (or click the box in the toolbar), type an offset and press Enter. The byte at that offset is marked. Spaces and underscores are ignored, so 0x1_0000 works.
| You type | Read as | Offset |
|---|---|---|
0x1F0 | Hex (0x prefix) | 496 |
1F0h | Hex (h suffix) | 496 |
$1F0 | Hex ($ prefix) | 496 |
1f0 | Hex, because it contains a letter a–f | 496 |
496 | Decimal | 496 |
#496 | Decimal (# prefix) | 496 |
Plain digits are always decimal: 10 means 10, not 16. An offset past the end of both files shows the end.
