Newsgroup: it.hobby.elettronica.digitale
Titolo: FAT e lunghezza file

Ciao,
per leggere un file contenuto in una SD formattata in FAT16 continuo a 
leggere blocchi di 512 byte a partire dal cluster iniziale del file fino 
a che ho raggiunto il numero di byte di cui č composto. I byte 
successivi (contenuti nell'ultimo blocco letto) li ignoro. E' corretto?
In altre parole, l'unico modo per sapere quando finisce un file č aver 
contato i byte letti?
Grazie in anticipo
Marco / iw2nzm

 contato i byte letti?
Si. Non per niente nei dischi si parla di waste space, tanto piů alto
quanti piů settori sono racchiusi in un cluster...
-- 
IBM: In Business (for) Money
News 2002 [v 2.07] / StopDialer / PopDuster - 
http://www.socket2000.com
Akapulce portal: 
http://www.akapulce.net

Marco Trapanese ha scritto:

Ehm.. mi sa che tu non sai come funziona la FAT ^_^" non puoi leggere i 
cluster in sequenza, ma devi usare la FAT ( File Alocation Table )... ma 
presumento che tu lo faccia cosě sai solo quanti cluster occua il file ( 
la voce "Dimensione su dico" dell proprieta di windows ) che č molto 
diverso a quanti byte occupa. Perché anche se il file occupa 1 Byte, tu 
devi comunque allocare un cluster che ne č 512 di byte.
Come fare a sapere la dimensione effettiva? Semplice: Ogni file ( ogni 
directory ) ha associato una struttura. Questa struttra ha diversi 
campi: Il nome, gli attributi, la data di creazione ecc... da di essi 
c'č anche DIR_FileSize che parte dal offset 28 ed č un DWORD contentne 
appunto la lunghezza del file espressa in byte.
Cercati la documentazione di Microsoft "FAT - General Overview of 
On-Disk Format" č fatta molto bene l'ultima verisone, prelevabile 
direttamente dal sito di Mircosft č la versione 1.03 del 2000. Qui 
troverai tutto quello che vuoi sapere ( e anche di piů ) sul FileSytem 
FAT. Gli manca l'estensione dei nomi lunghi ( contentua in un altro 
documento con il titolo "FAT - Long Filename Specification" che pero' 
Microsoft non distribuisce piů. Io ho solo la versione 0.5 del 1992 
pultroppo ).
-- 
Il Razziatore,
The Only Good Windows is an uninstalled Windows
-----------------------------------------------
MSN   : 
IlRazz...@netscape.net
ICQ   : 67552596
Yhaoo : Razziatore82
-----------------------------------------------
Founder of MediaPlayer Project
http://mpp.iwebland.com

 pultroppo ).
Ok, provo a cercarla.
Ciao!
Marco / iw2nzm

 
aggiungo qiesto solo per dirti che esistono ormai alcune implementazioni 
di accesso alla FAT gia' pronte.
ha senso rifare il lavoro di altre persone ?
tanto per fare un paio di esempi ( in ordine sparso ) :
http://www.larwe.com/zws/products/dosfs/
http://elm-chan.org/fsw/ff/00index_e.html
http://sourceforge.net/projects/efsl
microchip ne fornisce una altra implementazione
il secondo link l'ho portato 'anche' sotto 8051

 io mi metto nel buffer tutto il cluster da 512 e poi tengo buoni solo i 
Non confondete però cluster con settori... I settori sono da 512 byte
mentre i cluster sono raggruppamenti di settori  (trucco per evitare 
che la FAT altrimenti divenga immensa sui dischi di grande capacità).
-- 
Every program is a part of some other program, and rarely fits.


 il secondo link l'ho portato 'anche' sotto 8051
In effetti questo mi piace molto e mi sembra il più completo (pensando 
in futuro ad applicazioni anche su HD). Però vedo che le funzioni che 
già ho per le SD/MMC non sono compatibili con le richieste della 
libreria e avrei da smanettarci un po'.
A questo punto ti chiedo: non è che c'è già una libreria compatibile con 
(Tiny-)FatFs che supporti le SD card?
Anche qui per lo stesso motivo: non voglio avere la pappa pronta ma 
nemmeno reinventare la ruota.
Grazie e buona domenica!
Marco / iw2nzm

 che la FAT altrimenti divenga immensa sui dischi di grande capacità).
