Newsgroup: it.comp.lang.visual-basic
Titolo: Copia directory, sottodirectory e files

Ciao a tutti,
devo copiare la directory "C:\USERS" con relative sottodirectory ed i
files in esse contenuti sul disco D:.
C'e' un'alternativa al ripetere il ciclo di MkDir e Copyfile per
ognuna delle sottodirectory?
Andrebbe bene qualunque soluzione (OCX, DLL, BAS) tranne l'esecuzione
tramite Shell MS-DOS di XCOPY e simili.
Grazie per l'attenzione.
------------------------------------
per il reply rimuovi xyz dall'e-mail
------------------------------------

Cerca SHFileOperation nel sito comune...
Altrimenti rispondi qui che posto un ezempio...
--[GbC]--

 tramite Shell MS-DOS di XCOPY e simili.
Curiosita': perche' escludi "Shell MS-DOS di XCOPY e simili"? (Intendiamoci,
con questo non e' che voglia consigliartelo, solo conoscere le tue ragioni).
--
Ciao.
Maurizio

con questo non e' che voglia consigliartelo, solo conoscere le tue ragioni).
Perche' ho bisogno che la copia dei files avvenga automaticamente ad
un'ora prestabilita e che non resti aperta la finestra MS-DOS al
termine.
Se sai come risolvere quest'ultimo problema forse mi puo' andare bene
anche l'XCOPY.
Ciao.



Purtroppo non sono riuscito a trovarlo sul sito comune. 
Grazie ancora se vorrai aiutarmi.


 anche l'XCOPY.
Sicuramente quello che segue non e' codice da consigliare per l'XCOPY ma
potrebbe andar bene anche per altro per cui te lo sottopongo. In parte e'
anche figlio di qualche visita al Sito comune:
Private Const SYNCHRONIZE As Long = &H100000
Private Const INFINITE    As Long = &HFFFF
Private Declare Function GetWindowsDirectory& _
  Lib "kernel32" _
  Alias "GetWindowsDirectoryA" ( _
    ByVal lpBuffer$ _
  , ByVal nSize& _
  )
Private Declare Function OpenProcess& _
  Lib "kernel32" ( _
    ByVal dwDesiredAccess& _
  , ByVal bInheritHandle& _
  , ByVal dwProcessId& _
  )
Private Declare Function WaitForSingleObject& _
  Lib "kernel32" ( _
    ByVal hHandle& _
  , ByVal dwMilliseconds& _
  )
Private Declare Function CloseHandle& _
  Lib "kernel32" ( _
  ByVal hObject& _
  )
12345678901234567890123456789012345678901234567890123456789012
'// È la procedura fondamentale dell'applicazione.
'   Viene composta una stringa col comando DOS che verrà
' passata alla funzione Shell il cui valore di ritorno sarà
' usato per verificare il termine dell'esecuzione.
'   True se l'esecuzione ha esito positivo.
'
Private Function booExecuteDosCommand( _
ByVal strParams As String _
) As Boolean
Dim s_Cmd    As String
Dim b_Ret    As Boolean
Dim s_WinDir As String
  On Local Error GoTo Err_booExecuteDosCommand
  ' Riceve il percorso della cartella di Windows.
  Let s_WinDir = GetWinDir$
  If Len(s_WinDir) > 0 Then
    ' s_Cmd riceve il comando DOS.
    ' Per ulteriori informazioni, dal Prompt di DOS digitare:
    '   >command /?[Invio]
    Let s_Cmd = s_Cmd & s_WinDir & "\
COMMAND.COM
"
    ' In fase di test può essere utile sostituire /C con /K.
    Let s_Cmd = s_Cmd & " /C"
    ' In questa riga sostitire a "..." il comando DOS.
    Let s_Cmd = s_Cmd & s_WinDir & "\COMMAND\..."
    Let s_Cmd = s_Cmd & " /Y"
    Let s_Cmd = s_Cmd & " " & strParams
    ' Se si vuole "assistere" all'esecuzione del comando sostituire
    ' vbHide con vbNormalFocus.
    ' Questo è particolarmente utile in fase di test.
    Let b_Ret = booHoldProc(Shell#(s_Cmd, vbHide))
  End If
Exit_booExecuteDosCommand:
  Let booExecuteDosCommand = b_Ret
  Exit Function
Err_booExecuteDosCommand:
  Resume Exit_booExecuteDosCommand
End Function
Private Function booHoldProc( _
ByVal lngProcId As Long _
) As Boolean
Dim l_ProcHnd As Long
Dim b_Ret     As Boolean
  If lngProcId <> 0 Then
    ' ... viene ricavato l'handle del processo...
    Let l_ProcHnd = OpenProcess&(SYNCHRONIZE, 0&, lngProcId)
    ' ... e se il processo e' stato aperto...
    If l_ProcHnd <> 0 Then
      ' ... l'applicazione viene "congelata" fino al termine
      ' dell'esecuzione.
      Call WaitForSingleObject(l_ProcHnd, INFINITE)
      ' Quindi il processo viene chiuso.
      Call CloseHandle(l_ProcHnd)
    End If
    Let b_Ret = True
  End If
  Let booHoldProc = b_Ret
End Function
Private Function GetWinDir$( _
)
  Dim s_WinDir As String
  Dim l_Ret    As Long
  Let s_WinDir = String$(256, 0)
  Let l_Ret = GetWindowsDirectory&(s_WinDir, Len(s_WinDir))
  If l_Ret > 0 _
    Then Let GetWinDir$ = Left$(s_WinDir, l_Ret)
End Function
Spero di non aver commesso errori perche' l'ho modificata al volo rispetto a
quella che uso per altri scopi. Nel caso... scusa e fatti vivo.
--
Ciao.
Maurizio