C # में एक फ़ाइल का नाम बदलें


632

मैं C # का उपयोग करके किसी फ़ाइल का नाम कैसे बदलूं?


मैं यह जोड़ना चाहूंगा कि यहाँ पर सभी समस्याएँ हैं, विशेषकर यदि आप तुलना करते हैं और फ़ाइल को एक स्थान से दूसरे स्थान पर ले जा रहे हैं (निर्देशिका के साथ-साथ फ़ाइल नाम भी) तो आपको यह पता होना चाहिए कि वॉल्यूम एक हो सकता है जंक्शन बिंदु ... इसलिए यदि newname q है: \ SomeJunctionDirectory \ hello.txt और पुराना नाम c: \ TargetOfJunctionPoint \ hello.txt है ... फ़ाइलें समान हैं लेकिन नाम नहीं हैं।
एड्रियन हम

जवाबों:


966

System.IO.File.Move पर एक नज़र डालें , फ़ाइल को एक नए नाम पर "स्थानांतरित" करें।

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

12
जब फ़ाइल नाम केवल पत्र के मामले में भिन्न होते हैं तो यह समाधान काम नहीं करता है। उदाहरण के लिए file.txt और File.txt
SEPhrM

2
@SephrM, मैंने अभी-अभी डबल चेक किया और यह मेरी विंडोज 8.1 मशीन पर ठीक काम करता है।
क्रिस टेलर

1
@SephrM, मैंने इसका परीक्षण नहीं किया, लेकिन आप जो नमूने FileInfo.Move और न कि File.Move का उपयोग करने के लिए इंगित करते हैं, इसलिए शायद इसके साथ कुछ करना है?
क्रिस टेलर

2
@SEPhrM विंडोज फाइल सिस्टम नाम केस असंवेदनशील हैं। File.txt और file.txt को एक ही फ़ाइल नाम के रूप में माना जाता है। तो यह मेरे लिए स्पष्ट नहीं है जब आप कहते हैं कि समाधान काम नहीं करता है। आप वास्तव में क्या कर रहे हैं जो काम नहीं कर रहा है?
माइकल

4
@ मिसेल, फ़ाइल सिस्टम असंवेदनशील है, लेकिन यह उपयोगकर्ता द्वारा दर्ज किए गए मूल मामले में फ़ाइल नाम को संग्रहीत करता है। SEPhrM के मामले में, वह एक फ़ाइल के मामले को बदलने की कोशिश कर रहा था, जो किसी कारण से काम नहीं कर रहा था। केस असंवेदनशील मिलान काम कर रहा था। एचटीएच
क्रिस टेलर


47

File.Move विधि में, यह फ़ाइल को अधिलेखित नहीं करेगा यदि यह पहले से मौजूद है। और यह एक अपवाद फेंक देगा।

इसलिए हमें यह जांचना होगा कि फ़ाइल मौजूद है या नहीं।

