Newsgroup: it.comp.lang.visual-basic
Titolo: File in uso

Come si fa a sapere se un file è in uso?
GetAttr non mi dice niente!!
Conoscete qualche API (sicuramente esiste!!)
Grazie...
Ciao
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 GetAttr non mi dice niente!!
Infatti quelli sono gli attributi (sola lettura, nascosto...)
-- 
Emanuele Torrenti

Troppo facile!!! Se lo apro, l'applicazione che potrebbe usarlo in quel
momento mi darebbe un errore a video!!
Quindi devo solo vedere se è in uso, senza disturbare!!
Grazie..



 Grazie..
Prego, pensavo sapessi gestire un errore...
-- 
Emanuele Torrenti

 tua sub scrivi:
Appena mi danno i sorgenti di Word lo faccio!
Alberto
-- 
Ma noi no


www.openoffice.org
e cerca "get involved" o roba simile :)
-- 
Emanuele Torrenti

 Grazie..
Questo probabilmente risolve il tuo problema:
http://vbnet.mvps.org/index.html?code/fileapi/createfile_inuse.htm
Bye
Raf


 


 Ciao.
In teoria servirebbe un semaforo per arbitrare l'accesso a questo file, ma
dubito che l'applicazione "esterna" possa essere modificata per implementare
questa politica.
Per quanto ne so, l'unico modo è fidarsi del locking a livello di file system e
procedere così (FileInUse utilizza il codice dell'esempio che avevo postato
sopra).
If Not FileInUse(MyTargetFile) Then
    Open MyTargetFile For Output As f
    Close f
End If
Ma secondo me non è privo di rischi al 100%
In casi particolarmente sfigati potrebbe capitare che l'applicazione "esterna"
inizi ad accedere al file una volta che il tuo programma è ormai entrato
nell'if, andando in collisione con le istruzioni successive (che sicuramente non
sono istantanee).
Bye
Raf

 quindi mi sono perso queste informazioni.
Se vuoi ridurre il problema, puoi preparare il file vuoto, poi in un 
istante rinomini il file 'buono' e, se la rinominazione è andata a buon 
fine, rinomini il file vuoto col nome del file buono.
Il file contenente i dati è quindi leggibile e puoi verificare se c'è 
qualcosa che ti era sfuggito prima.
Oltretutto, questo modo consente anche un primo controllo, in quanto un 
file in uso non è rinominabile.
Ciao


 nell'if
Mi e' venuta una mezza idea.
Chiamiamo A il programma principale che scrive sul file, e B il tuo 
programma che apre, legge, chiude, e poi svuota (apre-chiude) tale file.
Scrivi un programma C che:
- Trovi il processo A che scrive sul file (GetProcessID)
- Abbassi la priorita' del processo A a IDLE_PRIORITY_CLASS
 (ovvero: attiva il processo solo quando non ci sono altri
 processi attivi)
- Lancia il programma B con priorita' massima (HIGH_PRIORITY_CLASS)
- A esecuzione terminata alza nuovamente la priorita' del
  processo A a NORMAL_PRIORITY_CLASS
hth,
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
Statuto: 
http://www.it-lang-vb.net/docs/Statuto.txt
UGIdotNET - 
http://www.ugidotnet.org

 file vuoto col nome del file buono.
Come al solito, le grandi menti intuiscono le soluzioni migliori/piu' 
semplici. =)
Probabilmente non ti devi preoccupare neanche di ridargli il file vuoto. 
Rinomini il file e poi ci fai quello che vuoi. Se il file e' in uso, non 
riuscirai a rinominarlo. Se non e' in uso, verra' ricreato ex-novo dal 
programma.


> Come si fa a sapere se un file è in uso?
Public Function CheckOpenFile(filetocheck As String) As Boolean
On Error GoTo ErrRoutine
    Dim OldFileName As String, NewFileName As String
    OldFileName = filetocheck
    NewFileName = Replace(OldFileName, Right$(filetocheck, 4), ".old", , ,
vbTextCompare)
    ' l'istruzione Name solleva un errore 75 se il file è aperto
    Name OldFileName As NewFileName
    ' se si arriva fino a qui, significa che il file era chiuso ed è stato
rinominato
    ' quindi va ripristinato il nome originale
    Name NewFileName As OldFileName
    CheckOpenFile = False
ExitRoutine:
    Exit Function
ErrRoutine:
    If Err.Number = 75 Then
        CheckOpenFile = True
        Resume ExitRoutine
    End If
End Function
Stranamente, però non mi ha funzionato con un file .txt, ma dopo che l'ho
salvato come .doc e l'ho aperto con Word ha funzionato egregiamente.
Prova a personalizzarla per il tuo formato specifico.
Ciao, spero ti sia d'aiuto.


 programma.
