Backup Text With LINQ


สืบเนื่องจากบทความ Rename File With LINQ…
เราสามารถเปลี่ยนไฟล์ง่ายๆ โดยใช้ LINQ ในการช่วยกรองไฟล์ให้…
และ lambda expressions โดยใช้ lambda operator => (=> อ่านว่า โก ทู) :> http://bit.ly/vvFCTU
ในการช่วยสร้างเมธอดแบบไม่ต้องใช้ชื่อ Anonymous Methods
ช่วยให้เขียนโปรแกรมง่ายขึ้น…

ถ้าหากวันหนึ่งคุณจำเป็นต้อง backup ข้อมูล Text file เหล่านั้น ไปไว้ในที่ปลอดภัยละ…
ทำอย่างไร?…

copy ไฟล์ธรรมดา โดยการ Move ไปไว้ที่ต้องการ…
โดยเขียน script เขียน script ทำเป็น bat file…
แล้วตั้ง schedule ให้รันตามต้องการ…

 

แน่นอน…ถ้ามีเงื่อไขว่าให้ Move ทุกไฟล์…
เขียนเพียง script command dos ดังกล่าวก็ง่ายดี…

 

แต่ถ้ามีเงื่อนไขว่า…ให้ backup โดยการ move สำหรับไฟล์…
8 เดือนย้อนหลังเท่านั้น…ภาระหนักเกิดขึ้นแล้ว…เนื่องจากสมัยนี้…
หาคนเชี่ยวเรื่อง command dos ยากด้วยซิ…ทำอย่างไรดี…

 

เอาโปรแกรม Rename File With LINQ มาทำการปรับแต่งเพียงเล็กน้อย…
ก็สามารถใช้งานได้…ดังนี้:

 

1. เราต้องการ backup ข้อมูลจาก ต้นทาง E:\DATATXT… ไปที่ปลายทาง E:\DATATXT_BACK ดังรูป

imageimage
ต้นทาง                                                                                    ปลายทาง

 

2. โดยชื่อไฟล์ในระบบเราเก็บไว้อย่างนี้ yyyyMMdd.zip…วว-ดด-ปปป เวลา.old โดย:
     yyyyMMdd.zip = เป็นวันเดือนปีของข้อมูล หรือวันที่สร้างไฟล์ดังกล่าวในสาขานั้นๆ
     …วว-ดด-ปปป เวลา.old  = วันที่ สำนักงานใหญ่ดึงข้อมูลไป Import เข้าระบบเรียบร้อยแล้ว    

image

 

3. เราจะใช้หลักว่า…ให้ดึงวันที่สร้างไฟล์เพื่อนำกรองไฟล์ที่ต้องการ backup ตามเดือนที่ต้องการ…
โดยใช้การตัดสตริง “.Substring(ตำแหน่งที่ต้องการ, จำนวนตัวอักษร)”…
ฉะนั้นถ้าชื่อไฟลฺ์เป็น “20110215.zip_16-02-2554 3-09-37.old”…
เมื่อตัดสตริงตั้งแตตัวแรก มาหกหลักจะได้ “201102” เพื่อนำไปเข้าเงื่อนไขกรองไฟล์ ตามที่ต้องการ

image

 

4.ในไฟล์คอนฟิก (App.config)…
    เราระบุพารามิเตอร์แบบนี้


<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
  <appSettings>
  
    <add key=”backFileExtension” value=”old” />                  //นามสกุลไฟล์ที่ต้องการ backup
    <add key=”backupTime” value=”8″ />                                 //จำนวนเดือนที่ต้องการ backup ย้อนหลัง
   
    <add key=”sourceFolder” value=”E:\DATATXT” />          //โฟล์เดอร์ต้นทาง
    <add key=”destFolder” value=”E:\DATATXT_BACK” /> //โฟล์เดอร์ปลายทาง

  </appSettings>
</configuration>


 

 

5. โค้ดดิ้ง:…
     จากนั้นเขียนโค้ด


     static string _backFileExten = ConfigurationManager.AppSettings[“backFileExtension”];
      static string _backupTime = ConfigurationManager.AppSettings[“backupTime”];

      static string _sourceFolder =  ConfigurationManager.AppSettings[“sourceFolder”];
      static string _destFolder = ConfigurationManager.AppSettings[“destFolder”];

       static void Main(string[] args)
       {

     …

      BackFile(_sourceFolder, _destFolder);

     …

       }

 

