2012年6月29日 星期五

[C#] 批次更改檔案的副檔名

昨天因為我的 HTC One V 又失靈了,造成我記憶卡中許多的相片檔案遺失,後來我找到了 LOST.DIR 這個資料夾,裡面存放了許多只有流水編號,沒有副檔名的檔案,我測試了一個檔案,將它的副檔名加上手機相機一般預設的檔案格式 .jpg,果然成功的救回了不少相片,但是要一個一個自己手動去把每個檔案都加上副檔名還原真的很費工,所以就寫了一個批次更改副檔名的程式。

雖然光寫程式的時間就足以完成手動更改的工作,不過就像某些演算法的概念,第一次辛苦一點花多一點時間做一件事,接下來後面的類似工作就可以省去這件事情而且可以很快速的透過這個流程來完成。



Rename_Batch (x86)

使用方法:
(1)將這個程式放到你將要批次修改的目錄中,並點擊執行
(2)上方輸入框 - 輸入在目前的目錄中,你想要修改的檔案的副檔名,例如你想修改所有副檔名是 .txt 的檔案,則輸入 .txt,當然你可以都不要輸入,這樣子就會修改像上面那些沒有副檔名的檔案了
(3)下方輸入框 - 輸入要修改成的副檔名,例如你想將某個檔案修改成 .jpg 的檔案,則輸入 .jpg
(4)按下按鈕,若跳出 "修改完成!" 的訊息,即完成修改

/*
 * Program: Batch Of Renaming File Extension
 * Language: C# .NET Framework 3.5
 * Author:  Veck Hsiao @ Taiwan, National Chung Cheng University
 * Time:    June/29/2012 
 * Usage:   Change all assigned file extensions in current directory in batch
 */


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Rename_Batch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            DirectoryInfo di = new DirectoryInfo(".");
            string NewExt = textBox1.Text.Trim();
            string SourceExt = textBox2.Text.Trim();

            /*檢查要修改的副檔名*/
            try
            {
                if (SourceExt[0] != '.')
                {
                    MessageBox.Show("請輸入含 '.' 的完整附檔名");
                    textBox1.Text = "";
                    return;
                }
            }
            catch (Exception ex)       
            {  /*沒有輸入副檔名,表示要修改沒有副檔名的"檔案"*/ }


            /*檢查要修改成的副檔名*/
            try
            {
                if (NewExt[0] != '.')
                {
                    MessageBox.Show("請輸入含 '.' 的完整附檔名");
                    textBox1.Text = "";
                    return;
                }
            }
            catch(Exception ex)     //沒有輸入要修改成的副檔名沒有意義
            {
                MessageBox.Show("請輸入副檔名");                
                return;
            }


            /*執行批次作業*/
            foreach (FileInfo fi in di.GetFiles())
            {
                string name = fi.Name;          //取的檔案的全名
                string ext = fi.Extension;      //取得檔案的附檔名
                string main = Path.GetFileNameWithoutExtension(fi.DirectoryName+"\\"+fi.Name) ;    //取得檔案的主要名

  if (ext != ".exe" && ext !=".pdb" && ext!=NewExt && ext ==SourceExt)
                {

                   /*更改副檔名*/                 
                    String NewName = main + NewExt;
                    fi.MoveTo(Path.Combine(fi.DirectoryName, NewName));
                }
                else 
                { }

            }//end_of_foreach

                    MessageBox.Show("修改完成!");

        }//end_of_button_click

    }
}

3 則留言:

  1. Nice, 下次用regx寫一個完整的檔名更改一定很ok的

    然後剛剛看了一下這篇文章
    http://www.dotblogs.com.tw/dc690216/archive/2009/09/17/10684.aspx

    這樣似乎可以簡化foreach裡面的判斷

    回覆刪除
    回覆
    1. 哈哈, 謝謝啦!
      這真的是比較 smart 的寫法
      之後會來試試看這個方法

      刪除