Newsgroup: it.comp.lang.visual-basic
Titolo: Problema: Accesso a file

Salve a tutti, ho un problema:
ho due programmi, il primo accede ad un file ogni 5 secondi
il secondo accede allo stesso file ogni minuto (sempre con un timer).
C'è un modo, in visual basic, per evitare che entrambi i programmi accedano
al file nello stesso momento ?
Perchè ho notato che ogni tanto uno dei due programmi mi dà errore di
accesso al file, e credo che il motivo sia proprio questo.
Grazie.
--
~~~~~~~~~~eMuleSign v0.2~~~~~~~~~
Sono connesso a LovePoint.biz
Download: 20.8 Kb/s | Upload: 11.6 Kb/s

 accesso al file, e credo che il motivo sia proprio questo.
Molto probabile.
Credo che la maniera migliore sia questa: entrambi i prog devono
tentare l'apertura in modo esclusivo. Se non ci riescono, aspettano
un secondo e ci riprovano. Dopo 4 tentativi vanno in errore ed
escono dal loop.
Un'alternativa che mi viene in mente al volo sarebbe di usare un
"file semaforo". Prima di accedere al file, ogni programma deve
verificare che non ci sia un file di nome, per esempio, "ASPETTA"
nella stessa cartella, se non c'è lo crea, fa quello che deve fare
conil file e poi lo cancella; se invece c'è già, aspetta che il "semaforo"
venga cancellato, il che significa che l'altro programma ha smesso
di usare il file interessato. Questo sistema, in particolari condizioni
di timing, potrebbe non essere affidabile, anche se l'ho visto usare
da varie applicazioni commerciali. :-/
O ancora, rinominare il file stesso prima di aprirlo, e rinominarlo
di nuovo dopo averlo chiuso, il concetto è lo stesso.
O magari cambiare semplicemente l'attributo di sola lettura...
in altre parole che si crei l'errore è normale, sei tu che devi gestirlo.
Bye, G.

 accesso al file, e credo che il motivo sia proprio questo.
Se non devi scrivere sul file, ma solo leggere, aprilo in modalità non
esclusiva
(Se usi una Open nome_file For ... As canale, aggiungi Shared alla modalità
...)

"Paperino" ha sentenziato:
|| Credo che la maniera migliore sia questa: entrambi i prog devono
|| tentare l'apertura in modo esclusivo. Se non ci riescono, aspettano
|| un secondo e ci riprovano. Dopo 4 tentativi vanno in errore ed
|| escono dal loop.
Era proprio la soluzione che ho pensato anch'io.
Quello che non so perň, essendo da poco nel mondo di Visual Basic, č questo:
come faccio ad implementare la condizione ?
Esiste qualcosa di questo tipo in visual basic, come nel C ?
IF (open "file.txt" for input as #1) = 1 THEN il file č stato aperto
correttamente
oppure
IF (open "file.txt" for input as #1) = 0 THEN errore
?
Grazie per la risposta.

"Lupo" ha sentenziato:
|| Se non devi scrivere sul file, ma solo leggere, aprilo in modalità
|| non esclusiva
|| (Se usi una Open nome_file For ... As canale, aggiungi Shared alla
|| modalità ...)
Grazie :-)
non lo sapevo, proverò in questo modo
quindi sarebbe:
open nome_file for input shared as #1
per esempio ?
--
~~~~~~~~~~eMuleSign v0.2~~~~~~~~~
Sono connesso a DateAttacke.de


 per esempio ?
Sì, sarebbe così, ma ho appena provato: Se si apre per Input, pur senza
Shared, non sono riuscito a provocare alcun errore. Per meglio capire,
dovresti faci vedere come apri il file nei due programmi.

[*giulio *°*Ricardo Izecson*°** = 
polietil...@tiscalinet.it
 in
news:lgdTb.237445$_
P.81...@news4.tin.it
] ha scritto:

Per testare la presenza di un file, puoi usare la Dir:
If Dir("Percorso_e_nome_del_file")<>"" then
    msgbox "Il file esiste"
end if

"Lupo" ha sentenziato:
||| quindi sarebbe:
||| open nome_file for input shared as #1
||| per esempio ?
||
|| Sì, sarebbe così, ma ho appena provato: Se si apre per Input, pur
|| senza Shared, non sono riuscito a provocare alcun errore. Per meglio
|| capire, dovresti faci vedere come apri il file nei due programmi.
il problema è che uno dei due programmi non l'ho fatto io, e non è nemmeno
in Visual Basic.
So solo che aggiorna questo file ogni tot secondi (presumo 5), mentre il
programma che ho fatto io, con un timer settato ogni minuto, apre lo stesso
file così:
Open file For Binary As #3
e lo chiude dopo una trentina di righe di codice
close #3
l'ho apro in modalità binary perchè devo usare il "get" per leggere un
carattere la volta (ci sono altre soluzioni migliori per leggere un
carattere la volta ?)

 Grazie.
Apri il file in questo modo
----------
Open NomeFile For Input Access Read Lock Read As #1
---------
e se viene generato l'errore 70 vuol dire che il file è gia aperto.
Ciao Giorgio

 carattere la volta ?)
