Newsgroup: it.comp.appl.access
Titolo: File di testo Aperto ??

Ciao a tutto il NG.
Sul Web nn riesco a trovare nulla, c'è una funzione per verificare se un
file di testo è già aperto da un'altra applicazione???..
Grazie 1.000.000
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Ciao a tutto il NG.
Sul Web nn riesco a trovare nulla, c'è una funzione per verificare se un
file di testo è già aperto da un'altra applicazione?
Grazie anticipatamente


 Grazie 1.000.000
Cerca il file temporaneo con dir
-- 
-- 
MAssimiliano Amendola
www.accessgroup.it
Cisa - Conferenza Italiana Sviluppatori Access

 Cerca il file temporaneo con dir
Mi spiego meglio,
Ho sviluppato un'applicazione che on-time va a cercare in una determinata
directory se è presente un certo file ".TXT", lo apre e popola delle
tabelle.
Questo file viene generato e uploadato da un altro applicativo, ovviamente
se questo lo stà ancora scrivendo io nn riesco ad aprirlo e purtroppo nn
ho notato la presenza di nessun ".TMP"
Forse con qualche API ??
Grazie


 
<macchinoso on>
ne fai una copia
provi a cancellarlo
se ottieni un errore (in uso) riprova più tardi
altrimenti ripristina la copia e popolalo
<macchinoso off>
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\

Ammammata ha scritto:



macchinoso ma funzia, 
se nn c'è altro metodo, 
userò questo.


 
bene, son contento, chissà mai che tu abbia una risposta al mio problemino 
un paio di post più giù (o su, a seconda di come uno li visualizza...)



io uso questa funzione:
Function FileLocked(strFileName As String) As Boolean
   On Error Resume Next
   ' If the file is already opened by another process,
   ' and the specified type of access is not allowed,
   ' the Open operation fails and an error occurs.
   Open strFileName For Binary Access Read Write Lock Read Write As #1
   Close #1
   ' If an error occurs, the document is currently open.
   If err.Number <> 0 Then
      '' Display the error number and description.
      'MsgBox "Error #" & Str(Err.Number) & " - " & Err.Description
      FileLocked = True
      err.Clear
   End If
End Function
e la richiamo:
    If Not FileLocked(NomeFile) Then
...............................
..............................
Saluti
Paolo

 ha scritto nel messaggionews:Xns9AC7B80D92AB3am...@194.177.97.96...> 
g.brigug...@ecrsystem.it
 (Jason) wrote in

Stavo suggerendo la stessa cosa... meno male che ho letto tutto.
@Alex

 @Alex
E se qualcos'altro apre il file nei millisecondi che passano tra If Not
FileLocked(NomeFile) ed il successivo Open? Sicuramente sarà difficile che
succeda ma teoricamente è possibile.
Non capisco perchè complicarsi la vita scrivendo una funzione a parte
quando basta aprire il file con Open e verificare se dà errore o meno
  On error resume next
  Open nomefile .....
  If err.number > 0 then .......
  On error goto 0
Ciao.
-Marco-


On 25 Giu, 12:40, 
marco.pizzamig...@gmail.com
 (Marco Pizzamiglio)
wrote:

E' esattamente la stessa cosa.
Quello che suggerisci tu e quello che fa Paolo sono uguali... ma la
funzione di Paolo è riutilizabile, quello che dici tu è ENTROPIA
inutile a mio avviso non riutilizzabile, in quanto entrambi sono 2
letture SINCRONE.
Usando il concetto che hai espresso, di cui sono terrorizzato, non
dovremmo programmare ad oggetti, cosa opinabile se vuoi... ma
tant'è...!
@Alex

 ha scritto nel messaggio 
news:3cbde070-be07-47c6...@26g2000hsk.googlegroups.com...



@Alex
:-)
(posso inviarti un msg in pvt?)
Saluti
Paolo 

(Jason) wrote in news:g3r3s6$oj0$
1...@news.newsland.it
:
[cut]
ehm... JASON č il nick che mi hanno dato alcuni colleghi inglesi
stavo preparando un elenco e nella colonna dei mesi avevo scritto:
J uly
A ugust
S eptember
O ctober
N ovember
from then since I was Jason ;)


 Paolo
