Kopiowanie katalogu wraz z plikami i podkatalogami.   strona główna:
A po co ten Excel ;-)
 
     Dziś przegląd prostych metod kopiowania folderu wraz z całą jego zawartością. Co oznacza "prosta metoda"? To taka metoda  
w której nie potrzebujemy pętli, rekurencji itp. Całość to jedna linia kodu!  
 
Option Explicit  
 
Declare Function GetTickCount Lib "Kernel32" () As Long  
 
Sub Test()  
    Const strPath1 As String = "C:\Users\MiTKuchta\Desktop\~\Stronka"  
    Dim strPath2 As String: strPath2 = "C:\Users\MiTKuchta\Desktop\~\Stronka" & Format(Date, "yyyymmdd")  
 
    Const intMetoda = 3  
      
    Dim pocz As Long: pocz = GetTickCount  
      
    Select Case intMetoda  
        Case 1: VBA.Shell "XCOPY """ & strPath1 & """ """ & strPath2 & "\"" /S"  
        Case 2: ShellRun "cmd /c XCOPY """ & strPath1 & """ """ & strPath2 & "\"" /S", True  
        Case 3: ShellRun "cmd /c ROBOCOPY """ & strPath1 & """ """ & strPath2 & """ /S", True  
        Case 4: FSOFolderCopy strPath1, strPath2  
    End Select  
      
    Debug.Print "Metoda: " & intMetoda & " czas(s): " & (GetTickCount - pocz) / 1000  
 
End Sub  
 
Sub ShellRun(strCommand As String, bWait As Boolean)  
    Dim objShell As Object  
      
    Set objShell = CreateObject("Wscript.Shell")  
    objShell.Run strCommand, 0, bWait  
    Set objShell = Nothing  
End Sub  
 
Sub FSOFolderCopy(strSourceFolder As String, strDestination As String)  
    Dim objFSO As Object 'Scripting.FileSystemObject  
      
    Set objFSO = CreateObject("Scripting.FileSystemObject")  
    objFSO.CopyFolder strSourceFolder, strDestination, True  
    Set objFSO = Nothing  
End Sub  
 
Jak widzicie wymieniam 4'ry metody + pomiar ich szybkości. Nie jest on do końca zasadny ale o tym szerzej już przy omawianiu   
samych metod.  
 
Metody 1 i 2 to wykorzystanie programu Xcopy.exe  
  XCOPY
        Case 1: VBA.Shell "XCOPY """ & strPath1 & """ """ & strPath2 & "\"" /S"  
 
Xcopy znajduje się na ścieżce:  C:\Windows\System32  
   Składnia to: "Xcopy " & ścieżka folderu do kopiowania najlepiej w cudzysłowie "path" & spacja " " & ścieżka docelowa zakończona  
                     "\". Opcja /S - oznacza "wraz z subfolderami"  
Opcji kopiowania związanych z tym programem jest cała masa ;-)   
 - Można nadawać wybrane atrybuty dla tworzonych kopi: /A, /H  
 - można określić datę graniczną dla kopiowanej zawartości (np.: starsze niż data): /D:mm-dd-yyyy  
 - zamiast kopiować zawartość folderu utworzyć w kopi strukturę folderów odwzorowującą oryginał: /T /E  
 - i wiele innych do poczytania na stronce z prawej :-)  
 
Ważna jest metoda jaką uruchamiamy całe polecenie. Jest to "nasza" VBA.Shell :-) I co z nią związane działa asynchronicznie  
do zadania które zostało zlecone. Czasem to potrzebne a czasem nie. Jeżeli chcielibyśmy pracować na tej kopi to wolelibyśmy  
żeby metoda zaczekała z przejściem do kolejnej linii procedury przez czas realizacji zadania. I w tym nam pomoże:  
 
        Case 2: ShellRun "cmd /c XCOPY """ & strPath1 & """ """ & strPath2 & "\"" /S", True  
 
Metoda ta do wywołania polecenia wykorzystuje metodę Run obiektu Wscript.Shell. O tej metodzie już pisałem ------> :-)   Metoda Run obiektu WScript.Shell i jej arg. bWaitOnReturn
Metoda ta pozwala nam decydować czy ma działać asynchronicznie czy też nie. Decyduje o tym jej argument bWaitOnReturn  
tu ustawiona na True - będzie nam to potrzebne do oceny szybkości realizacji zadania przez poszczególne metody.  
 
        Case 3: ShellRun "cmd /c ROBOCOPY """ & strPath1 & """ """ & strPath2 & """ /S", True  
 
W Case 3 posługuję się innym programem. Mianowicie: ROBOCOPY.exe (C:\Windows\System32)   ROBOCOPY
Działa podobnie do Xcopy. W samej składni polecenia jest jedna różnica: ścieżka docelowa nie powinna kończyć się "\". Reszta  
jest w zasadzie taka sama. Jednak możliwości tego programu są jeszcze ciekawsze: oprócz możliwości XCopy (m.in.)  
 - opcjonalnym argumentem po ścieżce docelowej jest filtr [files_to_copy] jaki możemy nadać na pliki: np.: "*.xl*" - pliki Excela  
   w efekcie zostanie utworzona kopia wszystkich plików Excela wraz z całym drzewem folderów w jakich się znajdują :-)  
 - /MAXAGE:n /MINAGE:n - określenie jednego z tych "parametrów" powie procedurze że ma kopiować pliki starsze niż (MinAge)  
   n dni. (maxAge analogicznie)  
 - /MOV - przenosi pliki. (usuwa je ze ścieżki źródłowej)  
 - /MOVE - przenosi pliki i foldery (jw.)  
 - /MAXLAD:n /MINLAD:n - to samo co dla AGE jednak tu decyduje data ostatniej modyfikacji  
 - i masa innych do poczytania w linku z prawej :-)  
 
        Case 4: FSOFolderCopy strPath1, strPath2  
 
Ostatnia metoda to po prostu metoda .CopyFolder obiektu Scripting.FileSystemObject użyta tu przez z dwóch powodów:   CopyFolder Method
 - żeby przypomnieć ze tak też się da ;-)  
 - i żeby porównać czas wykonania tej metody z wykorzystaniem innych programów.  
 
I jak te pomiary czasów wyszły:  
    Kopiowaniu poddawałem folder: 24MB, 275 plików, 47 folderów  
    Do okna Immediate procedura zwróciła:  
 
Metoda: 2 czas(s): 5,148  
Metoda: 3 czas(s): 7,581  
Metoda: 4 czas(s): 4,04  
 
    a więc: Scripting.FileSystemObject RULES ;-)  
Jednak możliwości jakie daje wykorzystanie innych programów rekompensuje zupełnie czas w jakim zadanie jest realizowane.  
W zależności co Wam będzie potrzebne: asynchroniczne tworzenie jakiegoś Backup'u, czy dookreślenie źródła czy też modyfikacja  
kopi, (…) mam nadzieję że ten asortyment rozwiązań Wam w tym pomoże :-)  
 
Siemacie.