Se effettivamente il programma "esterno" in assenza di file lo ricrea, allora
questa soluzione è quella ottimale al 100%, almeno mi pare.
Altro che modificare la priorità dei processi ;-)
Bravi!
Bye
Raf

OK... Ragazzi, vi ringrazio per la collaborazione.
Le mie conclusioni sono queste:
Quella del rename è un' ottima idea... in effetti se rinomino il file o lo
cancello.. l'applicazione esterna lo ricrea.
Tuttavia devo sempre sapere se l'applicazione mi sta scrivendo sul file
altrimenti se gli rinomino il file sotto si avrrebbe :
- errore applicazione esterna
- perdita di informazioni
Concludendo, mi serve di sapere se l'applicazione sta scrivendo sul file.
Ho provato con IsFileInUse ma mi dice sempre che non è usato!!!
Forse, mi butto sul vecchio FileDateTime(<nomefile>)
Se avete altre idee!!!!
Grazie per l'attenzione!!



 - errore applicazione esterna
E' una tua supposizione, o l'hai riscontrato?
A me risulta che se il file è sotto scrittura, fallisca il rename, ma è 
un'operazione tua, quindi intercettabile.


 ha
scritto:



 a nascondere l'applicazione esterna???
Come non detto. Naso gia' arricciato. Sento puzza di lamer.
Lokar.dubbioso


 Inoltre mi pareva d'aver capito che volevi
"Volessi", porco me! *bonk* (in capoccia) faccio pubblica ammenda sui ceci!
Lokar.cosparso.di.cenere 

Ok... Non c'è problema!! Il fine non è quello di risolvere il problema??? Se
mi date delle soluzioni io ve ne sono grato... Ma alla fine posso decidere
io cosa fare??
Non ho detto che ho fatto la scelta migliore!!!
Vi spiego la situazione:
Ho un'applicazione esterna che mi genera il file A, e ci scrive in Tempo
reale
La mia applicazione deve prendere questo file manipolare solo alcune righe e
generare un file B.
Allora se vado in lettura su A e in Append su B io avrò sempre la situazione
aggiornata.
Potrei anche lasciare così, ma siccome ogni volta mi rileggo il file A
dall'inizio perchè i record non sono uguali (e con la Seek del file va in
Overflow), mi vorrei svuotare ogni tanto il file A.
Perchè allora rinominare il file se non sò se l'applicazione esterna lo sta
usando???
Se l'applicazione esterna non trova il file , genera un'errore che io non
posso controllare e il cliente non sarà soddisfatto e si chiederà ma il
programma non funziona???
Se invece apro A in Ouput lo pulisco e l'applicazione se lo trova cmq!!
Ma quando, fare questo??
Io avevo pensato di vedere la FileLen() se era stata modificata. Se non è
stata modificata lo ripulisco.
E chiaro che potrebbe perdersi qualche dato nel momento in cui lo sto per
ripulire, ma è cmq da provare!!
Ciao...



 Vi posso chiedere, però come si fa a nascondere l'applicazione esterna???
Non ti seguo.
Nascondere, da chi?


 io cosa fare??
Certo.
Ma se chi sta cercando di aiutarti ti fa una domanda, la buona 
educazione ed il vivere civile prevede di rispondere.


 Ciao...
Ciao

     ' l'istruzione Name solleva un errore 75 se il file è aperto
NON funziona su un win98se
neanche il FSO OpenTextFile (vbs) qui sotto
set oFso= createobject("scripting.fileSystemObject")
on error resume next
sfile="C:\test.doc"
  set oFile= oFso.openTextFile(sfile, 8, false)
  nErr= err: sErr= err.description: err.clear
  oFile.close
on error goto 0
select case nErr
  case 0: msgbox "File is not in use."
  case 70: msgbox "File is in use."
  case else: msgbox "Error:  " & nErr & vbCr _
      & sErr
end select
--
Fosco

 NON funziona su un win98se
molto strano, io lavoro soltanto con Win98se...
Addirittura, la routine di cui sopra č un estratto di un'altra piů lunga che
ho scritto per compattare e ripristinare un db di Access da VB, e io l'ho
sempre usata con successo anche in altre situazioni. Ha sempre funzionato,
anche su WinMe, Win2k e XP. L'unica volta che non ha funzionato č stato
quando l'ho testata, prima di postarla l'altro ieri, su un file .txt, e
anche qs. non era mai successo.


 molto strano
si .. pero' ho provato questo postato da Rafunk  e funziona :
http://vbnet.mvps.org/index.html?code/fileapi/createfile_inuse.htm
--
Fosco