File Archival using C# .Net

 

Pengarsipan merupakan topik yang sudah ada sejak penanganan berkas secara manual, suatu topik yang mudah dibicarakan namun sulit dilaksanakan.  Untungnya dengan adanya komputerisasi adalah bahwa aktivitas pengarsipan yang memerlukan disiplin keras dari pelakunya bisa diotomatisasi proses pelaksanaannya sehingga bisa dilakukan secara rutin tepat waktu dengan hasil yang pasti tepat sasaran.  Pengarsipan di .Net dan C# bisa dilakukan dengan mudah karena sudah tersedia class yang mendukung fungsi pengarsipan.

4.1             CLASS YANG TERLIBAT

 

Kita menggunakan beberapa class yang sudah digunakan pada pembahasan bab sebelumnya yaitu class:

  • System.IO.StreamWriter
  • System.IO.File
  • System.IO.FileInfo
  • System.IO.Directory
  • System.IO.DirectoryInfo

Class baru yang digunakan adalah class Interaction yang berasal dari Microsoft.VisualBasic.  Class ini diperlukan terutama untuk keperluan menjalankan program exe dari dalam aplikasi kita.  Method yang kita gunakan adalah Interaction.Shell.  Kita akan lihat penggunaannya sewaktu kita menjalankan program WinZip.exe dari aplikasi yang kita buat.

 

4.2             MASALAH

 

Satu tipe mesin di pabrik roti selalu menghasilkan file output setiap kali selesai memproses produk.  Nama file output ini terdiri dari 6 karakter berasal dari nama produk dan 2 karakter di belakang merupakan nomor urut dari  01 sampai 99, contohnya seperti file output produk roti keju di bawah ini:

 

 

 

file output berversi

file output berversi

 

 

 

 

 

Karena pengulangan sampai 99 ini maka ada keperluan untuk melakukan pengarsipan file output ini agar file yang sudah ada tidak tertimpa oleh file baru yang bernama sama.  Staf IT Joseph ditugaskan untuk mempersiapkan aplikasi pengarsipan ini.

 

4.3             DISAIN

 

Proposal disain yang diajukan adalah akan ada aplikasi pengarsipan yang dijalankan setiap hari untuk mengambil file-file yang dibuat minus 7 hari dari hari aplikasi berjalan.  File-file ini kemudian dipindahkan ke folder baru dengan nama “outputxxxxxx” dimana xxxxxx ini adalah cap tanggal minus 7 hari tersebut.  Misalnya hari ini tanggal 10 Januari maka file yang diambil adalah file yang dibuat tanggal 3 Januari dan dipindahkan ke folder bernama output20080103.  Berikut use case diagramnya:

 

use case diagram

use case diagram

 

 

 

 

 

 

 

Dan berikut use case statement-nya.

 

Use Case Mengarsip File Output

 

  1. Nama Use Case:

Mengarsip File Output

  1. Deskripsi Singkat:

Use case ini menerangkan mekanisme pengarsipan file output dari mesin yang disimpan di server folder output ke folder harian yang dibuat tiap hari.

  1. Basic Flow:

a.      Sistem menghitung tanggal minus 7 dari hari ini

b.      Sistem mengecek isi folder yang dituju untuk mendapatkan file yang dibuat pada tanggal minus 7 dari tanggal hari ini

c.      Sistem membuat folder baru dengan nama “Output” plus tanggal minus 7 dari tanggal hari ini.

d.      Sistem memindahkan file yang didapat ke folder yang dibuat.

e.      Sistem mencatat nama file yang dipindahkan ke file log.

  1. Alternate Flow:

a.      Bila folder kosong maka dituliskan ke file log bahwa folder kosong.

b.      Bila tidak ditemukan file dengan tanggal yang dimaksud maka dituliskan ke file log bahwa tidak ditemukan file.

  1. Special Requirement:
  2. Pre-Condition:
  3. Post-Condition:

   

Use Case Menulis ke File Log

 

  1. Nama Use Case:

Menulis ke File Log

  1. Deskripsi Singkat:

Use case ini menerangkan mekanisme penulisan ke file log.

  1. Basic Flow:

a.      Sistem membuat file sesuai dengan nama yang diminta plus tanggal hari yang dimaksud

b.      Sistem membuka file log

c.      Sistem menuliskan informasi yang dimaksud sebagai baris dalam file log

d.      Sistem menutup file log.

  1. Alternate Flow:

a.      Bila file log dengan nama dan tanggal yang diminta sudah ada maka langsung ke aktivitas 3b..

  1. Special Requirement:
  2. Pre-Condition:
  3. Post-Condition:

 

2.4  IMPLEMENTASI

 

Kita buat form bernama frmArsip dan kita tambahkan satu tombol dan beri nama Mulai Arsip.  Klik ganda tombol ini untuk masuk ke View Code.  Pertama-tama kita tambahkan referensi ke class System.IO.

 

using System.IO;

 

