Skip to main content

Meng-copy File Menggunakan FileSystemObject di Access

Meng-copy file dari satu folder ke folder lain dalam satu komputer atau dari satu komputer ke komputer lain dalam sebuah jaringan adalah hal yang biasa kita lakukan saat kita berinteraksi dengan komputer. Bila sudah terbiasa menggunakan Windows Explorer untuk meng-copy file, maka ada baiknya kita mencoba membuat sendiri cara meng-copy file dengan menggunakan metode CopyFile yang disediakan FileSystemObject di Access.

Syntax penulisan metode CopyFile adalah sebagai berikut:
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile Nama sumber file, Nama target, Overwrite (optional)
Metode CopyFile mempunyai dua parameter yang harus ada dan satu parameter yang sifatnya optional atau tidak diharuskan. Parameter itu adalah sebagai berikut:

Nama sumber dari file, termasuk nama path di dalamnya. Path dari sumber file ini bisa berupa nama local path bila beara di komputer lokal atau UNC path bila berada dalam jaringan. Contohnya: D:\User\UserA\LogUserA201512.txt (local path) atau \\Server1\User\UserA\LogUserA201512.txt (UNC path).

Nama target path dari file yang ingin di-copy. Sama seperti nama sumber, bisa berupa nama local path atau UNC path seperti contoh di atas. Untuk meng-copy file agar nama file target sama dengan sumber, kita mesti menambahkan backslash ("\") setelah nama folder target. Contohnya seperti ini:
objFSO.CopyFile "D:\User\UserA\LogUserA201512.txt" , "D:\User\UserC\"
Bila ingin memberi nama file baru di folder target, tambahkanlah nama file yang baru nama path target, contohnya seperti ini:
objFSO.CopyFile "D:\User\UserA\LogUserA201512.txt" , "D:\User\UserC\LogUserA201512baru.txt"
Jika nama path target tidak ada, maka FileSystemObject otomatis akan membuat nama path itu.

Satu paramatere yang bersifat optional yaitu Overwrite, bisa bernilai True atau False. Secara default, Overwite bernilai False. Dengan demikian, metode CopyFile tidak mem-paste hasil copy-an jika ada nama file yang sama di folder target, sehingga kita tidak bisa mengganti file lama dengan file yang baru. Supaya file lama bisa diganti dengan file yang baru, maka parameter Overwrite pada metode CopyFile harus diberi nilai True. Contohnya seperti ini:

File yang ingin di=copy: D:\User\UserA\LogUserA201512.txt
Folder target: D:\User\UserC\

Jadi misalkan di folder target sudah ada nama file LogUserA201512.txt, maka parameter Overwrite harus diberi nilai True seperti metode CopyFile berikut ini:
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile "D:\User\UserA\LogUserA201512.txt" , "D:\User\UserC\", True
Harap selalu diingat bahwa agar parameter Overwrite bisa berfungsi untuk meng-copy file dengan cara mengganti/menimpa file lama dengan file baru, maka tanda backslash ("\") harus diikutsertakan seperti contoh di atas. Jika backslash tidak diikutsertakan, maka metode CopyFile akan membuat file baru dengan nama D:\User\UserC. Bila folder D:\User\UserC sudah ada, maka akan muncul peringatan kesalahan "Permission denied error" dan metode CopyFile tidak bisa dieksekusi sampai selesai.

Metode CopyFile dengan parameter Overwrite bernilai True juga tidak akan bisa dieksekusi sampai selesai jika file yang akan ditimpa/diganti mempunyai atribut read-only. Agar sumber file berhasil di-copy di target, maka file yang mempunyai atribut read-only itu harus dihapus terlebih dahulu. Setelah itu, metode CopyFile dieksekusi.

Meng-copy beberapa macam file sekaligus

Ada beberapa cara untuk meng-copy beberapa file secara sekaligus:
  1. Menggunakan wildcard
  2. Menggunakan statement for each ... next
  3. Kombinasi wildcard dan for each ... next

Meng-copy file dengan menggunakan wildcard

Wildcard dapat digunakan untuk meng-copy file sumber yang berada dalam folder yang sama ke folder target yang berbeda. Wildcard digunakan untuk meng-copy file sumber yang namanya mempunyai pola tertentu seperti:
  1. berekstensi .txt, .tmp, .docx, .jpg, .bmp, dan sebagainya, contoh: *.txt, *.tmp, *.docx, *.jpg, dan *.bmp. Contoh:
    objFSO.CopyFile "D:\UserAS\UserA\*.txt","D:\User\UserA\" , True
  2. mengandung pola seperti ini: Log*.txt yang artinya 3 huruf pertama adalah "Log" diikuti sembarang huruf dan ekstensi filenya adalah .txt. Contoh:
    objFSO.CopyFile "D:\UserAS\UserA\Log*.txt","D:\User\UserA\" , True
  3. mengandung pola seperti ini: ???11.txt yang artinya diawali dengan 3 karakter sembarang, diakhiri dengan 11, dan ekstensi filenya adalah .txt. Contoh:
    objFSO.CopyFile "D:\UserAS\UserA\???11.txt","D:\User\UserA\" , True
  4. mengandung pola seperti ini: ????????2015*.txt yang artinya diawali dengan 8 karakter sembarang, diikuti karakter berupa angka "2015", diakhiri dengan sembarang karakter, dan ekstensi filenya adalah .txt. Contoh:
    objFSO.CopyFile "D:\UserAS\UserA\????????2015*.txt","D:\User\UserA\" , True
  5. mengandung pola seperti ini: ????????2015*.*yang artinya diawali dengan 8 karakter sembarang, diikuti karakter berupa angka "2015", diakhiri dengan sembarang karakter, dan apa pun ekstensi filenya. Contoh:
    objFSO.CopyFile "D:\UserAS\UserA\????????2015*.*","D:\User\UserA\" , True
Penggunaan wildcard pada metode CopyFile memungkinkan kita untuk meng-copy semua file dengan pola seperti di atas tanpa meng-copy subfolder yang ada dalam folder sumber. Hal ini berbeda dengan metode CopyFolder, yang akan meng-copy seluruh file dan subfolder yang ada dalam folder sumber.

Meng-copy file dengan menggunakan statement for each ... next

Dengan menggunakan statement for each ... next, kita dapat meng-copy berbagai macam file yang sumbernya bisa berasal dari berbagai macam folder ke folder target yang diinginkan. Untuk memudahkan pemahaman, kita dapat membuat kode VBA sebagai berikut:
Function kopiFile(strSumber As String, strTarget As String, strKataKunci As String)
'------------------------------------------
' Fungsi untuk meng-copy file dengan menggunakan metode CopyFile
' Jangan dipergunakan sembarangan,
' karena file yang sudah tertimpa hasil copy-an tidak bisa di-restore.
'------------------------------------------
  Dim objFSO, objFolder, colSubfolders, objFile As Object
  Dim arrNamaFile As String
  Dim boolFileHapus As Boolean
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  If Not objFSO.FolderExists(strSumber) Then
    Debug.Print strSumber & " tidak ada"
    Cancel = True
    Exit Function
  End If
  Set objFolder = objFSO.GetFolder(strSumber)
  
    For Each objFile In objFolder.Files
      If InStr(1, objFile.Name, strKataKunci) Then
' Jika ada file di folder target, maka lakukan proses berikut ini
        If objFSO.FileExists(strTarget & objFile.Name) Then
          boolFileHapus = False
          If (objFSO.Getfile(strTarget & objFile.Name).Attributes And 1) Then
' Jika file yang ada di folder target beratribut Read-only, maka file tidak di-copy
' tetapi dilanjutkan ke proses berikutnya.
            boolFileHapus = False
          Else
' Jika file yang ada di folder target tidak beratribut Read-only, maka file dapat ditimpa
' dengan menampilkan Message Box yang meminta persetujuan (OK) atau pembatalan (Cancel).
            If MsgBox("File " & objFile.Name & _
            " sudah ada, apakah ingin diganti (OK=Setuju, Cancel=Abaikan dan lanjut ke proses berikutnya)?", _
            vbOKCancel) = vbOK Then
              boolFileHapus = True
            End If
          End If
        Else
          boolFileHapus = True
        End If
        If boolFileHapus = True Then
          objFSO.CopyFile objFile.Path, strTarget, True
          Debug.Print objFile.Path & " di-copy ke " & strTarget
        End If
      End If
    Next objFile

  Set colSubfolders = objFolder.SubFolders
  For Each objSubFolder In colSubfolders
    For Each objFile In objSubFolder.Files
      If InStr(1, objFile.Name, strKataKunci) Then
' Jika ada file di folder target, maka lakukan proses berikut ini
        If objFSO.FileExists(strTarget & objFile.Name) Then
          boolFileHapus = False
          If (objFSO.Getfile(strTarget & objFile.Name).Attributes And 1) Then
' Jika file yang ada di folder target beratribut Read-only, maka file tidak di-copy
' tetapi dilanjutkan ke proses berikutnya.
            boolFileHapus = False
          Else
' Jika file yang ada di folder target tidak beratribut Read-only, maka file dapat ditimpa
' dengan menampilkan Message Box yang meminta persetujuan (OK) atau pembatalan (Cancel).
            If MsgBox("File " & objFile.Name & _
            " sudah ada, apakah ingin diganti (OK=Setuju, Cancel=Abaikan dan lanjut ke proses berikutnya)?", _
            vbOKCancel) = vbOK Then
              boolFileHapus = True
            End If
          End If
        Else
          boolFileHapus = True
        End If
        If boolFileHapus = True Then
          objFSO.CopyFile objFile.Path, strTarget, True
          Debug.Print objFile.Path & " di-copy ke " & strTarget
        End If
      End If
    Next objFile
    kopiFile objSubFolder.Path, strTarget, strKataKunci
  Next objSubFolder
End Function
Fungsi kopiFile di atas digunakan untuk meng-copy file dari folder strSumber ke folder strTarget dengan kata kunci strKataKunci. Pada fungsi itu, kita meng-copy file yang di dalam namanya mengandung strKataKunci itu. Sebagai contoh, fungsi kopiFile seperti gambar Immediate Window di bawah ini.
Gambar 1. Immediate window fungsi kopiFile

File sumber yang ingin dikopi ada di folder "D:\SoftwareAkuntansi\ElexMedia2" beserta subfolder yang ada di bawahnya. Folder target adalah "D:\User\UserA\" sedangkan kata kunci yang dipakai adalah "akun" Jadi, dengan menggunakan statement for each... next dan rekursi, kita mencari name file yang mengandung kata kunci "akun". Bila kata kunci "akun" ditemukan dalam nama file, maka file yang mengandung kata kunci "akun" ini akan dikopi ke folder target "D:\User\UserA\" seperti terlihat di gambar 1.

Meng-copy file dengan menggunakan kombinasi wildcard dan statement for each ... next

Bila hanya menggunakan wildcard, kita hanya bisa meng-copy file yang ada dalam sebuah folder, maka dengan menggunakan kombinasi antara wildcard dan statement for each ... next, maka kita bisa meng-copy file yang mempunyai pola tertentu sesuai dengan wildcard untuk setiap folder dan subfolder yang diinginkan. Meng-copy file dengan wildcard seperti dijelaskan di atas dapat diaplikasikan ke setiap folder/subfolder dengan menggunakan statement for each ... next seperti pada kode VBA berikut ini.
Function kopiFileWildCard(strSumber As String, strTarget As String, strKataKunci As String)
'------------------------------------------
' Fungsi untuk meng-copy file dengan menggunakan metode CopyFile
' Jangan dipergunakan sembarangan,
' karena file yang sudah tertimpa hasil copy-an tidak bisa di-restore.
'------------------------------------------
  Dim objFSO, objFolder, colSubfolders, objFile As Object
  Dim arrNamaFile As String
  Dim boolFileHapus As Boolean
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  If Not objFSO.FolderExists(strSumber) Then
    Debug.Print strSumber & " tidak ada"
    Cancel = True
    Exit Function
  End If
  Set objFolder = objFSO.GetFolder(strSumber)
  If Dir(strSumber & "\" & strKataKunci) <> vbNullString Then
    Debug.Print strSumber & "\" & strKataKunci
    objFSO.CopyFile strSumber & "\" & strKataKunci, strTarget, True
  End If
  Set colSubfolders = objFolder.SubFolders
  For Each objSubFolder In colSubfolders
    kopiFileWildCard objSubFolder.Path, strTarget, strKataKunci
  Next objSubFolder
End Function
Fungsi kopiFileWildCard di atas digunakan untuk meng-copy file dari folder strSumber ke folder strTarget dengan wildcard yang dinyatakan oleh variabel strKataKunci. Pada fungsi itu, kita meng-copy file yang sesuai dengan wildcard dalam strKataKunci. Sebagai contoh, fungsi kopiFileWildCard seperti gambar Immediate Window di bawah ini. File sumber yang ingin dikopi ada di folder "D:\SoftwareAkuntansi\ElexMedia2" beserta subfolder yang ada di bawahnya dan targetnya adalah "D:\User\UserA\". Sedangkan wildcardnya adalah "*.txt".
Gambar 1. Immediate window fungsi kopiFileWildCard


Pada Immediate Window, semua file yang berekstensi *.txt dalam folder/subfolder "D:\SoftwareAkuntansi\ElexMedia2" dikopi target "D:\User\UserA\".

Comments

Posting Terpopuler

Normalisasi, Denormalisasi, dan Anomali Database

Membuat Relasi Database

Menampilkan Data MySQL dalam Form di Access