Prova comunque ad aggiungere lo Shared (ma ho poche speranze, perchè
riguarda i permessi concessi ad altri). Prova a leggere tutti i bytes in una
volta e chiudi subito, poi cicla nella variabile usata per la lettura. In
tal modo si dovrebbe ridurre il tempo di apertura, ma temo che l'errore si
verifichi alla Open.
Quindi, potresti fare così:
ritenta:
    doevents
    canale=freefile
    On Error goto errore_apertura
    Open file for Binary Shared as canale
    on error goto 0
'        Tue istruzioni di lettura
'    ...
    Close canale
    Exit Sub
errore_apertura:
    resume ritenta
Ma il problema non si risolve definitivamente: Se l'altro programma (sul
quale non puoi intervenire) apre il file mentre tu l'hai aperto provocherà
un errore...

il problema è che non posso nemmeno testare con successo,
perchè in 48 ore di uso di entrambi i programmi che accedono allo stesso
file (uno ogni minuto e uno ogni 5 secondi), mi ha dato errore solo una
volta, una volta in 48 ore di esecuzione.
Bho.

[*giulio *°*Ricardo Izecson*°** = 
polietil...@tiscalinet.it
 in
news:U1fTb.238080$_
P.81...@news4.tin.it
] ha scritto:

Non so davvero cosa dire, se non che se l'errore si verifica sul tuo puoi
controllarlo e ripetere.
Se è l'altro a provocare il problema (perchè tu hai il file aperto e quello
ne pretende l'apertura in esclusiva e non controlla l'errore) si impianta ed
è un guaio.
Non puoi sentire gli autori di quel programma in modo che ti possano mettere
a disposizione il file (in apertura condivisa) o una sua copia libera?

"Lupo" ha sentenziato:
|| Non puoi sentire gli autori di quel programma in modo che ti possano
|| mettere a disposizione il file (in apertura condivisa) o una sua
|| copia libera?
non è importante fino a questo punto :-)
ma ormai sono arrivato al punto di voler trovare per forza una soluzione,
quindi domani proverò le viarie alternative che mi sono state dette in
questo post, e testerò il programma per qualche giorno consecutivo ;),
magari settando il timer ogni 5 secondi, anzichè ogni minuto, così ci sarà
la probabilità che l'errore (se c'è) si verifichi più spesso.
comunque grazie a tutti per l'aiuto :-)

 IF (open "file.txt" for input as #1) = 0 THEN errore
No, Open è un'istruzione, non una funzione; devi gestire l'errore
col classico "On Error Goto".
Con la sintassi che ho usato nell'esempio sopra, *in teoria*, dovresti
poterlo aprire in sola lettura e permettere ad altri processi di aprirlo
ugualmente in scrittura. Non ho provato, però.
Bye, G.

"Paperino" ha sentenziato:
|| Fammi capire, devi solo _leggere_ quel file dal tuo programma ?
sě
|| E quanto č lungo il file, in media e nella peggiore delle ipotesi ?
due righe :-)
in tutto 50-60 caratteri
|| Se č abbastanza breve puoi leggerlo in un solo colpo:
||
|| Dim strTesto As String
|| Dim FileLibero As Integer
|| FileLibero = FreeFile
|| Open "<nome del file da aprire>" For Input Access Read Shared As
||     #FileLibero strTesto = Input(LOF(FileLibero), FileLibero)
|| Close FileLibero
||
|| Poi fai tutto quello che devi fare sulla strTesto, usando la Mid$.
questa mi sembra una buona idea,
ed č anche una soluzuione "piů elegante" di quello che facevo io
grazie
|| devi gestire l'errore
|| col classico "On Error Goto".
|| Con la sintassi che ho usato nell'esempio sopra, *in teoria*,
|| dovresti poterlo aprire in sola lettura e permettere ad altri
|| processi di aprirlo ugualmente in scrittura.
provo anche cosě ;-)

 grazie
