tagflow - taguer un document




Comment créer un fichier sparse par programmation, en C, sur Mac OS X? (5)

Si vous voulez la portabilité, le dernier recours consiste à écrire votre propre fonction d'accès afin de gérer un index et un ensemble de blocs.

En substance, vous gérez un seul fichier car le système d'exploitation gère le disque en conservant la chaîne des blocs qui font partie du fichier, le bitmap des blocs alloués / libres, etc.

Bien sûr, cela conduira à un accès non optimisé et plus lent, je ne recommanderais cette approche que si l'exigence d'économiser de l'espace est absolument critique et que vous avez assez de temps pour écrire un ensemble robuste de fonctions d'accès.

Et même dans ce cas, je voudrais d'abord examiner si votre problème a besoin d'une solution différente. Vous devriez probablement stocker vos données différemment?

Je voudrais créer un fichier sparse de sorte que les blocs tout-zéro ne prennent pas d'espace disque réel jusqu'à ce que je leur écrive des données. C'est possible?


hdiutil peut gérer des images et des fichiers fragmentés, mais malheureusement le framework avec lequel il est lié est privé.

Vous pouvez essayer de définir des symboles externes tels que définis par le framework DiskImages ci-dessous, mais ce n'est probablement pas acceptable pour le code de production. De plus, comme le framework est privé, vous devez effectuer une reverse engineering de ses cas d'utilisation.

cristi: ~ diciu $ otool -L / usr / bin / hdiutil

/ usr / bin / hdiutil: /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages (version de compatibilité 1.0.8, version actuelle 194.0.0) [..]

cristi: ~ diciu $ nm /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages | awk -F '' '{print $ 3}' | c ++ filt | grep -i sparse

[..]

CSparseFile :: sector2Band (long long)

CSparseFile :: addIndexNode ()

CSparseFile :: readIndexNode (long long, SparseFileIndexNode *)

CSparseFile :: readHeaderNode (CBackingStore *, SparseFileHeaderNode *, unsigned long)

[... couper pour la brièveté]

Plus tard Modifier

Vous pouvez utiliser hdiutil comme un processus externe et lui faire créer une image de disque clairsemée pour vous. À partir du processus C, vous créez ensuite un fichier dans l'image de disque fragmentée (montée).


Si vous cherchez (fseek, ftruncate, ...) à dépasser la fin, la taille du fichier sera augmentée sans affecter de blocs jusqu'à ce que vous écriviez dans les trous. Mais il n'y a aucun moyen de créer un fichier magique qui convertit automatiquement les blocs de zéros en trous. Vous devez le faire vous-même.

Cela peut être utile à regarder (la commande OpenBSD cp insère des trous au lieu d'écrire des zéros). pièce



Comme dans les autres Unix, c'est une fonctionnalité du système de fichiers. Soit le système de fichiers le prend en charge pour TOUS les fichiers, soit il ne le fait pas. Contrairement à Win32, vous n'avez rien à faire de spécial pour y arriver. Contrairement à Win32, il n'y a pas de pénalité de performance pour l'utilisation d'un fichier fragmenté.

Sur MacOS, le système de fichiers par défaut est HFS + qui ne prend pas en charge les fichiers fragmentés.

Mise à jour: MacOS utilisé pour prendre en charge les volumes UFS avec un support de fichier fragmenté, mais cela a été supprimé. Aucun des systèmes de fichiers actuellement pris en charge ne prend en charge les fichiers fragmentés.





filesystems