সি # তে একটি ফাইলের নাম পরিবর্তন করুন


632

আমি কীভাবে সি # ব্যবহার করে কোনও ফাইলের নাম পরিবর্তন করব?


আমি এটি যুক্ত করে বলতে চাই না যে এখানে একটি সমস্যা আছে এখানে সমস্ত সমাধান বিশেষত যদি আপনি তুলনা করেন এবং ফাইলটিকে একটি অবস্থান থেকে অন্য স্থানে নিয়ে যাচ্ছেন (ডিরেক্টরিতে পাশাপাশি ফাইলের নাম) ইনসোফার হিসাবে আপনি সচেতন হওয়া উচিত যে একটি ভলিউম হতে পারে জংশন পয়েন্ট ... সুতরাং নতুন নামটি যদি q হয়: \ সামজজংশন ডিরেক্টরি \ হ্যালো.txt এবং পুরাতন নাম সি: \ টার্গেটঅফজংশনপয়েন্ট \ হ্যালো টেক্সট ... ফাইলগুলি একই তবে নামগুলি নেই।
অ্যাড্রিয়ান হাম

উত্তর:


966

কটাক্ষপাত System.IO.File.Move , একটি নতুন নাম ফাইল "সরানো"।

System.IO.File.Move("oldfilename", "newfilename");

12
কেবলমাত্র অক্ষরের ক্ষেত্রে ফাইলের নাম পৃথক হলে এই সমাধান কাজ করে না। উদাহরণস্বরূপ file.txt যাও এবং file.txt জন্য
SepehrM

2
@ সেপিআরএম, আমি মাত্র দুবার পরীক্ষা করে দেখেছি এবং এটি আমার উইন্ডোজ ৮.১ মেশিনে দুর্দান্ত কাজ করে।
ক্রিস টেলর

1
@ সেফআরএম, আমি এটি পরীক্ষা করে দেখিনি, তবে আপনি যে নমুনাগুলি ফাইলফিনফো.মোভ ব্যবহার করতে ইঙ্গিত করেছেন সেটি ফাইল নয়, ফাইলটি.মুও যাতে সম্ভবত এর সাথে কিছু করার আছে?
ক্রিস টেলর 12

2
@ সেপিআরএম উইন্ডোজ ফাইল সিস্টেমের নামগুলি সংবেদনশীল নয়। File.txt এবং file.txt একই ফাইলের নাম হিসাবে বিবেচিত হয়। সুতরাং যখন আপনি বলেন যে সমাধানটি কাজ করে না তখন এটি আমার কাছে পরিষ্কার নয়। আপনি ঠিক কি করছেন যে কাজ করছে না?
মাইকেল

4
@ মিশেল, ফাইল সিস্টেমটি সংবেদনশীল না হলেও এটি ব্যবহারকারী হিসাবে প্রবেশ করানো ফাইল ফাইলটিকে মূল ক্ষেত্রে সংরক্ষণ করে does সেপহ্রামের ক্ষেত্রে, তিনি একটি ফাইলের কেস পরিবর্তন করার চেষ্টা করছিলেন, যা কিছু কারণে কাজ করছে না। কেস সংবেদনশীল মিল ছিল কাজ। এইচটিএইচ
ক্রিস টেলর


47

ফাইল.মোভ পদ্ধতিতে এটি ইতিমধ্যে বিদ্যমান থাকলে ফাইলটি ওভাররাইট করে না। এবং এটি একটি ব্যতিক্রম নিক্ষেপ করবে।

সুতরাং আমাদের ফাইলটি বিদ্যমান আছে কি নেই তা যাচাই করা উচিত।

/* Delete the file if exists, else no exception thrown. */

File.Delete(newFileName); // Delete the existing file if exists
File.Move(oldFileName,newFileName); // Rename the oldFileName into newFileName

বা একটি ব্যতিক্রম এড়ানোর জন্য একটি চেষ্টা ক্যাচ দিয়ে এটি ঘিরে।