Grazie per la funzione,
mi ero perso con le API e in effetti bastava controllare l'errore
dell'apertura del file.
X la diatriba su dove controllarlo, sicuramente meglio in una funzione a
parte, così facendo il codice è + "NORMALIZZATO" e ci si può creare un
modulo di "Tools" che si può utilizzare con tutti i progetti.
Grazie ancora
Jason


 @Alex
..l'hai detto tu che sono la stessa cosa, strano che una ti terrorizzi
tanto e l'altra no! ;-)


 Ciao.
Credo tu possa aver frainteso il senso ... !
Ciao
@Alex

 Paolo-
Certo.
@Alex

 cosa che mi pare possa impiegare 3ms...!
Provo a spiegare meglio. La sequenza delle operazioni usando la function è:
   .......
   <inizio function>
1. apri il file
2. chiudi il file
3. verifica se c'è stato un errore
4. restituisci il valore, vero o falso
   <fine function>
5. testa il valore restituito dalla function
6. apri il file
7. leggi il file
8. ...elabora i dati...
9. chiudi il file
Cosa succede se dopo il punto 2. ma prima del 6. qualche altro processo
apre e blocca il file?
Ormai la function avrà già dato parere positivo (file libero) visto che
non ci sono stati errori al punto 1., quindi il test al punto 5. crederà
erroneamente che il file sia libero e tenterà di eseguire il 6. che darà
errore perchè in realtà il file è bloccato da un altro processo.
Questo perchè il file viene aperto, richiuso e poi riaperto (punti 1. 2. e
6.), ed è possibile che nel frattempo qualche altro processo lo blocchi.
Caso remoto, come già detto, ma teoricamente possibile.
Io invece suggerivo:
1. apri (e blocca) il file
2. se err.number=0 usa il file 
   altrimenti attendi e riprova ad aprirlo più tardi
3. leggi il file
4. ...elabora i dati...
5. chiudi il file
Aprendolo una volta sola non è possibile che il file sia bloccato da altri
processi. O lo apre o non lo apre, e se lo apre lo puoi sicuramente
utilizzare.
Più veloce (una sola apertura anziché due), più sicuro, ma non
riutilizzabile, va riscritto ogni volta.
Con la function il problema sta tutto nel fatto che il file viene aperto
due volte e non si sa cosa può succedere tra la prima e la seconda
apertura.
Un'alternativa sarebbe utilizzare una function che apre il file e lo tiene
aperto, restituendone il numero oppure zero se non è riuscita ad aprirlo.
dim numfile as integer
numfile=aprifile("C:....")
if numfile>0 then
  ...usa il file...
  (Input #numfile,variabile o Get numfile,,variabile)
  Close numfile
end if


 -Marco-
Ma... non ci vedo motivo di cercare il CAPELLO... sinceramente...!
@Alex

 @Alex
Avevo visto il Lock, ma è del tutto inutile dato che chiudi il file subito
dopo. Il problema non è nel metodo che scegli per testare se il file è
libero o no (Open, API..., Binary, Random, Lock o non Lock).
Faccio notare che nel codice in questione, che riporto qui sotto, ci sono
*DUE*, dico *DUE* chiamate alla funzione Open, una dentro alla Function ed
un'altra nel codice principale. Nel brevissimo intervallo che intercorre
tra l'esecuzione della prima Open e l'esecuzione della seconda il file E'
LIBERO (perchè viene chiuso con Close #1) e pertanto potrebbe essere
bloccato da altri programmi.
Function FileLocked(strFileName As String) As Boolean
On Error Resume Next
  Open strFileName For Binary Access Read Write Lock Read Write As #1
  Close #1
  If err.Number <> 0 Then
    FileLocked = True
    err.Clear
  End If
End Function
If Not FileLocked(NomeFile) Then
  Open NomeFile For ........
  ..........
Come è noto Windows può eseguire più programmi contemporaneamente, e lo fa
eseguendoli a pezzi, concedendo ad ogni processo un certo tempo CPU (per
processi intendo quelli che si possono vedere nel Task manager e che sono
tutti contemporaneamente in esecuzione).
Pertanto nessuno può garantire che l'esecuzione del codice di cui sopra si
svolga ininterrottamente.
DURANTE l'esecuzione della Function (subito DOPO IL CLOSE #1, quindi
quando il file E' DI NUOVO LIBERO, ma PRIMA del termine della function) il
sistema operativo potrebbe sospendere l'esecuzione del processo
MSAccess.exe e passare il controllo della CPU ad un altro processo (es.
WinWord.exe) che potrebbe aprire e bloccare il file.
Quando il sistema operativo ritorna il controllo a MSAccess.exe
l'esecuzione della function continuerà dal punto in cui si era interrotta,
e la function restituirà il valore di FILE LIBERO visto che la prima Open
non aveva generato errori, mentre in realtà il file è stato aperto e
bloccato da Word. Access e la sua Function non hanno modo di sapere che la
loro esecuzione è stata interrotta dal sistema operativo e che nel
frattempo un altro processo ha bloccato il file.
Pertanto LA SECONDA chiamata ad Open, non quella dentro alla Function ma
quella che viene fatta per leggere effettivamente il file, darà errore.
Caso limite, probabilità prossima allo zero... ma NON zero! ;-)
Per Jason: non spaventarti, usa pure la Function e non avrai problemi,
ogni tanto su questo newsgroup ci divertiamo a disquisire e scambiarci
opinioni su minuzie e sfumature del codice!


 modulo di "Tools" che si può utilizzare con tutti i progetti.
rileggi attentamente quanto scritto da Marco Pizzamiglio.
Ti ricordo la legge di Murphy
« Se qualcosa può andare storto
lo farà. »
:-)
--
Giorgio Rancati
[Office Access MVP] 

 lo farà. »
