Newsgroup: it.comp.lang.visual-basic
Titolo: Interferenza fra CopyFile e Jet

Situazione:
Server W2000ServerSP4, con sopra un mio servizio che, ogni tot secondi, 
accede a una risorsa condivisa *in sola lettura* su una macchina W2kPro, 
copia un file Mdb di Access97, da tale condivisione, in locale (usando 
FileSystemObject.CopyFile), e poi spippola in locale su tale file se è 
venuto copiato correttamente.
Sulla macchina con W2kPro (che non gestisco io), gira un applicativo 
(anch'esso unattended ma in consolle, non un servizio) che ogni tot secondi 
deve aprire una connessione JET sul file Mdb di cui sopra. La sw house che 
segue quest'ultimo applicativo, mi riporta che ogni tanto hanno un errore 
3045 "Couldn't use 'Statistiche.mdb'; file already in use.", e a loro dire 
potrebbe essere il CopyFile che tiene in qualche modo bloccato il file mdb.
In prima battuta, sono tentato di dire che la cosa è impossibile, visto che 
ho preteso, e ottenuto, che la condivisione fosse in sola lettura, proprio 
per non essere tirato in ballo da questi casini.
Però, il ragazzo che mi muove questi appunti è tutt'altro che coglione, e 
sono portato a dargli credito.
Su Google ho trovato discussioni sul caso opposto, ossia se si possa copiare 
un file Access mentre questo è in uso da Jet, ma niente sul fatto di poter 
aprire una connessione Ado+Jet mentre è in corso una copia.
Qualcuno ha opinioni/esperienze in merito?
Alberto
-- 
"C'è un Calvelli dentro ognuno di noi" (cit.) 



Dico la mia.
Io proverei a loggare le mie operazioni di copia e quelle di accesso
al db per verificarne la concomitanza in caso di errore.
Potresti anche provare a settare i tuoi diritti a CHANGE sulla
cartella e READ ONLY sul file mdb.
Sembra comunque che sia un problema che viene fuori spesso, es. in
concomitanza di backup su nastro.
Ciao

 concomitanza di backup su nastro.
Il log c'è già, ma quando il loro applicativo si inchioda (in conseguenza 
del lock, che non gestiscono), il file diventa inutilizzabile anche per me, 
per cui non si riesce a stabilire esattamente quale cosa provoca l'altra.
Anzi, in realtà l'ho scoperto: ho creato una situazione di prova qui nella 
mia rete.
Se un client sta copiando un file, questo file è bloccato, anche se la 
condivisione è in sola lettura. E' una puttanata, perchè se su un server io 
avessi un file che voglio rinominare o eliminare, al massimo dovrebbe 
segnalarmelo, ma se in una Lan ho mille utenti che lo stanno copiando, non 
posso aspettare che tutti finiscano, o dover terminare la condivisione, 
creando altri casini...
Ciao




In realtà subito dopo il post avevo pensato anch'io alla stessa cosa.
Un file è un file...e nell'ipotesi dei mille utenti occorre
effettivamente buttare tutti fuori dalla condivisione.
Comunque, di workaround ce ne sono parecchi:
Cominciare la copia se non c'é l'.ldb, copiarlo prima sul server
stesso e *copiarsi la copia* in rete, caricarselo in binario ecc..
Ciao

 caricarselo in binario
Questa la provo...


 ha scritto

non sono sicuro di avere capito, ma per copiare fra i e dai server alcuni
mdb a cui accedono app dao e ado uso SHFileOperation, e non ho mai avuto
messaggi di file in uso.
ciao, a.

 mai avuto messaggi di file in uso.
Non mi sono spiegato bene: io uso 
ScriptingRuntime.FileSystemObject.CopyFile, e non ho mai avuto errori. E' 
l'applicativo che tenta di scrivere sul file MDB (con Ado+Jet), che riceve 
un errore se tenta quetsa scrittura mentre io sto copiando.
Ciao


 un errore se tenta quetsa scrittura mentre io sto copiando.
allora avevo capito bene. anche la filecopy di vb credo dia problemi in casi
simili. non posso garantirti niente, perche' l'unico db che viene
_senz'altro_ scritto durante la copia (che avviene un 2-4 volte al giorno su
diverse macchine) è un dbf, di wingate. sugli mdb non ho certezze di
contemporaneita'. pero' una prova con l'api la farei, è stata suggerita
varie volte per problemi simili.
ciao, a.

 stata suggerita varie volte per problemi simili.
Ho fatto la prova con SHFileOperation, ma il file originale viene comunque 
bloccato.


 il file mdb.
Evidentemente la CopyFile blocca il file, il che è indipendente dai permessi 
sul filesistem.
Semplicemente dice "questo file lo sto usando io e finchè non ho finito non 
c'è trippa per gatti".
Access dal 97 in poi funziona diversamente perchè lo apre in modo "non 
esclusivo" (il Access95 come modalità predefinita apriva un mdb in accesso 
esclusivo e tutti gli altri potevano solo leggere.
Dato che Access97 lo apre, prima di tutto, in lettura scrittura questo gli 
dice picche.
Puoi provare anche tu: fai una open sul file con un Deny su accessi esterni 
e prova ad aprire l'mdb da access.
D'altra parte mi pare stupido che mentre io mi sto facendo una copia di 
backup uno mi modifica il DB, anche se non ho mai capito come sia possibile 
fare una cosa del genere ad es. da esplora risorse.
Hai provato a usare funzioni di copia più "morbide" come la FileCopy di VB o 
a fartene una che fa la copia del file con la Open in modo "Shared"?
Ciao 

 "Shared"?
Ho creato un ambientino di prova, ossia un file mdb gigantesco (in modo che 
la copia duri molto), su un server che controllo con Terminal Server, poi 
dal mio pc provo a copiare verso il mio disco locale, con diversi metodi.
FileCopy, FSO, SH, niente da fare.
Se Access tenta di aprire (anche in modalità assolutamente condivisa, perchè 
il blocco non è di Access, ma proprio a livello di File-System), va in 
errore.
L'unica soluzione è stata quella di modificare l'applicativo che usa Access, 
in modo da gestire l'errore, e ritentare dopo pochissimi istanti (la 
versione attuale, all'avvenire dell'errore ripristinava un backup 
sovrascrivendo il file buono, con conseguenti casini immani).
Se qualcuno trova il modo di copiare un file mdb senza interferire con 
l'accesso di Access, io ho il mio ambientino sempre pronto, e posso provare.
Ciao


 provare.
Provato con la CopyFile di sistema?
Ciao