20
এই পদ্ধতির সাথে সত্যই সাবধানতা অবলম্বন করুন ... যদি আপনার গন্তব্য ডিরেক্টরি এবং আপনার উত্স ডিরেক্টরিটি একই হয় এবং "নতুন নাম" আসলে "ওল্ডফিলনাম" এর একটি কেস-সংবেদনশীল সংস্করণ, আপনি নিজের ফাইলটি সরানোর সুযোগ পাওয়ার আগে আপনি মুছবেন।
অ্যাড্রিয়ান হাম

1
আপনি কেবল সাম্যতার জন্য স্ট্রিংগুলিও পরীক্ষা করতে পারবেন না কারণ একক ফাইল পাথের উপস্থাপনের বিভিন্ন উপায় রয়েছে।
ড্রয় নোকস

ফাইল.মোভের এখন একটি ওভারলোড পদ্ধতি রয়েছে যা আপনাকে ফাইলটি ওভাররাইট করতে দেয় - ফাইল.মোভ (ওল্ডপ্যাথ, নতুনপথ, সত্য)
এলা


34

শুধু যোগ কর:

namespace System.IO
{
    public static class ExtendedMethod
    {
        public static void Rename(this FileInfo fileInfo, string newName)
        {
            fileInfo.MoveTo(fileInfo.Directory.FullName + "\\" + newName);
        }
    }
}

এবং তারপর...

FileInfo file = new FileInfo("c:\test.txt");
file.Rename("test2.txt");

... "\\" + নতুন নাম + ফাইলআইফোন.এক্সটেনশন
mac10688

31
ই ... ... ফাইলটি একত্রিত করার পরিবর্তে পাথ.কোমাইন () ব্যবহার করুন।
অ্যাড্রিয়ান হাম

20
  1. প্রথম সমাধান

    System.IO.File.Moveএখানে পোস্ট করা সমাধানগুলি এড়িয়ে চলুন (চিহ্নিত উত্তর অন্তর্ভুক্ত)। এটি নেটওয়ার্কগুলিতে ব্যর্থ। তবে, অনুলিপি / মোছার প্যাটার্ন স্থানীয়ভাবে এবং নেটওয়ার্কগুলিতে কাজ করে। সরানো সমাধানগুলির মধ্যে একটি অনুসরণ করুন তবে এর পরিবর্তে অনুলিপি করুন। তারপরে মূল ফাইলটি মুছতে ফাইল.ডিলিট ব্যবহার করুন।

    এটিকে সহজ করার জন্য আপনি একটি পুনর্নবীকরণ পদ্ধতি তৈরি করতে পারেন।

  2. ব্যবহারে সহজ

    সি # তে ভিবি সমাবেশটি ব্যবহার করুন। মাইক্রোসফ্ট-ভিজুয়ালবাসিকের রেফারেন্স যুক্ত করুন

    তারপরে ফাইলটির নাম পরিবর্তন করতে:

    Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(myfile, newName);

    দুটিই স্ট্রিং। নোট করুন যে মাইফাইলের পুরো পথ রয়েছে। newName না। উদাহরণ স্বরূপ:

    a = "C:\whatever\a.txt";
    b = "b.txt";
    Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(a, b);

    C:\whatever\ফোল্ডারের এখন উপস্থিত থাকবে b.txt


8
ঠিক তাই আপনি জানেন, মাইক্রোসফ্ট.ভিজুয়ালবাসিক.ফিলিও.ফাইস সিস্টেম.রেনামফাইলে ফাইল.মোভ কল করে। অন্যরা আসল ফাইলটি স্বাভাবিক করার এবং আর্গুমেন্টগুলিতে কিছু অতিরিক্ত ত্রুটি পরীক্ষা করার জন্য ধন্যবাদ। ফাইল বিদ্যমান, ফাইলের নাম নাল নয় ইত্যাদি পরে এটি ফাইলকে কল করে ove
ক্রিস টেলর

অনুলিপি () সমস্ত ফাইল স্ট্রিম অনুলিপি করে, যা আমি ধরে নিয়েছি এটি না করে, আমি মুছে ফেলা / অনুলিপি ব্যবহার থেকে দূরে থাকব। আমি ধরে নিয়েছি () কমপক্ষে একই ফাইল সিস্টেমে থাকাকালীন, কেবল একটি নতুন নাম এবং এভাবে সমস্ত ফাইল স্ট্রিম বজায় থাকবে।
নিকডু

