Ganti nama file dalam C #


633

Bagaimana cara mengganti nama file menggunakan C #?


Saya benci untuk menambahkan bahwa ada masalah di sini semua solusi di sini terutama jika Anda membandingkan dan memindahkan file dari satu lokasi ke lokasi (direktori dan nama file) sejauh Anda harus menyadari bahwa volume dapat menjadi titik persimpangan ... jadi jika newname adalah q: \ SomeJunctionDirectory \ hello.txt dan nama lama adalah c: \ TargetOfJunctionPoint \ hello.txt ... file-nya sama tetapi namanya tidak.
Adrian Hum

Jawaban:


967

Lihatlah System.IO.File.Move , "pindahkan" file tersebut ke nama baru.

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

12
Solusi ini tidak berfungsi ketika nama file hanya berbeda dalam huruf besar-kecil. Misalnya file.txt dan File.txt
SepehrM

2
@SepehrM, saya baru saja mengecek dan berfungsi dengan baik pada mesin Windows 8.1 saya.
Chris Taylor

1
@SepehrM, saya tidak mengujinya, tetapi sampel yang Anda tunjuk menggunakan FileInfo.Move dan bukan File.Move jadi mungkin itu ada hubungannya dengan itu?
Chris Taylor

2
@SepehrM Nama sistem file Windows tidak peka huruf besar-kecil. File.txt dan file.txt diperlakukan sebagai nama file yang sama. Jadi tidak jelas bagi saya ketika Anda mengatakan solusinya tidak bekerja. Apa yang sedang Anda lakukan yang sebenarnya tidak berhasil?
Michael

4
@Michael, sistem file tidak peka huruf besar-kecil, tetapi ia menyimpan nama file dalam huruf asli seperti yang dimasukkan oleh pengguna. Dalam kasus SepehrM, ia mencoba mengubah kasus file, yang karena beberapa alasan tidak berfungsi. Pencocokan case tidak sensitif bekerja. HTH
Chris Taylor


47

Dalam metode File.Move, ini tidak akan menimpa file jika sudah ada. Dan itu akan melempar pengecualian.

Jadi kita perlu memeriksa apakah file tersebut ada atau tidak.

