Newsgroup: it.comp.lang.visual-basic
Titolo: comparare due directory

Salve a tutti e buon anno. Avrei un piccolissimo problema:
devo comparare due directory, cioè devo sapere quali sono gli elementi
comuni delle due, cancellare da una gli elementi non comuni e copiarne degli
altri dall'altra. Mi spiego meglio, ho due dir, una contiene gli elementi A
+ B, un'altra B + C. Devo quindi cancellare A dalla prima e copiare C sempre
nella prima.
Avrei pensato di dichiarare due matrici, inserirci gli elementi della prima,
confrontare uno ad uno gli elementi della seconda con gli elementi della
matrice. poi procedere con le altre operazioni. Il problema però è che nelle
dir, ci saranno un migliaio di elementi; non sarà troppo? Esiste una
funzione in VB o un'api per far ciò che mi serve? Grazie a tutti.


Provo a darti una soluzione molto semplice...magari potrebbe
funzionare però :)  Dichiarare un array...potrebbe servirti,
logicamente se non sei tu a doverlo popolare, perchè come dici te
nelle dir c'è troppa roba. Quello che io farei è caricarmi il
contenuto dell' intera dir A in un array A e il contenuto della dir B
in un array B. Con la funzione DIR, senza passargli valori:
pippo = dir$(path_della_directory)
(con il dollaro embra essere più veloce, perchè??) riesci a prendere
tutto il suo contenuto (della dir specificata). In questo modo puoi
caricarti un array automaticamente:
type mioarray
   strnomefile as string
end type
......
......
.....
  strfile = dir$(path_dir)
   if strfile <> "" then
       'ridimensioni l' array
       redim mioarray(0 To 0)
       'in questo modo se la dir non è vuota ti prendi il primo file
       mioarray.strnomefile = strfile
       'prendi il secondo file
       strfile = dir$(path_dir)
       'e ora esegui il ciclo finche non prende tutti i file
       do while strfile <> ""
             redim preserve mioarray(0 To ubound(mioarray) + 1)
             mioarray.strnomefile = strfile
             strfile = dir$(path_dir)
        loop
       'caricato il primo array passa al secondo
  else
       'la dir è vuota
  end if
.....
....
....
Io ti consiglio di chiamare una funzione che ti carica l' array, da
dentro una sub, gli passi due valori, il path della dir che ti
interessa e l' aarry vuoto, ma già dichiarato con dim dentro la sub.
La funzione ti ritorna un valore boolean, se carica qualcosa nell'
array ti ritorna true, altrimenti false. Dopo aver fatto la chiamata
alla funzione testi il valore che ti ritorna e vedi se caricaree anche
il secondo o se bloccare tutto.
Una volta che hai il contenuto delle dir, li confronti uno ad uno e
vedi che fare. Ti basta un semplice ciclo do anche li.
Non ho provato il codice, ma dovrebbe funzionare, almeno il concetto è
buono :)) Dovrai cambiare sicuramente i nomi delle variabili...ma lì,
vedi un po te :))
Saluti...

 Avrei pensato di dichiarare due matrici, inserirci gli elementi della
prima, confrontare uno ad uno gli elementi della seconda con gli elementi
della matrice. poi procedere con le altre operazioni. Il problema però è che
nelle dir, ci saranno un migliaio di elementi; non sarà troppo? Esiste una
funzione in VB o un'api per far ciò che mi serve?
Un migliaio non e` tanto ma, se proprio non vuoi usare array, potresti fare
un ciclo con Dir$ rispetto a Dir1 e intercettare l'errore restituito da Open
in Dir2 e agire analogamente con Dir2 rispetto a Dir1. Una cosa del tipo:
Option Explicit
Private Sub Main( _
)
  Dim strFolder1  As String
  Dim strFolder2  As String
  Dim strFile     As String
  Dim intFile     As Integer
  Dim lngErr      As Long
  strFolder1 = <...>
  strFolder2 = <...>
  strFile = Dir$(strFolder1 & "\*.*")
  Do While Len(strFile)
    Debug.Print strFile
    intFile = FreeFile(0)
    On Error Resume Next
    Open strFolder2 & "\" & strFile _
      For Input Access Read As #intFile
    With Err
      lngErr = .Number
      .Clear
    End With
    If lngErr Then
      Kill strFolder1 & "\" & strFile
    Else
      Close #intFile
    End If
    strFile = Dir$
  Loop
End Sub
Verifica bene perche' mi viene il dubbio di aver valutato male qualcosa...
:-(
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

Nel tuo codice non capisco bene il luppamento per caricare nell' array
tutti i file (ma perchè usi "Do While Len(strFile)"??) Hai visto anche
quello che ho postato io, o lo hai bocciato appena hai letto il mio
nick?? :))
Saluti...

 tutti i file (ma perchè usi "Do While Len(strFile)"??) Hai visto anche
quello che ho postato io, o lo hai bocciato appena hai letto il mio nick??
:))
Mi riservo di leggerlo con calma questa sera per non fartene passare liscia
nemmeno una, esclusa ovviamente grammatica e sintassi che sono appannaggio
di pal. ;-)))
Scerzi a parte, tu piuttosto verifica se non ho scritto scemenze perche'
mentre inviavo m'e` venuto qualche dubbio, grazie.