lalu kita tentukan variabel untuk lokasi folder yang akan digunakan yaitu folder dimana file output disimpan, dan folder dimana file log akan disimpan.

 

        private string targetPath = @”D:\MyTulisan\Buku\output”;

        private string logPath = @”D:\MyTulisan\Buku\Log\FileArchiveLog”;

 

Kita mulai dulu untuk membuat metode penulisan ke log file, kita beri nama metodenya writeLog.  Kita menggunakan class StreamWriter dan File untuk membuat file dan menuliskan isi filenya.  Kode lengkapnya seperti di bawah ini.

 

        private void writeLog(String fileName, String processStatus)

        {

            string path = logPath + DateTime.Now.Year + DateTime.Now.Month + DateTime.Now.Day + “.csv”;

 

            if (!File.Exists(path))

            {

                using (StreamWriter sw = File.CreateText(path))

                {

                    sw.WriteLine(“FileName, TransferTime, Success”);

                }

            }

            using (StreamWriter sw = File.AppendText(path))

            {

                sw.WriteLine(fileName + “, “ + System.DateTime.Now + “, “ + processStatus);

            }

 

        }

 

Kemudian di bawah metode btnArsip_Click kita lengkapi dengan kode untuk memenuhi use case statement-nya.  Untuk mendapatkan minus 7 hari dari tanggal hari ini kita gunakan pernyataan sebagai berikut:

 

        string today = DateTime.Today.Add(TimeSpan.FromDays(-7)).ToShortDateString();

 

Untuk merujuk ke folder yang dituju digunakan pernyataan sebagai berikut:

 

                DirectoryInfo di = new DirectoryInfo(targetPath);

 

Dan untuk mengambil file yang ada di folder tersebut digunakan pernyataan sebagai berikut:

 

                FileInfo[] files = di.GetFiles();

 

Melalui variabel files yang didapat ini kemudian kita cek dulu apakah memang ada file dalam folder tersebut :

 

files.Length > 0

 

dan melalukan looping untuk mengecek tanggal pembuatan file terhadap tanggal minus 7 dari hari ini

 

               foreach (FileInfo file in files)

               {

                   if (file.CreationTime.ToShortDateString() == today)

                   {

                   }

               }

 

Untuk membuat folder baru kita gunakan pernyataan sebagai berikut:

 

                Directory.CreateDirectory(targetPath + folder);

 

Untuk memindahkan file ke folder yang baru dibuat digunakan pernyataan sebagai berikut:

 

                file.MoveTo(targetPath + folder + “\\” + file.Name);

 

Dan kode lengkap dari metode ini adalah sebagai berikut:

 

        private void btnArsip_Click(object sender, EventArgs e)

        {

            try

            {

                bool findFile = false;

                string today = DateTime.Today.Add(TimeSpan.FromDays(-7)).ToShortDateString();

                string folder = DateTime.Today.Add(TimeSpan.FromDays(-7)).Year.ToString() +

                    DateTime.Today.Add(TimeSpan.FromDays(-7)).Month.ToString() +

                    DateTime.Today.Add(TimeSpan.FromDays(-7)).Day.ToString();

                DirectoryInfo di = new DirectoryInfo(targetPath);

                FileInfo[] files = di.GetFiles();

                if (files.Length > 0)

                {

                    foreach (FileInfo file in files)

                    {

                        if (file.CreationTime.ToShortDateString() == today)

                        {

                            if (!Directory.Exists(targetPath + folder))

                            {

                                Directory.CreateDirectory(targetPath + folder);

                            }

                            file.MoveTo(targetPath + folder + “\\” + file.Name);

                            writeLog(file.Name, “OK”);

                            findFile = true;

                        }

                    }

                    if (findFile == false)

                        writeLog(“Tidak ada file hari ini”, “OK”);

                }

                else

                {

                    writeLog(“Folder kosong”, “OK”);

                }

            }

            catch (Exception exc)

            {

                writeLog(“Fail”, exc.Message);

            }

            finally

            {

                Application.Exit();

            }

        }

 

Bila kita eksekusi program ini dengan menekan tombol F5 maka hasilnya akan sebagai berikut:

 

 

 

Kita tekan tombol Mulai Arsip maka dalam sekejap form di atas akan menghilang karena pada akhir program kita set dengan pernyataan

 

            finally

            {

                Application.Exit();

            }

 

Kita cek status program yang dijalankan sebelumnya melalui file log-nya.  Kita cek folder log tersebut:

 

arsip file

arsip file

 

 

 

 

 

Ada 2 file log sudah terbuat di folder log yang dimaksud, dan hari ini adalah tanggal 14 Januari, kita coba buka isi file log tertanggal tersebut dengan notepad

 

log file

log file

 

 

 

 

 

Masih tidak ada file bertanggal 7 Januari 2008 sehingga bila kita cek ke folder output juga belum dibuat folder arsip bertanggal 7 Januari 2008.

 

