Newsgroup: it.comp.lang.delphi
Titolo: cancellare solo un byte....

ipotesi:
-ho un file di n bytes e ne voglio eliminare solo 1 che si trova grosso modo
nella posizione centrale
-ho un file di n bytes e voglio eliminare gli ultimi k bytes partendo dal
fondo
qual è il modo più veloce per fare le due cose?
copiare di nuovo il file, escludendo in fase di scrittura le parti che non
mi interessano mi sembra poco efficiente: se il file è grosso, al di là del
tempo di esecuzione ci vorrebbe anche molto spazio libero.
attendo i vostri sapienti consigli.
ciao
oscar



non hai alternative....
i database ad es. marcano i record come cancellati e non li cancellano
fisicamente, vengono effetivamente rimossi quando fai un backup e un
restore (che in pratica è quello che faresti tu...)
Ciao,
Alan Solo

tempo di esecuzione ci vorrebbe anche molto spazio libero.
Purtroppo non hai altra scelta.
--
Andrea Laforgia (mica uno qualunque...)

 wrote

1° caso:
ti sposti alla posizione voluta, cioè al byte che intendi eliminare. Come ?
Bè, dipende dalle funzioni che usi per lavorare su questo file.
Ad esempio, se usi TFileStream, ti ci sposti con la proprietà "Position" che
vuole sapere il numero del byte a cui spostarsi. Semplice no ?
Ora per eliminare solo il byte centrale, devi per forza riscrivere tutti i
byte che seguono.
Ma puoi farlo nella stessa sessione di lavoro, cioè se apri il file in
lettura-scrittura contemporaneamente ( fmOpenReadWrite ), cancelli il byte,
poi uno ad uno partendo da quello che segue, riscrivi i rimanenti byte fino
alla fine del file. Poi con la proprietà "Size", rispecifichi la nuova
dimensione del file che ovviamente sarà la dimensione iniziale - 1 visto che
hai cancellato un byte !!
Se non fai questa operazione, ti ritrovi gli ultimi byte del file uguali !!
( l'ultimo è di troppo )
2° caso
prova ad utilizzare direttamente la proprietà "Size" specificando la nuova
dimensione del file.
Se il file è di 2000 byte e tu vuoi toglierne 1000, apri sempre il file ( in
scrittura ) e scrivi
L.Size:=1000;
stop !!
Dovrebbe essere ciò che vuoi ottenere tu. Non conosco altri sistemi, tranne
quello di riscrivere nuovamente il file !!!
Ti saluto, sperando di averti accontentato.
P.S. Se nessuno è convinto sarei curioso di sapere perchè funziona ( del
resto c'è un'api di mezzo ) !! :-))) Anch'io sono stato sempre dell'opinione
di riscrivere tutto il file.
Ciao ciao....
Antonio Tarolla

dimensione del file.
Questo e' un troncamento del file che non risolve, almeno
non nei termini con cui e' esposto, il problema del nostro
amico.


 amico.
bhè, parlando di troncamento non risolve la prima ipotesi (il byte a metà),
ma in teoria la seconda sì, cioè troncare il file degli ultimi byte.
grazie per i consigli. pondererò ulteriormente.
ciao
oscar

 amico.
esattamente.....è proprio un troncamento del file.
Perchè non risolve il problema esposto ?
Lui nel secondo quesito dice:
-ho un file di n bytes e voglio eliminare gli ultimi k bytes partendo dal
 fondo
cioè io ho capito ( e penso tutti ) che il suo nuovo file dovrà essere
uguale a:
X = N - K
quindi potrà scrivere
Size:=( Size - K );
che ovviamente tronca il file.
Il primo quesito non si risolve direttamente con la proprietà "Size" perchè
bisogna spostare tutti i byte che seguono e andranno ad occupare
la posizione di quelli cancellati. Fatta questa operazione bisogna per forza
utilizzare la proprietà "Size", altrimenti il file rimane sempre della
stessa dimensione anche se abbiamo spostato tutti i byte.
Si risparmia in tempo ? Penso di si.....ti risparmi la creazione di un nuovo
file, ma a parte questa piccolezza, i byte che precedono quello da
cancellare non sono affatto invocati. Non c'è bisogno ne di leggerli ne di
riscriverli.
Ti saluto......ciao ciao !!
Antonio Tarolla

 oscar
infatti, ma nella prima ipotesi ( il byte a metŕ ), se fai come ti ho detto,
il troncamento č necessario ( serve per risettare la dimensione del file )
ed ho anche specificato il perchč.....almeno che poi non c'č un'altra
soluzione per evitarlo, ma personalmente non la conosco.
Ti saluto.....buon lavoro.
Ciao ciao....
Antonio Tarolla

Perchč non risolve il problema esposto ?
Hai ragione, scusa, mi ero fermato al primo punto.