Non per togliere qualcosa al grande Pap, ma questa ipotesi era già saltata
fuori.
Io resto della mia idea: Se l'altro programma (quello sul quale non puoi
intervenire) pretende l'apertura esclusiva e non controllo l'errore, si
impianterà se troverà il file aperto (dal tuo programma).
Ipotesi remota e, viste le dimensioni del file, molto improbabile, ma
assolutamente realistica.

"Lupo" ha sentenziato:
|| Io resto della mia idea: Se l'altro programma (quello sul quale non
|| puoi intervenire) pretende l'apertura esclusiva e non controllo
|| l'errore, si impianterą se troverą il file aperto (dal tuo
|| programma).
|| Ipotesi remota e, viste le dimensioni del file, molto improbabile, ma
|| assolutamente realistica.
e infatti, in 3 giorni consecutivi di utilizzo di entrambi i programmi,
l'errore č venuto fuori soltanto una volta.
Comincio a pensare che quell'errore sia stato causato da qualcos' altro :-\

 impianterà se troverà il file aperto (dal tuo programma).
Ripeto: con _quella_ Open, non ho provato, ma _credo_ di no.
Anzi, adesso ci provo e posto il risultato.
Bye, G.

 Anzi, adesso ci provo e posto il risultato.
Vuoi sentire la mia? Roba troppo vecchia: per rete, win e VB non vanno più o
vanno a caso.
Ier sera ho aperto per Output da una parte e per Input dall'altra. Non ha
proferito parola.

 Non ha proferito parola.
Boh, lì IMVVVHO è questione più di win che di VB, soprattutto
per quanto riguarda la rete.
I parametri Access e simili per l'accesso concorrente ai file mi
pare fossero già nel GWbasic.
Un dubbio... non mi pare si sia parlato di file _in rete_ in questo
3ad, o come direbbe Gulp, "mi sono perso qualcosa" ?
Bye, G.

"Lupo" ha sentenziato:
|| Io resto della mia idea: Se l'altro programma (quello sul quale non
|| puoi intervenire) pretende l'apertura esclusiva e non controllo
|| l'errore, si impianterà se troverà il file aperto (dal tuo
|| programma).
|| Ipotesi remota e, viste le dimensioni del file, molto improbabile, ma
|| assolutamente realistica.
so per certo che l'altro programma, quello che non ho scritto io, se non
riesce ad aprire il file non si pianta, ma ritenta l'apertura dopo 5
secondi. In pratica se tenta un aggiornamento del file senza riuscire ad
aprirlo, perchè già aperto dal mio programma, salta semplicemente un
aggiornamento.
E potrei fare anch'io la stessa cosa:
quindi o salto anch'io una lettura del file, oppure ritento l'apertura.
In questo modo nessuno dei due programmi si pianterà ;-)

 semplicemente un aggiornamento.
Perchè raccontarci le cose a rate?
Segui l'esempio che ti ho proposto e, a questo punto, elimina il dubbio
finale.