Come memorizzare i nomi dei file, iniziare l'offset e la lunghezza evitando il problema dei limiti autoimposti (tabella di ricerca) o di dover eseguire la scansione dell'intero file?

3

Sto cercando di saperne di più su C e sui suoi discendenti (principalmente C ++). Ho deciso che mi piacerebbe creare un "file system" di sorta. Non è una mente particolarmente avanzata, ma tu puoi giocare con qualcosa. Non ho intenzione di renderlo montabile, sicuro o addirittura recuperabile.

Al momento sono bloccato in terra concettuale con il tentativo di decidere come implementare il MFT / FAT.

All'inizio pensavo che avrei usato il primo numero X di byte per memorizzare una tabella di ricerca, quando ho capito che ci sarebbe stata una limitazione al numero di file che potevo memorizzare pensavo di usare qualche tipo di metadata con ogni file, ma poi dovrei scansionare l'intero filesystem per localizzare un file.

Ho letto questo e questo anche se il link z80 sembra essere più in alto nel mio vicolo.

Da un livello elevato voglio poter emettere un comando come:

./myfs funnycat.jpg mystorage.mfs

Aggiunta essenzialmente di dati binari alla fine di mystorage.mfs

Come posso memorizzare le informazioni che conterrebbero i nomi dei file, l'offset iniziale e la lunghezza evitando il problema dei limiti autoimposti (lunghezza della tabella di ricerca) o la scansione dell'intero file (metadati con dati binari)?

Spiegazione concisa Sto cercando un modo per etichettare i dati binari memorizzati in un singolo file contiguo in modo da poter estrarre i dati da un determinato intervallo di offset o da una stringa.

./myfs mystorage.mfs funnycat.jpg

Probabilmente per fare ciò aggiungerò qualche logica a myfs per controllare il primo argomento per i segni che è un blob contenente altri file o meno.

    
posta xandout 21.05.2014 - 19:36
fonte

1 risposta

1

Di seguito sono riportate alcune possibili soluzioni ad alcuni dei problemi menzionati.

How do I store a number of arbitrary size?

Un approccio semplice consiste nell'utilizzare una Quantità di lunghezza variabile . Fondamentalmente, per ogni ottetto usato per rappresentare il tuo numero, 7/8 dei suoi bit sono usati per rappresentare il numero e il bit extra è impostato a 1 se ci sono altri ottetti. Puoi anche scegliere alcune dimensioni "non raggiungibili" e scrivere codice per supportare questa dimensione fissa.

How can I tell when I've reached the end of a file?

Puoi utilizzare una qualche forma di tabella di allocazione file (puoi rappresentarla come elenco collegato per consentirgli di crescere in dimensioni arbitrarie).

I want to support disk fragmentation. I.e., I should be able to grow a file, even if the file is about to overlap another file, without either file.

Ogni file deve essere composto da cluster di dimensioni fisse. Ogni cluster avrà un'intestazione con informazioni come:

  • Quanto del cluster è allocato? (i cluster sono di dimensioni fisse, il contenuto di un cluster potrebbe non essere completamente popolato con i dati).
  • Dov'è il prossimo cluster? (Un file potrebbe richiedere più di un cluster. Potresti comunque memorizzare queste informazioni in una tabella di allocazione).
  • Questo cluster è allocato? (Se queste informazioni sono nel cluster piuttosto che in una tabella di allocazione, sarai costretto a "formattare" l'intero "disco rigido" utilizzando un "formato lento". L'uso di una tabella di allocazione file ti consente di eseguire un "formato veloce" . "Intendiamoci, si potrebbe imbrogliare sfruttando il file system esistente (cioè, si può supporre che il byte sia inizializzato a 0).
risposta data 21.05.2014 - 20:52
fonte

Leggi altre domande sui tag