โปรแกรมหลายๆ โปรแกรม จะรับส่งข้อมูลในรูปของ Text File…
เช่น
ระบบสำนักงานใหญ่ และสาขา…
โดยที่สาขาจะมีการ Export ข้อมูลทรานแซกชั่น ออกมาในรูปของข้อมูล Text File…
แล้ว zip ส่งเข้าสำนักงานใหญ่…
สำนักงานใหญ่จะนำข้อมูล Text file ดังกล่าวมาทำการแตก zip แล้วนำเข้าสู่ระบบ…
ขณะเดียวกัน ทางสำนักงาน บางครั้งก็มีการส่งข้อมูลหลัก(Master data) กลับไปที่สาขา…
เช่น ข้อมูลลูกค้า โปรโมชั่น เป็นต้น….
เมื่อวันเวลาผ่านไประยะหนึ่ง…
ด้วยเหตุผลใด… ไม่ทราบ คุณจำเป็นที่จะต้อง นำ Text file เก่า เมื่อต้นปีแต่เอาเฉพาะข้อมูลวันที่ 2011-02-15 ถึง 2011-02-17…
ของทุกสาขา…นำเข้าระบบอีกครั้ง… และด้วยสาขาในระบบคุณมีมากกว่า 800 สาขา
การจะมานั่งเปลี่ยนชื่อไฟล์ที่ละสาขา และเอาเฉพาะไฟล์ข้อมูลวันที่ 2011-02-15 ถึง 2011-02-17
คุณคงต้องเสียเวลาไปหลายวัน…
จึงเป็นที่มาของบทความนี้…
เรามาเขียนโปรแกรมเปลี่ยนชื่อไฟล์ง่ายๆ โดยใช้ LINQ ดังนี้
1. เปิดโปรแกรม VS2008 …
สร้างโปรเจ็กต์ด้วย Console Application (C#)…
ตั้งชื่อเป็น RenameFileWithLINQ
2. โปรเจ็กต์ RenameFileWithLINQ
3.เพิ่มไฟล์ config เพื่อกำหนดพารามิเตอร์ให้โปรแกรม…
ว่าจะเปลี่ยนชื่อไฟล์อะไรบ้าง …ต้นทาง…ปลายทางอยู่ที่ใด…
4. ไฟล์ config (App.config)
5. กำหนดไฟล์ config ดังนี้
App.config
<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<appSettings>
<add key=”textFileName” value=”20110215″ />
<add key=”OldName” value=”old” />
<add key=”NewName” value=”zip” />
<add key=”sourceFolder” value=”E:\DATATXT” />
<add key=”destFolder” value=”E:\DATATXT” />
</appSettings>
</configuration>
6. เพิ่ม dll System.Configuration เข้าไปในโปรแกรม…
Add Reference
7.แล้วใส่โค้ดลงไปดังนี้
Coding
…
using System.IO;
using System.Configuration;
….
var _fileName = _textFileName.Split(‘,’).ToArray();
var directory = new DirectoryInfo(sourceFolder);
foreach (var item in _fileName)
{
directory.GetFiles(“*.” + _OldName)
.ToList()
.Where(t => t.FullName.Contains(item)) //ดึงชื่อไฟล์ตามที่ระบุในไฟล์ config
.ToList()
.ForEach(f => f.MoveTo(Path.Combine(destFolder, f.Name.Replace(_OldName, _NewName)))); // เปลี่ยนชื่อไฟล์
}
#region Recursive file search
//วนหาไฟล์ในโฟล์เดอร์ย่อย
string[] folders = Directory.GetDirectories(sourceFolder);
foreach (string folder in folders)
{
string name = Path.GetFileName(folder);
string dest = Path.Combine(destFolder, name);
RENAME(folder, dest);
}
#endregion
…
8. รันโปรแกรม
9. ผลการเปลี่ยนชื่อไฟล์ จาก *.old ไปเป็น *.zip…
เฉพาะ ชื่อไฟล์ 20110215 ตามที่เรากำหนดในไฟล์ config
10. การใช้เมธอด MoveTo()…
ถ้ามีชื่อไฟล์ดังกล่าวอยู่แล้ว จะเกิดข้อผิดพลาด ไม่สามารถเปลี่ยนชื่อไฟล์ได้ ดังนี้…
11. ฉะนั้นก่อนเปลี่ยนชื่อไฟล์ เราทำการตรวจสอบการมีอยู่ของไฟล์ก่อน…
ดังนี้
Coding … checking File.Exists
directory.GetFiles(“*.” + _OldName)
.ToList()
.Where(t => t.FullName.Contains(item))
.ToList()
//.ForEach(f => f.MoveTo(Path.Combine(destFolder, f.Name.Replace(_OldName, _NewName))));
.ForEach(f =>
{
if (File.Exists(Path.Combine(destFolder, f.Name.Replace(_OldName, _NewName)))) //ถ้ามีไฟล์อยู่แล้ว
File.Delete(Path.Combine(destFolder, f.Name.Replace(_OldName, _NewName))); //ลบมันทิ้ง
f.MoveTo(Path.Combine(destFolder, f.Name.Replace(_OldName, _NewName))); //ทำการเปลี่ยนชื่อไฟล์
Console.WriteLine(“RENAME ” + f.Name);
});
12. ลองเปลี่ยน config เปลี่ยนชื่อไฟล์ 20110215,16,17 ให้ทำการระบุพารามิเตอร์ดังนี้:
13. รันโปรแกรมใหม่…
14. ชื่อ text file จะเปลี่ยนตามที่ต้องการ…
จะเห็นว่าโปรแกรมง่ายๆ…
แต่ช่วยประหยัดของเรา…
จากที่อาจจะต้องใช้เวลาหลายวันในการเปลี่ยนไฟล์ ทีละไฟล์
เพียงแต่…รันโปรแกรมครั้งเดียว…อาจใช้เวลาไม่ถึง 20 นาที…
ทั้งขึ้นอยู่กับว่าไฟล์เก่า (*.old) ในแต่ละสาขามีมากแค่ใหน…
แหล่งข้อมูลดาวน์โหลด: http://bit.ly/nxKPXF
ผู้เขียน
** รู้จักกับผู้สอน อ.นุชิต **
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
Hi. Magnificent job. I did not expect this on a friday night. This is a terrific story. Thanks!
Thanks for taking the time to discuss this. Thanks for all the enthusiasm to extend such helpful information on this post. I love to comment on your blog sir.