/* 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

Atau mengelilinginya dengan try catch untuk menghindari pengecualian.


20
berhati-hatilah dengan pendekatan ini ... jika direktori tujuan dan direktori sumber Anda sama, dan "nama baru" sebenarnya versi "caseFileName" yang peka huruf besar-kecil, Anda akan menghapus sebelum Anda mendapatkan kesempatan untuk memindahkan file Anda.
Adrian Hum

1
Anda juga tidak bisa hanya memeriksa string untuk kesetaraan karena ada beberapa cara untuk mewakili jalur file tunggal.
Drew Noakes

File.Move memiliki metode overload sekarang yang memungkinkan Anda untuk menimpa file - File.Move (oldPath, newPath, true)
Ella


34

Cukup tambahkan:

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

Lalu...

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

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

31
eww ... Gunakan Path.Combine () alih-alih merakit file.
Adrian Hum

20
  1. Solusi pertama

    Hindari System.IO.File.Movesolusi yang diposting di sini (termasuk jawaban yang ditandai). Gagal melalui jaringan. Namun, pola salin / hapus bekerja secara lokal dan melalui jaringan. Ikuti salah satu solusi langkah, tetapi ganti dengan Salin. Kemudian gunakan File.Delete untuk menghapus file asli.

    Anda dapat membuat metode Ganti nama untuk menyederhanakannya.

  2. Kemudahan penggunaan

    Gunakan unit VB di C #. Tambahkan referensi ke Microsoft.VisualBasic

    Kemudian untuk mengganti nama file:

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

    Keduanya adalah string. Perhatikan bahwa myfile memiliki path lengkap. newName tidak. Sebagai contoh:

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

    The C:\whatever\folder sekarang akan berisi b.txt.


8
asal tahu saja, Microsoft.VisualBasic.FileIO.FileSystem.RenameFile memanggil File.Move. Lain terima kasih menormalkan file asli dan melakukan beberapa pemeriksaan kesalahan tambahan pada argumen yaitu. file ada, nama file tidak null dll. kemudian memanggil File.Move.
Chris Taylor

Kecuali Salin () menyalin semua aliran file, yang saya anggap tidak, saya akan tinggal jauh dari menggunakan delete / copy. Saya berasumsi Move (), setidaknya ketika tetap pada sistem file yang sama, hanyalah sebuah nama baru dan dengan demikian semua aliran file akan dipertahankan.
nickdu

"Itu gagal melalui jaringan" maka Anda akan menyalin & menghapus yang sebenarnya unduh & unggah, hanya untuk kenyamanan waktu kode ... Jaringan seperti apa? Jendela folder bersama ( smb), ftp, sshatau apa pun semua memiliki perintah / primitif file bergerak / penggantian nama kecuali tidak diizinkan (misalnya read-only).
Meow Cat 2012

16

Anda bisa menyalinnya sebagai file baru dan kemudian menghapus yang lama menggunakan System.IO.Filekelas:

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

4
Catatan untuk siapa saja yang membaca ini: Ini adalah pola-anti, file mungkin dihapus atau diganti oleh proses lain atau OS antara cek untuk apakah ada dan panggilan Anda untuk Menyalin. Sebagai gantinya, Anda perlu menggunakan try catch.
user9993

Jika volumenya sama, ini juga merupakan pemborosan besar I / O karena langkah sebenarnya akan mengubah nama pada tingkat informasi direktori.
Adrian Hum

Saya sedang memproses ribuan file dan mendapat kesan Salin / Hapus lebih cepat dari Pindah.
Roberto

Bagaimana orang bisa datang dengan ide seperti itu. Lebih cepat atau tidak setidaknya Anda membunuh disk. Dengan mengatakan "ganti nama" dalam pertanyaan itu harus berarti mengganti nama secara lokal yang tentu saja tidak melibatkan perpindahan lintas-partisi.
Meow Cat 2012

dengan File.Move saya berlari ke UnauthorizedAccessException, tetapi urutan Salin dan Hapus ini berfungsi. Terima kasih!
Oliver Konig

6

CATATAN: Dalam kode contoh ini kita membuka direktori dan mencari file PDF dengan tanda kurung terbuka dan tertutup dalam nama file. Anda dapat memeriksa dan mengganti karakter apa pun dalam nama yang Anda suka atau hanya menentukan nama baru menggunakan fungsi ganti

Ada cara lain untuk bekerja dari kode ini untuk melakukan perubahan nama yang lebih rumit, tetapi tujuan utama saya adalah untuk menunjukkan cara menggunakan File.Move untuk melakukan perubahan nama batch. Ini bekerja melawan 335 file PDF di 180 direktori ketika saya menjalankannya di laptop saya. Ini memacu kode momen dan ada cara yang lebih rumit untuk melakukannya.

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
Itu ... benar-benar di luar intinya, pada pertanyaan yang dijawab tepat ke titik 3 tahun lalu.
Nyerguds

2
Itu contoh yang valid. Mungkin terlalu banyak tetapi tidak intinya. +1
Adam

1
@ Adam: ini adalah implementasi yang sangat spesifik dari jawaban persis yang sudah diberikan tiga tahun sebelumnya, pada pertanyaan yang bukan tentang implementasi spesifik apa pun di tempat pertama. Tidak melihat bagaimana itu konstruktif.
Nyerguds

@Nyerguds maka kita memiliki definisi yang berbeda dari 'selain itu', yang tidak mengejutkan karena ini adalah istilah subjektif.
Adam

@Nyerguds jika tidak relevan bagi Anda maka itu baik-baik saja. Beberapa orang menyukai verbositas karena ini membantu mereka menemukan implementasi "dunia nyata" dari kode "contoh / contoh". Itu mengubah nama file. Bagaimana hal itu di samping intinya sama seperti yang dikatakan Adam, itu subjektif. Untuk beberapa alasan Anda merasa itu benar-benar objektif. Oh well, untuk masing-masing miliknya. Terima kasih atas masukannya.
MicRoc

6

Semoga! ini akan sangat membantu anda. :)

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

Bagaimana cara menggunakan kode ini?

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

Menggunakan:

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
Jika Anda akan melakukan ini, saya sarankan memeriksa bahwa 'oldFilePath' ada sebelum melakukan sesuatu ... atau Anda akan menghapus 'newFilePath' tanpa alasan.
John Kroetch

Apakah itu bahkan mengkompilasi ( Using System.IO;)?
Peter Mortensen

3

Dalam kasus saya, saya ingin nama file yang diganti nama menjadi unik, jadi saya menambahkan cap tanggal-waktu ke nama. Dengan cara ini, nama file dari log 'lama' selalu unik:

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

Bergerak melakukan hal yang sama = Salin dan Hapus yang lama.

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

1
Benar, jika semua yang Anda pedulikan adalah hasil akhirnya. Secara internal, tidak terlalu banyak.
Michael

Tidak, Pindahkan pasti tidak Salin dan Hapus.
Jim Balter

1

Saya tidak dapat menemukan pendekatan yang cocok untuk saya, jadi saya mengusulkan versi saya. Tentu saja butuh input, penanganan kesalahan.

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

Saya telah menemukan suatu kasus ketika saya harus mengganti nama file di dalam pengendali event, yang memicu untuk setiap perubahan file, termasuk mengganti nama, dan untuk melewati selamanya mengubah nama file yang saya harus menamainya, dengan:

  1. Membuat salinannya
  2. Menghapus yang asli
File.Copy(fileFullPath, destFileName); // both has the format of "D:\..\..\myFile.ext"
Thread.Sleep(100); // wait OS to unfocus the file 
File.Delete(fileFullPath);

Untuk berjaga-jaga jika seseorang, akan memiliki skenario seperti itu;)


0
int rename(const char * oldname, const char * newname);

fungsi rename () didefinisikan dalam file header stdio.h. Itu mengubah nama file atau direktori dari oldname ke newname. Operasi ganti nama sama dengan memindahkan, maka Anda juga dapat menggunakan fungsi ini untuk memindahkan file.


Selamat datang. Pertanyaan ini adalah tentang mengganti nama file menggunakan bahasa C #. Saya tidak yakin bagaimana menunjukkan sesuatu dari perpustakaan standar C (bukan C #) membantu di sini.
Jeff Dammeyer

-10

Ketika C # tidak memiliki beberapa fitur, saya menggunakan C ++ atau 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
C # benar-benar memiliki kemampuan untuk mengubah nama file.
Andrew Barber

76
Saya tidak bisa berkata
Chris McGrath

Terima kasih, ini persis yang saya inginkan. Itu dapat mengubah nama diri pada file yang dapat dieksekusi.
Jake
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.