تغییر نام چند فایل با یک شرط

یکی از کاربران سایت با نام کاربری mmzz91 در بخش پرسش و پاسخ سایت سوالی به متن زیرمطرح کرده بودند :

لینک

در این اموزش قصد دارم که با هم همچین برنامه ای را طراحی کنیم. ابتدا فرمی به شکل زیر طراحی کنید:
1
کنترل ها را به شکل بالا نام گذاری کنید . روی فرم برنامه دوبار کلیک کنید و متغیر یا فیلدی به شکل زیر تعریف کنید :

private string FolderPath;

روی دکمه ی btnSelectPath دوبار کلیک کنید و کد زیر را در رویداد کلیک آن بنویسید :

FolderBrowserDialog browseFolderDialog = new FolderBrowserDialog();
if (browseFolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    this.lblPath.Text = browseFolderDialog.SelectedPath;
    this.FolderPath = browseFolderDialog.SelectedPath;
}

کد بالا یک پنجره برای انتخاب مسیر فایل ها نمایش می دهد و هنگامی که کاربر مسیر را انتخاب کند ، آنرا در کنترل Label و همچنین در متغیر FolderPath قرار می دهد . دلیل اینکه مسیر را در متغیر FolderPath نگهداری می کنیم این است که در هنگامی که کاربر عملیات تغییر نام را انجام می دهد به ان نیاز داریم. حال روی دکمه ی btnChange دوبار کلیک کنید و کد زیر را در رویداد کلیک آن بنویسید :

string[] allFiles = System.IO.Directory.GetFiles(this.FolderPath);
if (allFiles.Length > 0 && !string.IsNullOrEmpty(this.txtNewFileName.Text))
{
    string currentFilefolderPath = null;
    string afterDotPortion = null;
    //there is at least one file!
    foreach (string fullFilePath in allFiles)
    {
        currentFilefolderPath = System.IO.Path.GetDirectoryName(fullFilePath);
        afterDotPortion = System.IO.Path.GetFileNameWithoutExtension(fullFilePath).Split('.')[1];
        System.IO.File.Move(fullFilePath, currentFilefolderPath + "//" + this.txtNewFileName.Text + "." + afterDotPortion + System.IO.Path.GetExtension(fullFilePath));
    }
} 

خط اول : متد GetFiles یک متد Static کلاس Directory است . از طریق پارامتر آن یک مسیر برای آن مشخص می کنیم و این متد به شکل ساده لیست تمامی فایل ها آن مسیر را با آدرس کامل به شکل یک آرایه برگشت می دهد .
خط دوم : در این خط عملیات اعتبار سنجی مقادیر را انجام داده ایم . بررسی کرده ایم که کاربر برنامه نامی برای برنامه انتخاب کرده باشد و همچنین تعداد فایل های مسیر انتخابی بیشتر از 0 باشه ( یعنی حتما فایلی در مسیر مشخص شده وجود داشته باشد )

در داخل حلقه به ازای هر فایل ابتدا مسیر فایل بدون نام فایل را در متغیر folderPath نگهداری می کنیم . یعنی اگر مسیر کامل فایل c:\siavash\newfile.txt باشد این متد مقدار c:\siavash را برگشت می دهد . قسمت مهم کار جداسازی قسمت های مختلف نام فایل است . مثلا فرض کنید نام فایل mandar.E01.mkv باشد . قسمت های E01 و پسوند فایل ثابت هستند و فقط قسمت mandar باید تغییر کند. با استفاده از متد GetFileNameWithoutExtension نام فایل بدون پسوند را می گیریم ، یعنی اگر نام فایل mandar.E01.mkv باشد این متد mandar.E01 را برگشت می دهد. سپس با استفاه از متد Split بر اساس کاراکتر نقطه نام فایل را تفکیک می کنیم . یعنی اگر نام فایل mandar.E01 باشد این متد مقادیر mandar و E01 را به صورت آرایه برگشت می دهد . در این برنامه فقط به قسمت E01 نیاز داریم . چون در طی عملیات تغییر نام باید این مقدار ثابت و بدون تغییر باشد .
عمل تغییر نام را با استفاده از متد Move کلاس File انجام می دهیم . در پارامتر اول مسیر اولیه فایل را مشخص می کنیم .
مسیر جدید به صورت زیر است :
1 – مسیر پوشه فایل اولیه ( در متغیر currentFolderPath قرار دارد )
2 – نام جدید فایل . مقدار کنترل txtNewFileName .
3 – قسمت نام اپیزود ( در متغیر afterDotPortion قرار دارد )
4 – پسوند فایل ( با استفاده از متد GetExtention کلاس Path آنرا بدست می آوریم )
اگر مقادیر بالا را به هم بچسبانیم مسیر جدید فایل بدست می آید ، که همان مسیر فایل قبلی است و فقط قسمت نام آن تغییر کرده است . عملیات کار با فایل ممکن است خطاهایی داشته باشد . برای رفع این مشکل می توانید کد های بالا را در ساختار try…catch قرار دهید . کد کامل کلاس به شکل زیر است :

using System;
using System.Windows.Forms;

namespace ChangeFileName
{
    public partial class Form1 : Form
    {

        private string FolderPath;

        public Form1()
        {
            InitializeComponent();
        }


        private void btnSelectPath_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog browseFolderDialog = new FolderBrowserDialog();
            if (browseFolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.lblPath.Text = browseFolderDialog.SelectedPath;
                this.FolderPath = browseFolderDialog.SelectedPath;
            }
        }
   
        private void btnChange_Click(object sender, EventArgs e)
        {

            try
            {
                string[] allFiles = System.IO.Directory.GetFiles(this.FolderPath);
                if (allFiles.Length > 0 && !string.IsNullOrEmpty(this.txtNewFileName.Text))
                {
                    string currentFilefolderPath = null;
                    string afterDotPortion = null;
                    //there is at least one file!
                    foreach (string fullFilePath in allFiles)
                    {
                        currentFilefolderPath = System.IO.Path.GetDirectoryName(fullFilePath);
                        afterDotPortion = System.IO.Path.GetFileNameWithoutExtension(fullFilePath).Split('.')[1];
                        System.IO.File.Move(fullFilePath, currentFilefolderPath + "//" + this.txtNewFileName.Text + "." + afterDotPortion + System.IO.Path.GetExtension(fullFilePath));
                    }
                } 
            }
            catch (Exception ex)
            {
                MessageBox.Show("خطایی در هنگام عملیات اتفاق افتاد است . لطفا دوبار تلاش نمایید");                
            }                   
                       
        }
    }
}

3

2

4