Can I Format?

Home Source Download

Docs

Under the hood

How matching works

Cameras reuse filenames. Every card eventually has an IMG_0001, and imports often rename files, convert them to DNG, or both. So no single clue is trusted. The cheapest checks run first, and files are only read when there's real doubt:

Match levelWhat it comparesWhat it handles
probableSame filename and sizeThe usual unchanged import
strongSame capture time and cameraRenamed files, RAW converted to DNG
strongMatching samples of the file contentsTwo different photos with the same filename
exactFull content hashEverything, but it has to read every byte

Capture time and camera are the most important. A card's IMG_0001.JPG and a library's 20240615_0001.dng have different names, extensions and sizes. What they share is the second they were taken and the camera that took them. It also reads Lightroom's original filename and DNG's original raw filename, so a renamed import can still be found by its old name.

A filename and size match alone isn't trusted if the capture times disagree. If two shoots both produced an IMG_0001 of the same size, the capture time decides.

It never guesses. Each check asks the index a direct question that has a definite yes or no answer, no matter how many other files share the same name or size. If a file can't be confirmed, it counts as missing.

Large libraries

Indexing a folder library doesn't open any files. It only reads file names and sizes, so even a library with a million files is limited by how fast the disk can list them, not by reading images. Folders that haven't changed are skipped when you re-index.

Capture times are read only when they're needed and are saved for later. A check only reads capture times for library files that could match something on the card.

There's one exception. If a library renames files on import, nothing on the card points to the right file, so the app has to read capture times for the rest of that library. It does this once, tells you, and saves the results so later checks don't need to. Calling those files missing instead would be the dangerous kind of mistake.

To do that work up front instead, set the library's "metadata" to "full" in the config file. Capture times are then read when the library is indexed.

Where things are stored

Settings %APPDATA%\can-i-format\config.json on Windows, ~/Library/Application Support/can-i-format/ on macOS, $XDG_CONFIG_HOME/can-i-format/ on Linux
Indexindex.db, in the same folder as the settings
Previewscache/thumbs, in the same folder
Windowwindow.json, in the same folder (desktop app only)

Set CAN_I_FORMAT_HOME to store all of these somewhere else. The settings file is plain JSON, so you can edit it by hand.

Known limits

  • Re-indexing only re-reads folders that have changed. A file edited in place, without changing its size or its folder, can be missed.
  • Video capture times are read as UTC. Matching isn't affected, because both sides are read the same way, but the time shown may differ from your video editor's.
  • Lightroom catalogs are read as of their last save. After importing in Lightroom, let it save before you check a card.