static public void BackFile(string sourceFolder, string destFolder)
       {
           if (!Directory.Exists(destFolder))                  //ถ้ายังไม่มีโฟเดอร์ปลายทาง
               Directory.CreateDirectory(destFolder); //สร้างมันใหม่

           Console.WriteLine();
           Console.WriteLine(“FILE SEARCH: ” + sourceFolder);

           int _m = int.Parse (string.IsNullOrEmpty (_backupTime)?”1″:_backupTime); //แปลงเดือนที่ backup เป็นจำนวนเต็ม ถ้าไม่ระบุใดๆ ให้ default เป็น “1” กล่าวคือให้ย้อนหลัง 1 เดือน
           string _backTime = DateTime.Now.AddMonths(-_m).ToString (“yyyyMM”,new CultureInfo (“en-US”));//backTime  ดึงเฉพาะ ปี-เดือนมา

           DateTime _backMonth = DateTime.ParseExact(_backTime, “yyyyMM”, new CultureInfo (“en-US”)); //แปลง backTime เป็นวันที่ โดยกำหนด format เป็น คศ.
           string[] files = Directory.GetFiles(sourceFolder, “*.” + _backFileExten); //ดึงไฟล์จากโฟล์ดอร์ต้นทาง ตามนาสกุลที่กำหนดในไฟล์คอนฟิก
           if (files.Length > 0) //ถ้ามีไฟล์
           {
               try
               {
                   var directory = new DirectoryInfo(sourceFolder); //สร้างอ็อบเจ้กต์ DirectoryInfo

                   //ใช้ LINQ กรองไฟล์ที่ต้องการ

                   directory.GetFiles(“*.” + _backFileExten) //ดึงไฟล์ตามนามสกุลที่ต้องการ backup
                       .ToList()
                       .Where(t => _backMonth >= DateTime.ParseExact(t.Name.Substring(0, 6), “yyyyMM”, new CultureInfo (“en-US”))) // โดยชื่อไฟล์ปีเดือนต้องน้อยกว่า หรือเท่ากับ เดือนที่กำหนดในไฟล์ คอนฟิก                              
                       .ToList()
                       .ForEach(f =>
                       {
                           if (File.Exists(destFolder + “\\” + f.Name))  //ถ้ามีไฟล์อยู่แล้ว
                               File.Delete(destFolder + “\\” + f.Name);   //ลบมันทิ้งก่อน
                           f.MoveTo(Path.Combine(destFolder, f.Name));  //แล้วย้านย้ายไฟล์ไปวาง
                           Console.WriteLine(“BACKUP ” + f.Name);
                       });
               }
               catch (Exception ex)
               {

                   Console.WriteLine(“BACKUP Error ” + ex.Message);
                   WriteLog(“BACKUP Error ” + ex.Message);
               }
           }

 

           //วนหาไฟล์ในโฟล์เดอร์ย่อย

           string[] folders = Directory.GetDirectories(sourceFolder);
           foreach (string folder in folders)
           {
               string name = Path.GetFileName(folder);
               string dest = Path.Combine(destFolder, name);
               BackFile(folder, dest);

           }

       }


 

6. รันโปรแกรม…

image

 

7. ผลการ backup ไฟล์

imageimage

 

 

ความต่างของการใช้งานเมธอด MoveTo ในบทความ Rename File With LINQ ก่อนหน้านี้…
กับการใช้งานเมธอด MoveTo ในบทนี้ ต่างเพียง…
โฟล์เดอร์ปลายทาง…เป็นคนละโฟล์เดอร์กับต้นทาง เท่านั้นเอง…
โดยเราไม่เปลี่ยนชื่อไฟล์…

 

แหล่งข้อมูลอ้างอิง:
บทความ Rename File With LINQ:  http://bit.ly/p5vQo2

 

แหล่งข้อมูลดาวน์โหลด:
2011/2011-10-25_BackupTextFileWithLINQ.zip: http://bit.ly/rVFmSo

 


 

ผู้เขียน

clip_image019

** รู้จักกับผู้สอน อ.นุชิต **
JANAWAT Blog: https://janawat.wordpress.com
Nuchit’s Profile @microsoft
https://mvp.support.microsoft.com/profile/nuchit
Facebook:
https://www.facebook.com/nuchit
Twitter:
http://twitter.com/janawat

Advertisements
เกี่ยวกับ

Nuchit Atjanawat is a Microsoft MVP, GreatFriends Community Leader, WindowsITPro Columnist(Mr.Nano), Silverlight Business Application Instructor, Speaker in various Microsoft events, Author, passionate Blogger and a Software Engineer by profession. He has a very good skill over Silverlight, LightSwitch, C#, XAML & Blend. He shares his technical findings, tutorials in his technical blog. Follow his Blog and Facebook page to be updated on latest articles. - Technical Blog: https://janawat.wordpress.com - WindowsITPro Columnist(Mr.Nano): http://windowsitpro.net - The GreatFriends.Biz Community Discussion Board (nano): http://greatfriends.biz - witter: https://twitter.com/janawat - Facebook Page: https://www.facebook.com/nuchit - Instructor: http://bit.ly/GF250-01, http://bit.ly/GF150-02

เขียนใน Uncategorized

ใส่ความเห็น

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 / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

In Archive
%d bloggers like this: