Before you format the card

Did the photos actually copy before I format?

Short answer: a finished progress bar is not proof, and neither is a matching file count or a matching folder size. The only thing that proves a copy is a copy is comparing the contents of the files.

You can do that for free, today, with a tool already built into Windows. No download and no purchase. The walkthrough is further down this page, and it works whether or not you ever use anything of ours.

Formatting a card is irreversible in a way almost nothing else in this workflow is. Ten minutes of checking is cheap against that.

Why a finished copy can still be incomplete

Most copies succeed. That's exactly what makes the failures dangerous — you stop expecting them, and the ones that do happen tend to be quiet.

Here is what actually goes wrong, in rough order of how often photographers hit it:

Two cameras wrote the same filename

This is the big one, and it has nothing to do with faulty hardware. Cameras number files sequentially and reset those counters. Two bodies at the same event will both happily produce DSC_0001, IMG_0047, GX010023. Copy both cards into one folder and Windows asks whether to replace, skip, or keep both. Click the wrong button once, at the end of a fourteen-hour day, and you have silently overwritten one camera's frames with another's. The copy reports success because, from the operating system's point of view, it was a success.

The transfer was interrupted

A reader that loses contact, a laptop that sleeps, a cable nudged with a knee. Depending on where it stopped, you can be left with a file that has the right name and a partial body. It appears in the folder listing. It opens as a thumbnail. It is not the whole photograph.

Something was skipped and you didn't see it

Windows sometimes reports skipped items in a collapsed summary you have to expand. A permissions issue, a filename length problem, a locked file, a subfolder that wasn't included in the drag. The dialog closes and the count of what didn't make it goes with it.

The card itself is starting to fail

Flash memory wears out. A card near end of life can return read errors on specific files while the rest of it behaves perfectly. Some copy tools stop, some skip, some copy whatever they got.

None of these are common. All of them are silent. And formatting is the one action in this workflow with no undo.

Why file count doesn't prove it

Counting files on the card and counting files in the archive folder feels like verification. It is a useful smoke test and nothing more.

The filename collision case defeats it directly: if two cameras produced twelve colliding names and you chose "replace" for all of them, your archive is short twelve photographs — but it is also short twelve files, so the count simply looks different and you may well assume you miscounted a card.

Worse, counts can match while contents don't. Cameras write companion files: .THM thumbnails, .LRV low-resolution proxies, .XMP sidecars, GoPro's separate .WAV audio. Between a card and an organised event folder, those get added, dropped and reorganised constantly. Two numbers landing on the same total tells you the totals match. It tells you nothing about which files.

Why total size doesn't prove it either

Comparing folder sizes is a better smoke test than counting, because a truncated file usually does change the total. But it still isn't proof, for two reasons.

First, Windows reports two different numbers — "Size" and "Size on disk" — and the second depends on the cluster size of the filesystem, which differs between a card formatted exFAT and an archive drive formatted NTFS. The same files will legitimately report different totals on the two volumes. People see the mismatch, decide it's a formatting artefact, and stop looking. Sometimes they're right.

Second, and more importantly: size is an aggregate. It can only ever tell you that something, somewhere, is different. It cannot tell you which file, and it cannot rule out the case where one file grew and another shrank.

Why matching filenames prove the least of all

Of the three, this is the one that actively causes damage rather than merely failing to prevent it.

We know because we built it that way first. The earliest version of what became DuplicateFinder Pro matched files by name. Run against one real event folder, that approach produced 349 false positives — files it confidently called duplicates that were nothing of the kind, just similarly numbered frames from different moments of a ceremony. Acting on that output would have meant deleting irreplaceable footage of a baptism because two cameras happened to share a naming convention.

The failure runs in both directions. Identical names on non-identical files, and identical files under different names — the same photograph exported twice, or copied into an organised folder and renamed on the way in. A name is a label a human or a camera attached to a file. It carries no information about what is inside.

Filenames lie. Content doesn't.

What actually proves it: comparing contents

The only verification that means anything is reading both files and confirming they are byte-for-byte identical. In practice you don't compare the files directly — you compute a hash of each one.

A hash function reads every byte of a file and produces a short fixed-length fingerprint. Change a single bit anywhere and the fingerprint changes completely. Two files with the same SHA-256 hash are, for every practical purpose, the same file — regardless of what they're named, where they live, or when they were written.

So the question "did every photo on this card make it into my archive?" becomes a question you can actually answer: is every hash from the card present somewhere in the archive?

How to check it yourself, free

Windows has had this built in since PowerShell 4. You don't need to install anything, and you don't need our software.

Open PowerShell (press Start, type powershell, press Enter) and paste the following, changing the two paths to your card and your archive folder:

$card    = Get-ChildItem -Path 'E:\DCIM' -Recurse -File | Get-FileHash
$archive = Get-ChildItem -Path 'D:\Events\Smith Wedding' -Recurse -File | Get-FileHash

$archiveHashes = $archive.Hash
$missing = $card | Where-Object { $archiveHashes -notcontains $_.Hash }

"Files on card:      " + $card.Count
"Not found in archive: " + $missing.Count
$missing | Select-Object Path

If the second number is 0, every single file on that card exists somewhere inside your archive folder, verified by content. Names don't matter. Folder structure doesn't matter. You are safe to format.

If it isn't zero, the last line prints exactly which files are missing, and you can go look at them before doing anything irreversible.

What to expect when you run it

  • It reads every byte of both locations, so it is not instant. A 128 GB card over USB 3 typically takes fifteen to thirty minutes. A multi-terabyte archive takes hours.
  • It checks one direction only — card into archive — which is the correct direction for this question.
  • It will report zero even if the archive also contains a thousand other files. That's the point.

Going forward, verify during the copy

Checking after the fact is the right move when the copy already happened. For future card dumps, a copy tool that verifies as it writes removes the question entirely. TeraCopy is free for personal use and does exactly this. It is not our software and we get nothing if you use it.

Where the free method runs out

The PowerShell approach above genuinely answers the question on this page. It stops being practical in three situations, and it's worth being clear about which.

It handles this fine

  • One card against one event folder
  • A yes-or-no answer before formatting
  • Anything you can leave running while you eat
  • Occasional checks, a few times a month

It struggles with this

  • Comparing two whole drives, where it will read every byte with no early exit
  • An interrupted run, which starts over from nothing
  • Deciding which of several copies to keep and removing the rest
  • Matching a RAW to its exported JPG, which are not byte-identical

That second column is the gap. Hashing every file on two multi-terabyte drives is enormously wasteful, because most files can be ruled out without reading them at all — anything with a unique size cannot possibly have a match.

What DuplicateFinder Pro does about it

It runs the same content comparison, in three stages, cheapest first.

  1. SizeFiles of different sizes cannot be identical, so they are never read. This eliminates the overwhelming majority of an archive before a single byte of content is touched.
  2. Partial fingerprintThe first and last megabyte of each surviving file are hashed. Anything differing near its head or tail is separated out without reading the middle.
  3. Full MD5 of the whole fileOnly what remains is read end to end. Nothing is ever reported as a duplicate on a size or fingerprint match alone.

That ladder is why a multi-terabyte comparison finishes at all. Scans checkpoint at phase boundaries, so an interrupted run resumes instead of restarting. And nothing is deleted: flagged files move to a quarantine folder on the same drive with a 24-hour hold and one-click restore to their exact original path.

Scanning and the full reports are free and require no account. You can point it at a card and an event folder, get the same answer this page describes, and never pay anything. A licence is only needed to move files into quarantine.

Windows 10 and 11. RAF, CR3, CR2, NEF, ARW, DNG, JPG, MOV, MP4 and GoPro WAV.

Related questions

Is it safe to format the card in the camera rather than in Windows?

Formatting in the camera is generally the better habit, because it writes the folder structure the camera expects. But that's a separate question from whether your photos are safe. Verify first, then format wherever you prefer.

Do I need to verify if I copied to two drives?

Two copies is meaningfully safer than one, and it protects you against a drive failing later. It does not protect you against a copy that was incomplete in the same way twice, which is exactly what happens with a filename collision or a card that is failing to read a particular file.

Why SHA-256 in the PowerShell example and MD5 in the application?

SHA-256 is the default for Windows' built-in command, so the example uses it without needing an extra argument. MD5 is faster and is the right trade for scanning terabytes, where the concern is accidental corruption rather than someone deliberately constructing a collision.

Can I check a folder against a whole drive instead of a card?

Yes. The method is identical — the two paths are just folders, and either one can be a drive root. Be aware that hashing an entire drive with the PowerShell approach reads every byte of it, which is where a staged comparison becomes worth having.

What if a file is missing from the archive but I already formatted the card?

Stop writing to the card immediately and look into photo recovery software. Deleted data usually remains on the card until it is overwritten, so the sooner you stop using it, the better your odds. That is a different kind of tool than this one, and we don't make it.