Quando? Nel momento meno opportuno.
Come? Procurando il massimo danno possibile.
:-)
--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/

On 25 Giu, 18:05, 
marco.pizzamig...@gmail.com
 (Marco Pizzamiglio)

Pur condividendo la tua esposizione tecnica... non mi preoccuperei per
questo tema... anche se la SFIGA ci vede benissimo...!
Certo che beccare quei 3ms per fregarmi sarebbe veramente un Cecchino
la CPU...!
;-)
Ciao
@Alex

 @Alex
Anche secondo me non ci sono problemi nell'usare la function.
Ma pensando ai processi che normalmente girano su un PC, se hai antivirus,
antispyware, utility di defrag e backup manager che accedono ai files in
background a loro discrezione la probabilità cresce... e prima o poi ti
frega! E se capita sarà sicuramente durante le ferie quando sei in
spiaggia in pieno relax!
A proposito... la prossima settimana vado in Croazia, un saluto a tutti!


 -Marco-
Cavolo Marco... hai ridotto anche i Km da fare per le ferie...?
Sei peggio dei Genovesi.... ;-)
Per me niente vacanze quest'estate.... quindi tutto un dritto fino a
Novembre...
sarà dura, ma resisto.
Ciao Buone ferie.
@Alex

 @Alex
Nonostante il costo della benzina non ho ridotto i km, li mantengo sempre
uguali! E' ormai da 10 anni che vado in Croazia dalle due alle otto volte
ogni estate, ce l'ho a meno di due ore, spesso mi faccio 2 o 3 giorni di
mare nei weekend. Se vuoi farti un giro da quelle parti avvisami che ti dò
un paio di indicazioni. Per chi ce l'ha consiglio la moto.
Ed ero proprio a Genova e dintorni ai primi di giugno, bei posti anche là!
Tu non mollare, resisti, fortuna che c'è qualcuno che porta avanti il ng
anche d'estate! A nome di tutti i vacanzieri... saremo moralmente con voi!
Ciao.


 -Marco-
Quando poi torni dalle vacanze vieni alla CISA!!!!
e non ammetto discussioni o ti taglio le ruote della moto!
B-]


 ha scritto nel messaggio 
news:g3vnpl$kek$1...@news.newsland.it...

Io ho la moto e se non ho intoppi andrò in croazia dal 12 al 19 ... il 20 
poi CISA!!
Non il passo ;-)) ...anche se da fare in moto si gode!!
Ciauz
-- 
Roberto da Parma