+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Copia di cartelle e file problematico per file "in uso" nella lan

  1. #1
    mandrak non è in linea Scolaretto
    Luogo
    Genova
    Post
    487

    Copia di cartelle e file problematico per file "in uso" nella lan

    Ciao a tutti

    Molto tempo fa con il VB5 avevo creato un piccolo programma che ad una determinata ora doveva effettuare la copia di
    numerose cartelle, sotto cartelle aventi numerosissimi file di svariati tipi, (excel,word,txt,pdf ecc).
    Il progamma avviato su un Windows 2003 ha sempre funzionato eggregiamente e ancora oggi "gira".
    Il programma però, ben presto mi sono accorto che aveva un problema; non riusciva a copiare file eventualmente "in uso" da utenti remoti, (nella mia lan). In quel caso, il programma si è sempre interrotto con l'avviso "Impossibile copiare ..... file gia in uso da un'altro utente o programma". Oramai stufo di chiedere di chiudere sempre i file aperti, sono qui a chiedere se esiste un modo per il quale il programma, (ora in vb6), riesca a copiare ugualmente il file lasciato aperto, oppure a
    "scavalcarlo", (informadomi in un file di log) e proseguire nella copia fino alla fine.
    Come richiesto inserisco non l'intero listato del programma ma le parti esenziali per l'operazione della copia :

    In un modulo ho inserito :
    codice:
    Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
    Public Type SHFILEOPSTRUCT
            hwnd As Long
            wFunc As Long
            pFrom As String
            pTo As String
            fFlags As Integer
            fAnyOperationsAborted As Boolean
            hNameMappings As Long
            lpszProgressTitle As String '  usato solo se FOF_SIMPLEPROGRESS
    End Type
    'costanti per wFunc
    Public Const FO_COPY = &H2
    Public Const FO_DELETE = &H3
    Public Const FO_MOVE = &H1
    Public Const FO_RENAME = &H4
    'costanti per fFlags
    Public Const FOF_ALLOWUNDO = &H40
    Public Const FOF_CONFIRMMOUSE = &H2
    Public Const FOF_FILESONLY = &H80                  '  con *.*, elabora solo i file
    Public Const FOF_MULTIDESTFILES = &H1
    Public Const FOF_NOCONFIRMATION = &H10             '  Non richiede conferma All 'utente.
    Public Const FOF_NOCONFIRMMKDIR = &H200            '  non conferma la creazione di directory necessarie
    Public Const FOF_RENAMEONCOLLISION = &H8
    Public Const FOF_SILENT = &H4                      '  non crea un rapporto avanzamento
    Public Const FOF_SIMPLEPROGRESS = &H100            '  non visualizza i nomi dei file
    Public Const FOF_WANTMAPPINGHANDLE = &H20          '  Inserisce SHFILEOPSTRUCT.hNameMappings
    nella form :
    codice:
    With shFileOp
        .hwnd = Me.hwnd
        .pFrom = Da  'Cartella origine
        .pTo = A     'Cartella destinazione
        .wFunc = FO_COPY
        .fFlags = FOF_NOCONFIRMMKDIR Or FOF_NOCONFIRMATION
    End With
    DoEvents
    SHFileOperation shFileOp
    Ultima modifica di AntonioG; 18-12-2018 21:44 

  2. #2
    mandrak non è in linea Scolaretto
    Luogo
    Genova
    Post
    487
    Mi scuso per l'inserimento delle parti di codice direttamente nella descrizione, ma non ricordo i comandi per inserirli correttamente nella descrizione del problema.
    La memoria inizia a "perdere colpi"....

  3. #3
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Post
    2,825
    Ho provato a riprodurre il caso da te narrato. Ho incollato il tuo codice in un mini-programma ed ho provato a copiare un file di word aperto da un altro utente in un altro PC della rete locale, verso il mio PC: la copia avviene senza alcuna segnalazione di errore.
    Mi sorge un dubbio: non è che il file aperto che provoca il messaggio è quello di destinazione anziché quello di partenza ?
    Il regolamento del forum: la prima cosa da leggere.

  4. #4
    mandrak non è in linea Scolaretto
    Luogo
    Genova
    Post
    487

    Direi di no.
    Nella cartella di destinazione è facile che ci sia gia il file, ma dovrebbe essere sostituito senza chiedere nulla. la cartella di destinazione poi non è conosciuta agli altri della rete e quindi non può essere in uso.
    Ora che ci penso, ma forse non centra nulla, tutte le volte che ho questo problema, è su file excel lasciati aperti o il programma si blocca sempre nel tentativo
    di copiare nella cartella di destinazione file Excel aperti. I file excel sono per caso come quelli .pst outlook ?
    Per "tagliare la testa al toro" è possibile far intercettare l'errore al programma e saltare solamente il file bloccato, (scrivendo in un file il nome di quest'ultimo)
    e proseguire il lavoro ? Giornalmete potrei verificare e salvare gli eventuali file a mano, ma tutto il resto è gia al sicuro e sono centinaia di file, cartelle ... ecc...

  5. #5
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Post
    2,825
    Proverò anche con i file di Excel.
    Quote Originariamente inviato da mandrak Visualizza il messaggio

    è possibile far intercettare l'errore al programma e saltare solamente il file bloccato, (scrivendo in un file il nome di quest'ultimo) e proseguire il lavoro ?
    Certamente. Con una normalissima gestione del codice di errore. (On Error…, If Err.Number…, Resume…)
    Il regolamento del forum: la prima cosa da leggere.

  6. #6
    mandrak non è in linea Scolaretto
    Luogo
    Genova
    Post
    487
    Benissimo...
    In effetti nela routine di "Copia" non era inserita la gestione degli errori.
    Modifico la routine:

    codice:
    Sub Copia()
    
    'Stop
    On Error GoTo ErrorenellaCopia
    With shFileOp
        .hwnd = Me.hwnd
        .pFrom = Da 'Cartella origine
        .pTo = A 'Cartella destinazione
        .wFunc = FO_COPY
        .fFlags = FOF_NOCONFIRMMKDIR Or FOF_NOCONFIRMATION
    End With
    DoEvents
    SHFileOperation shFileOp
    
    ErrorenellaCopia:
    Filebloccato= ......
    Resume Next
    
    End Sub
    Come posso estrarre il nome del file bloccato ed inserirlo in una variabile ?

  7. #7
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Post
    2,825
    Non credo che sia possibile. Non avevo capito che stai copiando una intera directory.
    Potresti fare un loop che copia un file alla volta ?
    Ultima modifica di Brontolo; 23-12-2018 12:44 
    Il regolamento del forum: la prima cosa da leggere.

  8. #8
    mandrak non è in linea Scolaretto
    Luogo
    Genova
    Post
    487
    Ciao.....
    No perche le catelle e i file sono tantissimi e impiegherebbe moltissimo tempo.
    Non c'e un sistema ?, qualche API .....
    Potrei, come prova, inserire nel programma delle istruzioni che bloccano la scheda di rete, in questo modo chi è connesso, viene scollegato
    e alla fine della procedura, rieffettuare l'attivazione della scheda di rete.
    Ci sono delle istruzioni in vb6 per fare ciò ?
    Ultima modifica di mandrak; 28-12-2018 17:12 

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi