2013-07-07 9 views
4

L'ajout d'un fichier volumineux à un fichier volumineux est difficile, car tous les caractères doivent être déplacés vers l'avant. Cependant, pourrait-il être fait en manipulant l'inode comme suit ?:Ajouter un fichier temporaire sans fichier temporaire en manipulant inode?

  • Allouer un nouveau bloc sur le disque et remplir avec vos données PREPEND.

  • Tweak le inode pour lui dire votre nouveau bloc est maintenant le premier bloc , et de remonter l'ancien premier bloc à la deuxième position bloc , ancien second bloc à la troisième position, et ainsi de suite.

Je sais que cela nécessite encore supplantation blocs avant, mais il devrait être plus efficace que d'avoir à utiliser un fichier temporaire.

Je réalise également que le nouveau premier bloc sera un bloc "court" (toutes les données du bloc ne font pas partie du fichier), car il est peu probable que vos données soient exactement de la même taille qu'un bloc. Ou, si les blocs d'inodes sont simplement liés, il faudrait très peu de travail pour faire ce qui précède.

NOTE: ma dernière expérience des données de disque manipulant directement était avec un Commodore 1541, donc ma connaissance peut être un peu à jour ...

Répondre

1

les systèmes d'exploitation moderne-jour ne devrait pas permettre à un utilisateur de le faire , car les structures de données inode sont spécifiques au système de fichiers sous-jacent. Si votre système de fichiers/système d'exploitation le prend en charge, vous pouvez faire de votre fichier un fichier fragmenté en ajoutant des données vides au début, puis en écrivant dans les blocs clairsemés. En théorie, cela devrait vous donner ce que vous voulez.

YMMV, je ne fais que jeter des idées. ;)

+0

Je suis d'accord que les inodes devraient être cachés. Nous cherchons un moyen pour l'OS de faire l'inode au violon pour nous. Comme un fichier est un arbre, l'insertion au début ou ailleurs devrait être aussi rapide que l'insertion seulement à la fin en l'ajoutant au fichier. –

+0

Si la structure de comptabilité de l'extension de l'i-noeud est semblable à celle de l'arborescence (qui dépend du FS), alors le fichier "sparse file" devrait - en théorie; - faire l'affaire. Avez-vous essayé? – Sven

+0

IIUC, vous suggérez de réserver 50 Mo d'espace vide inutilisé au début du fichier, d'enregistrer quelque part la quantité de fichier à ignorer lors de la lecture, et quand vous avez un nouveau MB à ajouter, réduisez-le à 49 et écrivez à la fin de la section clairsemée. Cela devrait fonctionner, mais ce serait bien de pouvoir l'insérer à n'importe quel moment dans le fichier. –

0

Cela pourrait fonctionner! Oui, les programmes d'utilisateur ne devraient pas être en train de débloquer avec des inodes. Oui, cela dépend nécessairement du système utilisé pour suivre les blocs, quels que soient les systèmes de fichiers implémentant cette fonction. Rien de tout cela n'est une raison pour rejeter cette proposition d'emblée.

Voici comment cela pourrait fonctionner. A titre d'illustration, supposons que nous ayons un inode qui suit les blocs par un tableau de pointeurs directs vers des blocs de données. Supposons en outre que l'inode porte un offset de départ et un offset de fin qui s'appliquent respectivement au premier et au dernier bloc, de sorte que vous pouvez avoir des blocs inférieurs à la fois au début et à la fin d'un fichier.

Maintenant, supposons que vous vouliez ajouter des données. Ça irait quelque chose comme ça.

IF (new data will fit into unused space in first data block) 
    write the new data to the beginning of the first data block 
    update the starting-offset 
    return success indication to caller 

try to allocate a new data block 
IF (block allocation failed) 
    return failure indication to caller 

shift all existing data block pointers down by one 
write the ID of the newly-allocated data block into the first slot of the array 
write as much data as will fit into the second block (the old first block) 
write the rest of data into the newly-allocated data block, shifted to the end  
starting-offset := (data block size - length of data in first block) 
return success indication to caller 
Questions connexes