"এটি নেটওয়ার্কে ব্যর্থ হয়" তারপরে আপনি কেবল কোড-সময় সুবিধার জন্য কপি এবং মুছে ফেলতে যাচ্ছেন যা আসলে ডাউনলোড এবং আপলোড হয় ... কী জাতীয় নেটওয়ার্ক? উইন্ডোজ (ভাগ করা ফোল্ডার smb), ftp, sshবা যাই হোক না কেন সব আছে কমান্ড / প্রিমিটিভের ফাইল সরানোর জন্য / পুনঃনামকরনের যদি না অনুমতি নেই (যেমন শুধুমাত্র পাঠযোগ্য)।
মেও বিড়াল 2012

16

আপনি এটি একটি নতুন ফাইল হিসাবে অনুলিপি করতে পারেন এবং তারপরে System.IO.Fileক্লাসটি ব্যবহার করে পুরানোটিকে মুছুন :

if (File.Exists(oldName))
{
    File.Copy(oldName, newName, true);
    File.Delete(oldName);
}

4
এটি পড়ার জন্য কারও কাছে নোট করুন: এটি একটি অ্যান্টি-প্যাটার্ন, ফাইলটি অন্য কোনও প্রক্রিয়া বা ওএস দ্বারা মুছে ফেলা বা পুনরায় নামকরণ করা যেতে পারে যা চেকের মধ্যে রয়েছে এবং যদি আপনার অনুলিপি অনুলিপি হয় between পরিবর্তে আপনাকে চেষ্টা করার চেষ্টা করতে হবে।
ব্যবহারকারী 9993

যদি ভলিউম একই থাকে তবে এটি আই / ও এরও একটি বিশাল অপচয় since যেহেতু কোনও পদক্ষেপ ডিরেক্টরি তথ্য স্তরের নাম পরিবর্তন করে।
অ্যাড্রিয়ান হাম

আমি হাজার হাজার ফাইল প্রক্রিয়া করছি এবং ছাপটি পেয়েছি কপি / মুছুন মুভের চেয়ে দ্রুত।
রবার্তো

কীভাবে এই ধারণাটি নিয়ে কেউ আসবেন। দ্রুত বা না হলেও আপনি ডিস্কটিকে হত্যা করছেন। প্রশ্নের "পুনর্নাম" বলার অর্থ এর অর্থ স্থানীয়ভাবে পুনর্নবীকরণ করা উচিত যা অবশ্যই কোনও ক্রস-পার্টিশন চলমান জড়িত না।
মায়ো বিড়াল 2012

ফাইল.মোভের সাথে আমি অননুমোদিতঅ্যাক্সেস এক্সসেপশনে চলে এসেছি, তবে অনুলিপি এবং মুছে ফেলার এই ধারাটি কাজ করেছে। ধন্যবাদ!
অলিভার কোনিগ

6

দ্রষ্টব্য: এই উদাহরণ কোডে আমরা একটি ডিরেক্টরি খুলি এবং পিডিএফ ফাইলগুলি ফাইলের নামে খোলা এবং বন্ধ বন্ধনী সহ সন্ধান করি। আপনি নিজের পছন্দ মতো যে কোনও অক্ষর চেক এবং প্রতিস্থাপন করতে পারেন বা প্রতিস্থাপন ফাংশনগুলি ব্যবহার করে একটি সম্পূর্ণ নতুন নাম নির্দিষ্ট করতে পারেন।

