Newsgroup: it.comp.lang.delphi
Titolo: Re: Notifica di scrittura da Cache a SupportoFisico


Ciao ciao
Andrea

 Non credo che esita un messaggio "Ehi, ho svuotato la cache!" :-)
Quest'ultimo era la mia speranza: mi sembra strano che non esista nulla che
segnali in maniera broadcast che eventuali operazioni di scrittura pendenti
sono state completate.
Un'idea che sto provando è usare DeviceIoControl con FSCTL_VOLUME_LOCK in
quanto, stando ad msdn, prima di fare il lock il SO fa il flush di tutti i
dati in cache ...
Andrea

 state completate.
Non capisco perché ti interessi: questi sono "affari" del driver del 
device, non tuoi. Quando scrivi un file su disco, Windows ti dice quando 
ha terminato la scrittura, ma il file può essere in cache e non ancora su 
disco. Le operazioni di "flush" disponibili per i file eseguono lo 
svuotamento dei buffer utilizzati dalle funzioni di I/O, non di eventuali 
cache gestite direttamente dal sistema o addirittura dai controller. 
Queste al massimo possono essere disabilitate a livello di impostazioni 
del driver, ma difficilmente controllate da programma.
Tu al massimo puoi chiedere al device di rimuoversi, e lui provvederà a 
fare il flush di eventuali cache se necessario, ma a livello di 
applicativo il device deve essere una "black box", l'applicazione non 
deve sapere troppo di come è funziona internamente un device, o si 
rischia di non poter gestire efficacemente device in modo generico.
Mi sembra che sia sbagliata la logica della tua applicazione: tu non hai 
bisogno di sapere se un device può essere rimosso, se devi rimuoverlo gli 
chiedi di farlo. Sarà compito suo farlo in modo pulito, o segnalarti che 
non può essere rimosso per un qualche motivo - che è esattamente quello 
che fa Windows.
Luigi D. Sandon - D&amp;D Support Team
--- posted by geoForum on 
http://www.delphiedintorni.it

 che fa Windows.
A me non interessa niente come diavolo funziona il device, è una bellissima
scatolina nera con un bel led verde a volte intermittente.
Ma presumo esista il modo di sapere quando ha finito di trasferire
"fisicamente" i suoi bravi 2,3 mega di dati dalla cache in modo che la mia
applicazione possa dare l'ok all'utente nel disinserire il mass storage.
Non so quale sia il tuo cliente-tipo, am ti assicuro che il mio richiede
"anche" questo tipo di controllo: se qualche dato va "a ramengo" sono cavoli
amari, percui cerco di facilitarmi la vita dando l'ok alla rimozione
"fisica" del dispositivo quando sono sicuro che tutto sia stato
effettivmente trasferito.
Basta un banale ciclo da 1 a 1000 di istruzioni che aprano in modalità
append un file di testo su una mass storage, scrivano il valore numerico del
contatore e, magari, nel momento siano in esecuzione anche altre 3/4
applicazioni "grosse": se io estraggo lo storage appena il contatore è
arrivato a 1000 perdo molto ... che fò ? Aspetto un tempo x di millisecondi
? Dico all'utente di staccare solo quando vede il led che non lampeggia ?
Comuque non importa, troverò qualcosa.
Buon weekend
Andrea

