2010-05-19 7 views
4

J'ai été chargé d'écrire un programme de collecte de données pour un Unitech HT630, qui exécute un système d'exploitation DOS propriétaire qui peut exécuter des exécutables compilés pour MS DOS 16 bits avec certaines restrictions. J'utilise le compilateur Digital Mars C/C++, qui fonctionne bien jusqu'ici. L'une des exigences de l'application est que le fichier de données doit être en texte brut lisible par l'utilisateur, ce qui signifie que le fichier peut être importé dans Excel ou ouvert par le Bloc-notes. J'utilise un format d'enregistrement de longueur variable semblable au format CSV que j'ai implémenté avec succès en utilisant les fonctions d'E/S du fichier de bibliothèque standard C.Réduire ou tronquer partiellement un fichier sous DOS/FAT

Lors de l'enregistrement d'un enregistrement, je dois calculer si l'enregistrement mis à jour est plus grand ou plus petit que la version de l'enregistrement actuellement dans le fichier de données. Si elle est plus grande, je déplace d'abord tous les enregistrements immédiatement après l'enregistrement en cours par la différence de taille calculée avant de sauvegarder l'enregistrement mis à jour. EOF est automatiquement étendu par le système d'exploitation pour prendre en charge les données supplémentaires. Si elle est plus petite, je déplace tous les enregistrements vers l'arrière en fonction de mon décalage calculé. Cela fonctionne bien, mais je n'ai trouvé aucun moyen de modifier le marqueur EOF ou la taille du fichier pour ignorer les données après la fin du dernier enregistrement.

La plupart du temps, les enregistrements vont grossir, car le programme de collecte de données remplira certains champs vides avec des données lors de l'enregistrement d'un enregistrement. Les enregistrements ne réduisent leur taille que lorsqu'une correction est effectuée sur une entrée existante ou sur un enregistrement normal si les données descriptives dans l'enregistrement sont plus longues que celles que le programme lit en mémoire.

Dans le cas d'un enregistrement qui rétrécit, après le dernier enregistrement dans le fichier, il me reste les données qui étaient là avant le changement. J'ai écrit un délimiteur EOF dans le fichier après un "enregistrement d'enregistrement de rétrécissement" pour signaler où se trouvent la fin de mes enregistrements et remplir les données restantes, mais je n'ai plus de fichier propre jusqu'à ce qu'un "enregistrement d'enregistrement croissant" étend la taille du fichier sur la zone remplie d'espace. La fonction truncate() dans unistd.h ne fonctionne pas (je pense maintenant que c'est pour les saveurs * nix seulement?).

Une solution proposée que j'ai vu implique la création d'un deuxième fichier et l'écriture de toutes les données que vous souhaitez enregistrer dans ce fichier, puis en supprimant l'original. Puisque je n'ai que 4 Mo d'espace disque à utiliser, cela fonctionne si la taille du fichier est inférieure à 2 Mo moins la taille de mon programme exécutable et les fichiers de configuration, mais échouerait autrement. Il est très probable que lorsque cela entrera en production, les utilisateurs se retrouveront avec un fichier de plus de 2 Mo de taille.

J'ai regardé Ralph Brown's Interrupt List et la référence d'interruption dans IBM PC Assembly Language and Programming et je n'arrive pas à trouver quelque chose pour mettre à jour la taille du fichier ou similaire.

Réduit la taille d'un fichier sans créer un second fichier même possible sous DOS?

+0

Est-ce que le FAT FS vit en Flash? Cela peut ne pas poser de problème (en fonction de l'utilisation), mais défragmenter le fichier de cette manière ne sera pas agréable avec la durée d'effacement/écriture limitée du flash. – nategoose

+0

@nategoose - L'unité a une partition de disque RAM et une partition flash de 256k, je travaille strictement avec le lecteur RAM pour le moment. La partition flash est uniquement utilisée pour stocker des programmes, pas des données. –

+0

Certains systèmes d'exploitation, y compris DOS, peuvent remplir le fichier à la taille de secteur efficace la plus proche. Les fichiers démarrant sur une frontière de secteur pair sont plus faciles et plus rapides à récupérer que ceux qui ne le sont pas. –

Répondre

4

Pour réduire DOS, la taille d'un fichier que vous cherchez au point de troncature avec int 21 (ax=4200h, bx=handle, cx:dx=offset) et appelez écrire avec une longueur nulle: int 21 (ax=4000h, bx=handle, cx=0 (ce qui signifie troncature))

+0

Cela fonctionne! Merci beaucoup! –

0

Comme alternative à déplacer les enregistrements autour lors du redimensionnement d'un enregistrement , vous pouvez terminer chaque enregistrement avec un champ "pad" qui le remplit à une taille standard (par exemple avec des espaces ou similaires).

Questions connexes