Learning & reference

File systems, explained for QA & developers

A file system decides how bytes become named files — and every one has different rules for size, names, case and permissions. Those differences are where cross-platform bugs live. Here's what each one actually does, and the traps to test for.

What a file system actually does

Below the folder view, the file system is the bookkeeping layer between raw disk blocks and the files you see. Four jobs matter most for testing:

🏷️

Naming & directories

Maps human names to data, defines legal characters, case rules, max name/path length and how folders nest.

📇

Metadata

Size, timestamps, owner, and extras like NTFS alternate data streams or macOS resource forks / extended attributes.

🔑

Permissions

Who can read/write/execute — POSIX rwx bits, or richer Access Control Lists (ACLs) on NTFS/APFS.

🛡️

Integrity

Journaling or copy-on-write so a crash mid-write doesn't corrupt the volume; checksums on modern systems.

Local file systems, side by side

The disk formats on laptops, servers, USB sticks and SD cards. Scroll sideways on a phone.

File system Native to Max file size Case Permissions Journaling Watch out for
NTFSWindows Windows (2000+) ≈16 TB (up to 8 PB) insensitive
preserves case
ACLs Yes Alternate data streams; reserved names (CON); 260-char legacy path cap
APFSmacOS / iOS macOS 10.13+ (2017) 8 EB insensitive
case-sensitive variant
POSIX + ACLs Copy-on-write Stores names as Unicode NFD; snapshots & clones look like copies but share blocks
ext4Linux Linux (default) 16 TB sensitive POSIX Yes File.txt and file.txt coexist — breaks when synced to Windows/Mac
exFATremovable USB / SD cards 16 EB insensitive none No No permissions or journaling — fine for big files across OSes, risky for live data
FAT32universal Everything (legacy) 4 GB insensitive none No A single file can't reach 4 GB; volume capped ~2 TB — the classic "file too large" copy error
HFS+old macOS macOS pre-2017 8 EB insensitive
HFSX is sensitive
POSIX + ACLs Yes Superseded by APFS; still seen on old drives & Time Machine disks
🪟

NTFSNew Technology File System

Windows' default since Windows 2000. Rich ACL permissions, journaling, compression, encryption (EFS) and alternate data streams (hidden data attached to a file).

QA trap: ADS means a file can carry hidden content your size/hash checks miss (file.txt:secret). Downloads get a Zone.Identifier stream that triggers the "file from the internet" block.

🍎

APFSApple File System

Default on modern Macs, iPhones and iPads. Copy-on-write, instant snapshots, space-sharing containers, and cheap file clones that share blocks until edited.

QA trap: stores filenames in Unicode NFD — a name typed as NFC on Windows won't byte-match, so "file not found" for a name you can clearly see.

🐧

ext4Fourth Extended File System

The Linux workhorse. POSIX permissions, journaling, extents, and the fewest surprises — it stores names as raw bytes and is fully case-sensitive.

QA trap: case sensitivity is the big one — a repo with README.md and Readme.md is valid on Linux but silently merges to one file on Windows/Mac.

💾

exFAT & FAT32Removable / interchange

The formats on USB drives and SD cards. No permissions, no journaling — maximum compatibility, minimum safety. exFAT lifts FAT32's limits.

QA trap: FAT32 rejects any single file ≥ 4 GB. A 4 GB video or backup that copies fine to NTFS/APFS fails on a FAT32 stick with a confusing error — always test this path.

POSIX — a standard, not a file system

People say "a POSIX file system", but POSIX is a specification: the rules an operating system follows for files, paths and permissions. It's why Linux and macOS feel alike — and why Windows doesn't.

📜

What POSIX defines

POSIX (Portable Operating System Interface) standardises the file API so the same program works across Unix-like systems. For files it pins down: a single /-rooted tree with / as the only separator; case-sensitive byte-string names (anything except / and NUL); the rwx owner/group/other permission model; and semantics like being able to delete or rename a file that's still open.

Why it matters: Windows is not POSIX — it uses \, is case-insensitive, blocks : * ? " < > | and reserved names, and locks open files. Most "works on my Mac/Linux, breaks on Windows" bugs are really POSIX-vs-Windows differences. See the filename compatibility matrix for the full list.

Network & shared storage

Beyond the local disk, files are also served over the network. These are protocols and devices, not disk formats — but they add their own rules on top of whatever file system sits underneath.

Protocol

SMB / CIFS

Windows-native file sharing — mapped drives like \\server\share. Also spoken by macOS and by Linux via Samba. Carries Windows-style rules (case-insensitive, reserved names) plus file locking.

Protocol

NFS

Network File System — the Unix/Linux way to mount a remote directory as if it were local. POSIX semantics, case-sensitive, with uid/gid-based permissions that must map correctly between client and server.

Device

NAS

Network-Attached Storage — an appliance full of disks that serves files to everyone on the network over SMB and/or NFS. It isn't a file system itself; internally it runs ext4, Btrfs or ZFS and exposes shares.

Device

SAN

Storage-Area Network — serves raw block storage (like a bare disk) over a fast network. The client formats it with its own file system. Contrast with NAS, which serves ready-made files.

Service

Object storage (S3 / R2)

Not a file system — a flat key→object store over HTTP. No real folders (just / in key names), no rename, no partial in-place writes. This very site is served from it.

Protocol

AFP

Apple Filing Protocol — the legacy Mac sharing protocol, now deprecated in favour of SMB. You'll still meet it on old NAS boxes and Time Machine setups.

⚠️

What changes when storage goes over the network

Locking is advisory and protocol-specific, so two clients can clobber each other's writes. Latency turns fast local operations into timeouts and partial writes. Case & Unicode rules follow the underlying file system, so a Linux NFS export can hold names a Windows SMB client can't open. Permissions mean different things (NFS uid/gid vs SMB ACLs) and often need mapping.

QA trap: test the same upload/download flow against a network share, not just a local disk — path length, locking, interrupted transfers and permission mapping all behave differently.

Prove your app handles the differences

Every quirk above has a matching test file — an empty file, a 4 GB+ file, case-colliding names, NFC vs NFD Unicode, reserved names and more.

→ Browse the test files Filename compatibility →