mentre inviavo m'e` venuto
qualche dubbio, grazie.
Io ho poco da verificare...non seguo molto il
tuo codice, aspetto spiegazioni :)) Secondo me, il mio, resta più pulito
:)) Hehehe, intediamoci, non stò sfidando l' olimpo del vb, è solo che ti
vedo dare quasi sempre risposte per ultimo, quando il problema è ormai iper
tagliato, e in ogni modo  riesci a tirare fuori sempre qualche soluzioni
più o meno bovina...non riesco a imitare il tuo modo di programmare :))
Rispondi per primo qualche volta, e non attappare i buchi delle altre
risposte, ma facci vedere una soluzione pulita tutta tua, dall' inizio alla
fine. Non tanto il "si potrebbe fare..." ma un bel "secondo me è meglio..."
Chi lo sa che non assimilo anche qualcosa di tuo e che non cambio il mio
nick in Skunk Borrelli ;))
Saluti...
--------------------------------
Inviato via 
http://usenet.iol.it
 

 ha scritto nel messaggio
news:92up1g$unl$1...@lacerta.tiscalinet.it...

aggiungi al progetto il riferimento del Microsoft Scripting Runtime eprova
il seguente codice
    Dim fso As Scripting.FileSystemObject
    Dim sourceFolder As Scripting.Folder
    Dim destFolder As Scripting.Folder
    Dim sourceFile As Scripting.File
    Dim destFile As Scripting.File
    Dim flgSame As Boolean
    Set fso = New Scripting.FileSystemObject
    Set sourceFolder = fso.GetFolder("C:\PIPPO")
    Set destFolder = fso.GetFolder("D:\PLUTO")
    For Each sourceFile In sourceFolder.Files
        flgSame = False
        For Each destFile In destFolder.Files
            If sourceFile.Name = destFile.Name Then
                If sourceFile.DateLastModified = destFile.DateLastModified
Then
                    If sourceFile.Size = destFile.Size Then
                        flgSame = True
                    End If
                End If
            End If
        Next
        If flgSame Then
            Debug.Print sourceFile.Name
        End If
    Next
lavoraci sopra un minimo e alla fine otterrai quanto da te richiesto;
ciao

 ha scritto nel messaggio
news:92up1g$unl$1...@lacerta.tiscalinet.it...

1000 file non sono troppi per delle matrici di stringhe ... un po' di tempo
fa, per fare la stessa cosa ho fatto una cosa del genere (che funzionava
anche nel caso ci fossero delle sottodirectory):
- ho creato due file di testo, uno per ogni directory; i file contenevano
l'elenco dei file di ogni directory; per crearli ho usato dal prompt di DOS
(che professionista vero ?) "DIR *.* /s > file1.txt". A tale comando ho
aggiunto i parametri per l'ordinamento alfabetico, per la scrittura in
maiuscolo del nome del file e l'opzione "cartelle prima dei file"; ora
questi parametri non me li ricordo ma li puoi trovare su qualche help.
- da un programma VB ho aperto i due file di testo e, leggendoli
sequenzialmente, annotavo le differenze.
Sicuramente esistono tecniche molto più raffinate ma nel mio caso, in pochi
minuti ho risolto il problema ...
Saluti

 Chi lo sa che non assimilo anche qualcosa di tuo e che non cambio il
mionick in Skunk Borrelli ;))
Oh questa poi! Vuoi provocare un uomo tranquillo?! O vuoi farmi soffrire?
--
Ciao :-)


Oh questa poi! Vuoi provocare un uomo tranquillo?! O vuoi farmi soffrire?
No no, spetta, io intendevo dire, che a volte mi piacerebbe vedere
come voi (te e qualche altro) risolvete e affrontate un problema dall'
inizio, invece di intervenire solo alla fine e affinare quello che
hanno detto gli altri. Io stò cercando solamente di vedere come voi
approcciate ai problemi in modo da farlo anche io, da copiarvi il modo
di pensare. Tutto qui. Poi, per la cosa dello "Skunk Borrelli" era
solo un gioco, non volevo ne provocare e ne far soffrire nessuno.
Saluti...

 Poi, per la cosa dello "Skunk Borrelli" era solo un gioco, non volevo ne
provocare e ne far soffrire nessuno.
Vai a rileggere il mio post e guarda cosa c'e` dopo il "Ciao" nella firma.
Anche i particolari contano. ;-)
--
Ciao.


E chi dirà più niente...mi hai fatto a pezzi, e secondo me ti sei risentito
un po troppo per quello che ho detto, considerando che non c' era nessuna
cattiveria o velo polemico :-| Ok, io esco dal thread...ma il diretto
interessato non è mai intervento? Bhò...vabbè, io mi ritiro trà i fischi e
gli applausi delle signorine qui presenti :))


 E chi dirà più niente...mi hai fatto a pezzi, e secondo me ti sei
risentito un po troppo per quello che ho detto, considerando che non c' era
nessuna cattiveria o velo polemico :-| Ok, io esco dal thread...ma il
diretto interessato non è mai intervento? Bhò...vabbè, io mi ritiro trà i
fischi e gli applausi delle signorine qui presenti :))
Tutto qui? Abbiamo gia` finito?
--
Ciao :-)