Bila kita jalankan kemudian pada tanggal 19 Januari 2008 maka akan dihasilkan folder baru bernama output2008112 yang berisi file-file yang berasal dari folder output, sementara folder output menjadi kosong.  Bila kita lihat log file yang dihasilkan akan tertulis seperti di bawah ini.

 

 

 

Setelah yakin bahwa aplikasi berjalan sesuai dengan yang diharapkan maka untuk membuat aplikasi bisa berjalan secara rutin pada waktu yang diinginkan kita tinggal mendaftarkan aplikasi ini ke scheduler, kita bisa gunakan Windows Scheduled Tasks.  Buka Control Panel dan pilih Scheduled Tasks.

 

 

30 Hari Kemudian ….

 

Setelah berjalan selama sebulan kemudian didapat bahwa jumlah folder yang terbentuk adalah tiap hari dan cukup banyak.  Dimajukan ide demi penghematan tempat penyimpanan dan kemudahan penanganan lebih lanjut maka baiknya folder arsip tersebut kemudian dipindahkan lagi menjadi zip file.  Zip file itu akan berisi file-file yang ada dalam folder hari tertentu.  IT Staf Joseph mendeskripsikan lebih lanjut proposal ini ke dalam Use Case Statement sebagai berikut.

 

Use Case Mengarsip File Output

 

  1. Nama Use Case:

Mengarsip File Output

  1. Deskripsi Singkat:

Use case ini menerangkan mekanisme pengarsipan file output dari mesin yang disimpan di server folder output ke folder harian yang dibuat tiap hari.

  1. Basic Flow:

a.      Sistem menghitung tanggal minus 7 dari hari ini

b.      Sistem mengecek isi folder yang dituju untuk mendapatkan file yang dibuat pada tanggal minus 7 dari tanggal hari ini

c.      Sistem membuat folder baru dengan nama “Output” plus tanggal minus 7 dari tanggal hari ini.

d.      Sistem memindahkan file yang didapat ke folder yang dibuat.

e.      Sistem mencatat nama file yang dipindahkan ke file log.

  1. Alternate Flow:

a.      Bila folder kosong maka dituliskan ke file log bahwa folder kosong.

b.      Bila tidak ditemukan file dengan tanggal yang dimaksud maka dituliskan ke file log bahwa tidak ditemukan file.

  1. Special Requirement:
  2. Pre-Condition:
  3. Post-Condition:

 

Berdasarkan use case di atas kemudian diimplementasikan ke dalam program sebagai berikut.  Di form yang sama kita tambahkan satu tombol lagi kita namakan Zip Arsip.  Lalu klik ganda pada tombol tersebut untuk masuk ke View Code.  Kita isikan kode berikut ke dalam prosedur btnZip_Click.

 

        private void btnZip_Click(object sender, EventArgs e)

        {

            string winZipDirectory = @”C:\Program Files\WinZip\”;

            string srcDirectory = targetPath + “\\” + DateTime.Today.Add(TimeSpan.FromDays(-7)).Year.ToString() +

                DateTime.Today.Add(TimeSpan.FromDays(-7)).Month.ToString() +

                DateTime.Today.Add(TimeSpan.FromDays(-7)).Day.ToString();

            string tgtFile = srcDirectory;

 

            Directory.SetCurrentDirectory(winZipDirectory);

            writeLog(“Start Proses”, “Mulai”);

 

            string[] dirs = Directory.GetFiles(srcDirectory);

            if (dirs.Length > 0)

            {

                Interaction.Shell(“winzip32 -m “ + tgtFile + ” “ + srcDirectory + “\\*.*”, AppWinStyle.NormalFocus, true, 10000);

                writeLog(srcDirectory, “success”);

            }

            else

            {

                writeLog(srcDirectory, “no file to zip”);

            }

        }

 

 

Kode ini akan memanggil file Winzip32.exe yang ada di folder C:\Program Files\WinZip\,  kemudian melalui method Shell dari Microsoft.VisualBasic.Interaction kita eksekusi command untuk mengeksekusi proses pengezipan.  Perlu dipastikan bahwa kita sudah menginstalasi aplikasi WinZip dan bila diletakkan di folder yang berbeda dari yang di atas maka kita bisa merubah path file dari WinZip tersebut mengikuti path yang ada di komputer kita.

 

            Interaction.Shell(“winzip32 -m “ + tgtFile + ” “ + srcDirectory + “\\*.*”, AppWinStyle.NormalFocus, true, 10000);

 

Hasilnya file akan terzip

 

zip file

zip file

 

 

 

 

Dan folder output2008112 akan terdelete.  Bila kita view isi dari file output2008112.zip, isinya benar seperti isi dari folder output2008112.

 

 

 

Sementara file log yang terbentuk dari transaksi di atas akan sebagai berikut:

 

 

 


 

Advertisements

One thought on “File Archival using C# .Net

  1. mas,,,liat programnya lngsng donkzzzz,sma sourcecode nya,,
    aq dpt tgas sruh buat pengarsipan surat,,,,
    mnta cntoh sourcecode nya donkzzz,,,
    blas d email aq adja yaa,,,
    thanks b4

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s