/* 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
इस दृष्टिकोण के साथ वास्तव में सावधान रहें ... यदि आपकी गंतव्य निर्देशिका और आपके स्रोत निर्देशिका समान हैं, और "newname" वास्तव में "oldFileName" का केस-संवेदी संस्करण है, तो आपको अपनी फ़ाइल को स्थानांतरित करने का मौका मिलने से पहले हटा देगा।
एड्रियन हम

1
आप केवल समानता के लिए तारों की जांच नहीं कर सकते हैं क्योंकि एकल फ़ाइल पथ का प्रतिनिधित्व करने के कई तरीके हैं।
आकर्षित नोकें

File.Move में अब एक अधिभार विधि है जो आपको फ़ाइल को ओवरराइट करने की अनुमति देती है - File.Move (oldPath, newPath, true)
Ella


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");

... "\\" + newName + fileInfo.Extension
mac10688

31
eww ... फ़ाइल कोडांतरण के बजाय Path.Combine () का उपयोग करें।
एड्रियन हम

20
  1. पहला उपाय

    System.IO.File.Moveयहां पोस्ट किए गए समाधानों से बचें (चिह्नित उत्तर शामिल हैं)। यह नेटवर्क पर विफल रहता है। हालाँकि, प्रतिरूप स्थानीय रूप से और नेटवर्क पर प्रतिलिपि / हटाता है। एक चाल समाधान का पालन करें, लेकिन इसे कॉपी के बजाय बदल दें। फिर मूल फ़ाइल को हटाने के लिए File.Delete का उपयोग करें।

    आप इसे सरल बनाने के लिए एक नाम बदलें विधि बना सकते हैं।

  2. उपयोग में आसानी

    C # में VB असेंबली का उपयोग करें। Microsoft.VisualBasic का संदर्भ जोड़ें

    फिर फ़ाइल का नाम बदलने के लिए:

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

    दोनों तार हैं। ध्यान दें कि myfile में पूर्ण पथ है। newName नहीं करता है। उदाहरण के लिए:

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

    C:\whatever\फ़ोल्डर अब में शामिल होंगे b.txt


8
बस इतना है कि आप जानते हैं, Microsoft.VisualBasic.FileIO.FileSystem.RenameFile File.Move कॉल करता है। अन्य मूल फ़ाइल को सामान्य करने और तर्कों पर कुछ अतिरिक्त त्रुटि जांच करने के लिए धन्यवाद। फ़ाइल मौजूद है, फ़ाइल नाम शून्य नहीं है आदि। इसके बाद File.Move को कॉल करें।
क्रिस टेलर

जब तक कॉपी () सभी फ़ाइल धाराओं को कॉपी नहीं करता, जो मुझे लगता है कि यह नहीं है, मैं डिलीट / कॉपी का उपयोग करने से दूर रहूंगा। मैं मान लेता हूं कि मूव (), कम से कम जब एक ही फाइल सिस्टम पर रह रहा है, तो बस एक नाम है और इस तरह सभी फाइल स्ट्रीम बनाए रहेंगे।
निकु डे

"यह नेटवर्क पर विफल हो जाता है" तो आप कॉपी और डिलीट करने जा रहे हैं जो वास्तव में डाउनलोड और अपलोड है, बस कोड-टाइम सुविधा के लिए ... किस तरह का नेटवर्क है? विंडोज (साझा फ़ोल्डर smb), ftp, sshया जो कुछ भी सभी आदेशों / पुरातन फ़ाइल चलती के लिए / का नाम बदलने की अनुमति नहीं है जब तक कि (जैसे केवल पढ़ने के लिए)।
मेव कैट 2012

16

आप इसे एक नई फ़ाइल के रूप में कॉपी कर सकते हैं और फिर System.IO.Fileकक्षा का उपयोग करके पुराने को हटा सकते हैं :

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

4
इसे पढ़ने वाले किसी पर भी ध्यान दें: यह एक एंटी-पैटर्न है, फ़ाइल को किसी अन्य प्रक्रिया या OS के चेक के बीच में रखा जा सकता है, अगर यह मौजूद है और कॉपी में आपका कॉल है तो इसे बदला जा सकता है। आपको इसके बजाय ट्राइ कैच का उपयोग करने की आवश्यकता है।
15:99 पर user9993

यदि मात्रा समान है, तो यह I / O का एक बड़ा अपशिष्ट भी है क्योंकि एक कदम वास्तव में निर्देशिका सूचना स्तर पर एक नाम बदल देगा।
एड्रियन हम

मैं हजारों फाइलों को प्रोसेस कर रहा हूं और मुझे लगता है कि मूव के मुकाबले कॉपी / डिलीट तेज है।
रॉबर्टो

ऐसे विचार के साथ कोई कैसे आएगा। कम से कम आप डिस्क को मार रहे हैं या नहीं। प्रश्न में "नाम बदलने" का अर्थ यह है कि स्थानीय रूप से नाम का अर्थ होना चाहिए जिसमें निश्चित रूप से कोई क्रॉस-पार्टिशन मूविंग शामिल नहीं है।
मेव कैट 2012

File.Move के साथ मैं UnauthorizedAccessException में भाग गया, लेकिन कॉपी और डिलीट के इस क्रम ने काम किया। धन्यवाद!
ओलिवर कोनिग

6

नोट: इस उदाहरण कोड में हम एक निर्देशिका खोलते हैं और फ़ाइल के नाम पर खुले और बंद कोष्ठक के साथ पीडीएफ फाइलों की खोज करते हैं। आप अपने द्वारा पसंद किए गए नाम में किसी भी वर्ण की जांच कर सकते हैं या बदल सकते हैं या केवल एक नया नाम निर्दिष्ट कर सकते हैं।

इस कोड से काम करने के लिए और अधिक विस्तृत नाम बदलने के लिए अन्य तरीके हैं, लेकिन मेरा मुख्य उद्देश्य यह दिखाना था कि एक बैच का नाम बदलने के लिए File.Move का उपयोग कैसे करें। जब मैंने इसे अपने लैपटॉप पर चलाया तो 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 साल पहले बिंदु पर बिल्कुल जवाब दिए गए सवाल पर।
Nyerguds

2
इसका एक वैध उदाहरण है। हो सकता है कि बात खत्म हो जाए, लेकिन बात खत्म नहीं हुई। +1
एडम

1
@ एडम: यह ठीक उसी जवाब का एक बहुत ही विशिष्ट कार्यान्वयन है जो पहले से ही तीन साल पहले दिया गया था, एक सवाल पर जो पहले स्थान पर किसी भी विशिष्ट कार्यान्वयन के बारे में नहीं था। यह मत देखो कि यह किसी भी तरह से रचनात्मक कैसे है।
Nyerguds

@Nyerguds तो हमारे पास 'बिंदु के पास' की अलग-अलग परिभाषाएँ हैं, जो कि एक व्यक्तिपरक शब्द होने के बाद से आश्चर्य की बात नहीं है।
एडम

@ नायरगुड्स अगर यह आपके लिए अप्रासंगिक है तो यह ठीक है। कुछ लोगों को वर्बोसिटी पसंद है क्योंकि इससे उन्हें "नमूना / उदाहरण" कोड के "वास्तविक दुनिया" कार्यान्वयन को खोजने में मदद मिलती है। यह फ़ाइल का नाम बदल देता है। इस बिंदु के बगल में कैसे आदम बहुत अधिक है, यह व्यक्तिपरक है। किसी कारण से आप इसे पूरी तरह से वस्तुनिष्ठ मानते हैं। ओह, प्रत्येक अपने स्वयं के लिए। इनपुट के लिए धन्यवाद, दोनों तरह से।
माइक्रोक

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
सच है, अगर आप सभी की परवाह करते हैं तो अंतिम परिणाम है। आंतरिक रूप से, इतना नहीं।
माइकल

नहीं, हटो सबसे निश्चित रूप से कॉपी और डिलीट नहीं होता है।
जिम बाल्टर

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

जब C # में कुछ सुविधा नहीं है, तो मैं C ++ या C का उपयोग करता हूं:

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
मैं अवाक हूं
क्रिस मैकग्राथ

धन्यवाद, यह वही है जो मैं चाहता था। यह एक निष्पादन योग्य फ़ाइल पर स्वयं का नाम बदल सकता है।
जेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.