Probabilmente la confusione mi è data dai documenti che ho letto (tra 
cui anche stralci di codice commentati) dove vengono usati termini forse 
in maniera errata. Adesso vedo di riordinare le idee poi magari se ho 
dubbi riposto :)
Ciao!
Marco / iw2nzm

 
nella directory avr c'e' "mmc.c", quello dovrebbe essere il driver per 
le MMC/SD
non so se si adatta direttamente al tuo hardware o se vanno fatte 
piccole modifiche
comunque io non l'ho provato per due motivi: uso 8051 senza spi hardware 
e poi non ho ancora pronta una interfaccia SD
curiosita' : come hai risolto il problema della interfaccia 5V-3.3V ? o 
l'AVR che usi e' a 3.3 ?
il modulo FatFs lo sto testando attualmente testando su una ram da 512KB 
che mi fa da ram-disk


 l'AVR che usi e' a 3.3 ?
Uso un ATmega644 a 5V e ho fatto una cosa molto grezza ma che funziona 
perfettamente: un banale partitore da 1k5 e 3k3 sulle linee clock, data 
in (verso la DS) e cs. Pull-up a +5V sul data out e alimentazione a 3V3 
alla SD.
Ciao!
Marco / iw2nzm

 
A dire il vero i settori non sono sempre da 512 byte ( quasi sempre 
vero, al 99.9% vero, ma non sempre ). Per sapere quanto occupa un 
settore ( e di quanti settori e composto un cluster ) ci sono 2 campi 
nel descrittore.


 raggiungo l'ultimo cluster poi considero validi solo i byte necessari.
Precisamente. Comunque come ti č stato detto i cluster non sono da 
512byte ( ma un multiplo del settore ). I settori sono "quasi" sempre da 
512byte...


 ha senso rifare il lavoro di altre persone ?
Mah io lo trovo utile. Spece in situazioni semplici come queste. Almeno 
si impara qualcosa. Io quando ho preso la FAT in mano per implementarla 
ho imparato un sacco di cose, che non avrei imparato se avessi preso ( 
per esempio ) il codice della VFAT del kernel di linux e l'avessi 
"incollata". Ovvio se si è accorto di tempo, e si vuole una cosa che 
funziona, senza badare molto al fattore didattico allora il lavoro degli 
altri è sempre una cosa buonissima.


 cluster in sequenza, ma devi usare la FAT ( File Alocation Table )... ma
confermo che č cosě ma se uno vuole fare un'implementazione limitata e 
semplificata puň anche leggerli in sequenza a patto di aver formattato e 
copiato dei files (no cancella e copia successiva) oppure lanciato un defrag
č una strada che cmq sconsiglio ma in un caso l'ho usata e ha funzionato
-ice-

 
La deframentazione di un disco non assicura che i cluster siano 
conseguenzali, assicura solo che "forse" lo sono. Con il copia incolla 
te la cavi meglio a meno di settori dannegiati, ovvio.


 te la cavi meglio a meno di settori dannegiati, ovvio.
ok, ma i settori danneggiati e marcati come tali in fat poi li individui 
quando leggi e li salti
-ice- 

(Tiny-)FatFs che supporti le SD card?
Vai qui:
http://www.ulrichradig.de/index.html
poi AVR >> MMC-SD
trovi un codice scritto in C
http://www.ulrichradig.de/site/atmel/avr_mmcsd/zip/SourceCode2_7.zip
L'unico problema può essere che è commentato in tedesco, però è fatto bene.
--
ciao
  Stefano

 
Saltare i settori daneggiati, come complessità non e uguale a saltare 
dentro la FAT?


 dentro la FAT?
diciamo che leggo il valore del record, se indica BAD allora leggo il 
sucessivo
quella della frammentazione non la sapevo :)
-ice-