আরও বিস্তৃত নাম পরিবর্তন করার জন্য এই কোড থেকে কাজ করার অন্যান্য উপায় রয়েছে তবে আমার মূল উদ্দেশ্যটি ছিল ফাইল কীভাবে ব্যবহার করতে হয় তা দেখাতে। আমি যখন এটি আমার ল্যাপটপে চালালাম তখন 180 টি ডিরেক্টরিতে এটি 335 পিডিএফ ফাইলের বিপরীতে কাজ করেছিল। এটি মুহুর্তের কোডটির উত্সাহ এবং এটি করার আরও বিস্তৃত উপায় রয়েছে।

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BatchRenamer
{
    class Program
    {
        static void Main(string[] args)
        {
            var dirnames = Directory.GetDirectories(@"C:\the full directory path of files to rename goes here");

            int i = 0;

            try
            {
                foreach (var dir in dirnames)
                {
                    var fnames = Directory.GetFiles(dir, "*.pdf").Select(Path.GetFileName);

                    DirectoryInfo d = new DirectoryInfo(dir);
                    FileInfo[] finfo = d.GetFiles("*.pdf");

                    foreach (var f in fnames)
                    {
                        i++;
                        Console.WriteLine("The number of the file being renamed is: {0}", i);

                        if (!File.Exists(Path.Combine(dir, f.ToString().Replace("(", "").Replace(")", ""))))
                        {
                            File.Move(Path.Combine(dir, f), Path.Combine(dir, f.ToString().Replace("(", "").Replace(")", "")));
                        }
                        else
                        {
                            Console.WriteLine("The file you are attempting to rename already exists! The file path is {0}.", dir);
                            foreach (FileInfo fi in finfo)
                            {
                                Console.WriteLine("The file modify date is: {0} ", File.GetLastWriteTime(dir));
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }
    }
}

3
এটি ... সম্পূর্ণরূপে বিন্দুটির পাশে, একটি প্রশ্নে 3 বছর আগে পয়েন্টটির ঠিক উত্তর দেওয়া হয়েছিল।
নাইয়ারগডস

2
এটি একটি বৈধ উদাহরণ। ওভারকিল হয়ত তবে পয়েন্টের পাশে নয়। +1
অ্যাডাম

1
@ অ্যাডাম: এটির ঠিক উত্তরটির একটি খুব নির্দিষ্ট বাস্তবায়ন যা তিন বছর আগে ইতিমধ্যে দেওয়া হয়েছিল, এমন প্রশ্নে যা প্রথম স্থানে কোনও নির্দিষ্ট প্রয়োগ সম্পর্কে ছিল না on এটি কোনও উপায়ে কীভাবে গঠনমূলক তা দেখবেন না।
নায়ারগডস

@ নায়ারগুডস এর পরে আমাদের 'পয়েন্টের পাশে' এর বিভিন্ন সংজ্ঞা রয়েছে, যা অবাস্তব নয় যেহেতু এটি একটি বিষয়গত শব্দ।
আদম

@ নাইয়ারগডস যদি এটি আপনার পক্ষে অপ্রাসঙ্গিক হয় তবে তা ঠিক আছে। কিছু লোক ভারবোসিটি পছন্দ করে কারণ এটি তাদের "নমুনা / উদাহরণ" কোডটির "বাস্তব বিশ্বের" বাস্তবায়ন খুঁজে পেতে সহায়তা করে। এটি ফাইল (গুলি) নাম পরিবর্তন করে। অ্যাডাম যেমন বলেছিল, ঠিক কীভাবে এটি বিন্দুটির পাশে রয়েছে, এটি বিষয়ভিত্তিক। কিছু কারণে আপনি একেবারে উদ্দেশ্যমূলক বলে মনে করেন। ওহ ভাল, প্রতিটি তার নিজস্ব। ইনপুট জন্য ধন্যবাদ, যেভাবেই হোক।
মাইক্রোক

6

আশা রাখি,! এটা আপনার জন্য সহায়ক হবে। :)

  public static class FileInfoExtensions
    {
        /// <summary>
        /// behavior when new filename is exist.
        /// </summary>
        public enum FileExistBehavior
        {
            /// <summary>
            /// None: throw IOException "The destination file already exists."
            /// </summary>
            None = 0,
            /// <summary>
            /// Replace: replace the file in the destination.
            /// </summary>
            Replace = 1,
            /// <summary>
            /// Skip: skip this file.
            /// </summary>
            Skip = 2,
            /// <summary>
            /// Rename: rename the file. (like a window behavior)
            /// </summary>
            Rename = 3
        }
        /// <summary>
        /// Rename the file.
        /// </summary>
        /// <param name="fileInfo">the target file.</param>
        /// <param name="newFileName">new filename with extension.</param>
        /// <param name="fileExistBehavior">behavior when new filename is exist.</param>
        public static void Rename(this System.IO.FileInfo fileInfo, string newFileName, FileExistBehavior fileExistBehavior = FileExistBehavior.None)
        {
            string newFileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(newFileName);
            string newFileNameExtension = System.IO.Path.GetExtension(newFileName);
            string newFilePath = System.IO.Path.Combine(fileInfo.Directory.FullName, newFileName);

            if (System.IO.File.Exists(newFilePath))
            {
                switch (fileExistBehavior)
                {
                    case FileExistBehavior.None:
                        throw new System.IO.IOException("The destination file already exists.");
                    case FileExistBehavior.Replace:
                        System.IO.File.Delete(newFilePath);
                        break;
                    case FileExistBehavior.Rename:
                        int dupplicate_count = 0;
                        string newFileNameWithDupplicateIndex;
                        string newFilePathWithDupplicateIndex;
                        do
                        {
                            dupplicate_count++;
                            newFileNameWithDupplicateIndex = newFileNameWithoutExtension + " (" + dupplicate_count + ")" + newFileNameExtension;
                            newFilePathWithDupplicateIndex = System.IO.Path.Combine(fileInfo.Directory.FullName, newFileNameWithDupplicateIndex);
                        } while (System.IO.File.Exists(newFilePathWithDupplicateIndex));
                        newFilePath = newFilePathWithDupplicateIndex;
                        break;
                    case FileExistBehavior.Skip:
                        return;
                }
            }
            System.IO.File.Move(fileInfo.FullName, newFilePath);
        }
    }

এই কোডটি কীভাবে ব্যবহার করবেন?

class Program
    {
        static void Main(string[] args)
        {
            string targetFile = System.IO.Path.Combine(@"D://test", "New Text Document.txt");
            string newFileName = "Foo.txt";

            // full pattern
            System.IO.FileInfo fileInfo = new System.IO.FileInfo(targetFile);
            fileInfo.Rename(newFileName);

            // or short form
            new System.IO.FileInfo(targetFile).Rename(newFileName);
        }
    }

6

ব্যবহার করুন:

using System.IO;

string oldFilePath = @"C:\OldFile.txt"; // Full path of old file
string newFilePath = @"C:\NewFile.txt"; // Full path of new file

if (File.Exists(newFilePath))
{
    File.Delete(newFilePath);
}
File.Move(oldFilePath, newFilePath);

5
যদি আপনি এটি করতে চলেছেন তবে আমি যাচাই করার পরামর্শ দিচ্ছি যে 'ওল্ডফিলিপথ' কিছু করার আগেই রয়েছে ... অথবা অন্যথায় আপনি অকারণে 'নতুন ফাইলপথ' মুছবেন।
জন ক্রয়েচ

এটি কি ( Using System.IO;) সংকলন করে ?
পিটার মর্টেনসেন

3

আমার ক্ষেত্রে, আমি চাই যে নাম পরিবর্তন করা ফাইলটির নামটি অনন্য হোক, তাই আমি নামের সাথে একটি তারিখ-সময় স্ট্যাম্প যুক্ত করি। এইভাবে, 'পুরানো' লগের ফাইলের নামটি সর্বদা অনন্য:

if (File.Exists(clogfile))
{
    Int64 fileSizeInBytes = new FileInfo(clogfile).Length;
    if (fileSizeInBytes > 5000000)
    {
        string path = Path.GetFullPath(clogfile);
        string filename = Path.GetFileNameWithoutExtension(clogfile);
        System.IO.File.Move(clogfile, Path.Combine(path, string.Format("{0}{1}.log", filename, DateTime.Now.ToString("yyyyMMdd_HHmmss"))));
    }
}

2

সরান একই কাজ করছে = পুরানো একটিকে অনুলিপি করুন এবং মুছুন।

File.Move(@"C:\ScanPDF\Test.pdf", @"C:\BackupPDF\" + string.Format("backup-{0:yyyy-MM-dd_HH:mm:ss}.pdf",DateTime.Now));

1
সত্য, যদি আপনার সমস্ত বিষয় যত্নশীল হয় তবে শেষ ফলাফল। অভ্যন্তরীণভাবে, এত কিছু না।
মাইকেল 23

না, সরানো অবশ্যই কপি এবং মুছবে না।
জিম বাল্টার

1

আমার পক্ষে উপযুক্ত কোন পদ্ধতির সন্ধান পাইনি, তাই আমি আমার সংস্করণটির প্রস্তাব দিই। অবশ্যই ইনপুট দরকার, ত্রুটি পরিচালনা করা।

public void Rename(string filePath, string newFileName)
{
    var newFilePath = Path.Combine(Path.GetDirectoryName(filePath), newFileName + Path.GetExtension(filePath));
    System.IO.File.Move(filePath, newFilePath);
}

1
  public static class ImageRename
    {
        public static void ApplyChanges(string fileUrl,
                                        string temporaryImageName, 
                                        string permanentImageName)
        {               
                var currentFileName = Path.Combine(fileUrl, 
                                                   temporaryImageName);

                if (!File.Exists(currentFileName))
                    throw new FileNotFoundException();

                var extention = Path.GetExtension(temporaryImageName);
                var newFileName = Path.Combine(fileUrl, 
                                            $"{permanentImageName}
                                              {extention}");

                if (File.Exists(newFileName))
                    File.Delete(newFileName);

                File.Move(currentFileName, newFileName);               
        }
    }

0

ইভেন্ট হ্যান্ডলারের ভিতরে যখন ফাইলটির নতুন নামকরণ করতে হয়েছিল, তখন আমি একটি মামলার মুখোমুখি হয়েছি, যা পুনরায় নামকরণ সহ যে কোনও ফাইল পরিবর্তনের জন্য ট্রিগার করছিল এবং চিরকালের জন্য এই ফাইলটির নাম পরিবর্তন করে এড়িয়ে যেতে হবে:

  1. এর অনুলিপি তৈরি করা হচ্ছে
  2. আসলটি সরানো হচ্ছে
File.Copy(fileFullPath, destFileName); // both has the format of "D:\..\..\myFile.ext"
Thread.Sleep(100); // wait OS to unfocus the file 
File.Delete(fileFullPath);

যদি কারও কারও সাথে এরকম দৃশ্য দেখা যায়;)


-10

যখন সি # তে কিছু বৈশিষ্ট্য না থাকে, আমি সি ++ বা সি ব্যবহার করি:

public partial class Program
{
    [DllImport("msvcrt", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
    public static extern int rename(
            [MarshalAs(UnmanagedType.LPStr)]
            string oldpath,
            [MarshalAs(UnmanagedType.LPStr)]
            string newpath);

    static void FileRename()
    {
        while (true)
        {
            Console.Clear();
            Console.Write("Enter a folder name: ");
            string dir = Console.ReadLine().Trim('\\') + "\\";
            if (string.IsNullOrWhiteSpace(dir))
                break;
            if (!Directory.Exists(dir))
            {
                Console.WriteLine("{0} does not exist", dir);
                continue;
            }
            string[] files = Directory.GetFiles(dir, "*.mp3");

            for (int i = 0; i < files.Length; i++)
            {
                string oldName = Path.GetFileName(files[i]);
                int pos = oldName.IndexOfAny(new char[] { '0', '1', '2' });
                if (pos == 0)
                    continue;

                string newName = oldName.Substring(pos);
                int res = rename(files[i], dir + newName);
            }
        }
        Console.WriteLine("\n\t\tPress any key to go to main menu\n");
        Console.ReadKey(true);
    }
}

20
সি # এর একেবারে ফাইলগুলির নাম পরিবর্তন করার ক্ষমতা রয়েছে।
অ্যান্ড্রু বারবার

76
আমি নির্বাক
ক্রিস ম্যাকগ্রা

ধন্যবাদ, এটাই আমি চেয়েছিলাম এটি এক্সিকিউটেবল ফাইলটিতে নিজের নাম পরিবর্তন করতে পারে।
জেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.