? Dico all'utente di staccare solo quando vede il led che non lampeggia ?
Io metterei un tasto/menu nell'applicazione per permettere all'utente di 
rimuovere il device. Quindi chiamerei DeviceIoControl() passando 
IOCTL_STORAGE_EJECT_MEDIA. Visualizzerei all'utente una bella finestrella 
che lo avverte di attendere le operazioni di chiusura, pena il 
danneggiamento dei dati, e mi metterei in attesa dell'arrivo del 
messaggio WM_DEVICECHANGE che mi informa che il dispositivo è 
stato "rimosso" e che quindi l'utente lo può estrarre fisicamente. A 
questo punto una bella finestra "Ora è possibile rimuovere il 
dispositivo" informa l'utente che può farlo. Tra l'altro gli risparmi di 
doverlo fare poi da Windows. Infatti se è un dispositivo USB o simili non 
ti basta sapere se la cache del file è stata svuotata, ma il driver può 
mantenere in memoria altre informazioni per accelerare l'accesso (che so, 
tabella di allocazione, directory, ecc. ecc.) che devono essere scritte 
permanentemente sul dispositivo prima della rimozione, pena possibili 
malfunzionamenti.
Se lo estrae senza seguire la procedura sono cavoli suoi, se fosse un 
device lockabile come i CD-RW e i DVD potresti addirittura inviare il 
comando IOCTL_STORAGE_MEDIA_REMOVAL con una struttura 
PREVENT_MEDIA_REMOVAL e bloccarglielo finché non è stato chiuso 
correttamente. Con un disco USB purtroppo non si può, bisognerebbe 
proporre un meccanismo per bloccare le prese USB... :)
Comunque utilizzando i messaggi WM_DEVICE_CHANGE puoi dare anche un 
feedback visivo all'utente da qualche parte, che so, una luce rossa che 
si accende quando il device viene inserito e che diventa verde quando può 
rimuoverlo.


Forse dico una baggianata, ma quando inserisci un "flush" e questo termina
il file non dovrebbe essere scritto sul drive?.
puoi anche vedere se c'e con FileExists in un loop uscendo quando lo trova.
Poi per capire se e' stato scritto completamente tenta di aprirlo in maniera
esclusiva, sepre in un loop, quando lo apre esci dal loop, aggiungi un
ritardo fisso, si sa mai...
Se cosi' non va' spero almeno di averti dato uno spunto,
Ciao Giorgio Padoan


Ciao Luigi

Sul feedback "grafico" nulla da dire, anzi è una buona cosa, però non ci
siamo per quanto riguarda il WM_DEVICECHANGE il quale si accorge se
inserisco o rimuovo "fisicamente" il dispositivo, ma non se lo tolgo
dall'elenco dei dispositivi hardware del SO tramite
IOCTL_STORAGE_EJECT_MEDIA.
Un articolo interessante è 
http://support.microsoft.com/kb/q165721/
 però ho
notato una cosa strana (WinXP Pro): il tutto funziona "solo" se,
all'inserimento del dispositivo, quando viene visualizzata la dialog che
richiede come "gestire" il dispositvo stesso, NON premo il tasto annulla
(cioè scelgo qualsiasi operazione, ance "non fare nulla", basta che dia OK).
Che può essere secondo voi ?
Ah, naturalmente su Win2000 non mi compare questa dialog e non funziona
neppure il codice di cui il link sopra.
Saluti
Andrea

IOCTL_STORAGE_EJECT_MEDIA.
Ho fatto qualche prova e ho visto anch'io. Io l'avevo fatto con dei CD-RW
utilizzati via UDF, non con dei dischi USB, pensavo Windows li trattasse
in maniera abbastanza simile, invece no.
Se guardi l'articolo però ci sono i comandi per fare l'unmount di un
volume. In teoria questo dovrebbe fare il flush di tutti i dati.
Tra l'altro sono interessato anch'io perché dovremmo a breve are
un'applicazione che "sente" l'inserimento di una chiave USB e attiva
funzioni particolari se è quella giusta, funzioni che vanno disabilitate
quando la chiave viene rimossa.


 volume. In teoria questo dovrebbe fare il flush di tutti i dati.
Io sono incasinato con il comando di LOCK: non capisco perchè a volte va a
volte no.
In ogni caso,l' unmount del volume effettivamente toglie il dispositivo
dall'elenco hardware ... diciamo che il comportamento è analogo a fare il
Rimuovi dal menù contestuale che si ottiene con il tasto destro del mouse
clickando sopra al dispositivo in Risorse del Computer.
Una domanda (a te e a chiunque altro stia leggendo): il RIMUOVI del suddetto
menù è equivalente ad effettuare la "Rimozione Sicura" attraverso l'icona
della TrayBar ?
Un grazie di cuore a chi sa darmi una rispostina.
Andrea