Wo ist eigentlich das Problem?
Eine Sprase-Datei ist eine Datei mit "Lücken", also wo es Bereiche gibt, denen kein Speicherplatz zugewiesen ist.
Und ja, mit FILE_ATTRIBUTE_SPARSE_FILE kann man Dateien darauf prüfen.
TSearchRec.FindData.dwFileAttributes oder TSearchRec.Attr, wobei es egal ist, ob mit FILE_ATTRIBUTE_SPARSE_FILE oder durch ein selbstdefiniertes
const faSparseFile = $00000200;
.
Wenn beim Kopieren das Zielsystem kein Sparse kann, dann wird das einfach ersetzt,
genauso, wie alle Programme "transparent" drauf zugreifen können.
Wenn irgendjemand einen ausgelassenen Bereich lesen will, dann wird das vom Windows durch viele Nullen (#0) ersetzt.
Programme, welche beim Lesen mit SparseFiles umgehen können, überspringen dagegen solche Bereiche und versuchen garnicht sie zu lesen, weil sie ja wissen, dass dort nicht ist.
Und du hast überall im System SparseFiles.
z.B. die NTFS-Komprimierung nutzt das.
Diese Dateien werden Blockweise komprimiert (z.B. je 64KB), aber Blöcke bleiben "logisch" an ihrem Platz, wobei die ungenutzten Bereiche (Blockgröße-KomprimierteBlockgröße) als Sparse physisch von der Platte entfernt werden.
So kann in der Datei rumgeschrieben werden, ohne dass nachfolgende Blöcke verschoben werden müssen, auch wenn sich die komprimierten Blocklängen ändern.
Das ist auch der Grund, warum es auf Dateisystemen mit zu großen Clustern keine Kompression gibt, da dort durch Sparse keiner oder nicht genügend Speicher eingespart/ausgeschnitten werden kann.
https://blogs.msdn.microsoft.com/ntd...s-compression/