Перейменуйте файл у C #


632

Як перейменувати файл за допомогою C #?


Мені б не хотілося додати, що тут є проблема, всі рішення тут, особливо якщо ви порівнюєте і переміщуєте файл з одного місця в інше (каталог, а також ім'я файлу), наскільки ви повинні знати, що об'єм може бути точка з'єднання ... тож якщо нове ім'я дорівнює q: \ SomeJunctionDirectory \ hello.txt, а стара назва - c: \ TargetOfJunctionPoint \ hello.txt ..., файли однакові, але імена - ні.
Адріан Гум

Відповіді:


966

Погляньте на System.IO.File.Move , "перемістіть" файл до нового імені.

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

12
Це рішення не працює, коли назви файлів відрізняються лише в регістрі букв. Наприклад file.txt і File.txt
SepehrM

2
@SepehrM, я лише двічі перевірив, і це добре працює на моїй машині Windows 8.1.
Кріс Тейлор

1
@SepehrM, я не перевіряв це, але в зразках, які ви вказуєте, використовуйте FileInfo.Move, а не File.Move, тож, можливо, це має щось спільне?
Кріс Тейлор

2
@SepehrM Імена файлової системи Windows не залежать від регістру. File.txt та file.txt трактуються як однакове ім’я файлу. Тож мені незрозуміло, коли ти кажеш, що рішення не працює. Що ти робиш саме, що не працює?
Майкл

4
@Michael, файлова система нечутлива до регістру, але вона зберігає ім'я файлу в оригінальному регістрі, як введено користувачем. У справі SepehrM він намагався змінити справу файлу, який чомусь не працював. Справа нечутливої ​​відповідності спрацювала. HTH
Кріс Тейлор


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
будьте дуже обережні з таким підходом ... якщо ваша адресна адреса та ваш вихідний каталог однакові, а "нове ім'я" насправді залежна від регістру версія "oldFileName", ви видалите, перш ніж отримаєте шанс перемістити файл.
Адріан Гум

1
Ви також не можете просто перевірити рядки на рівність, оскільки існує кілька способів представлення одного шляху до файлу.
Дрю Ноакс

File.Move тепер має метод перевантаження, який дозволяє перезаписати файл - File.Move (oldPath, newPath, true)
Елла,


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розміщених тут рішень (включена позначка). Він не працює через мережі. Однак шаблон копіювання / видалення працює локально та через мережі. Виконайте одне з рішень для переміщення, але замініть його на Copy. Потім використовуйте File.Delete, щоб видалити вихідний файл.

    Ви можете створити метод Перейменувати, щоб спростити його.

  2. Простота використання

    Використовуйте збірку VB в C #. Додати посилання на Microsoft.VisualBasic

    Потім перейменуйте файл:

    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
так що ви знаєте, Microsoft.VisualBasic.FileIO.FileSystem.RenameFile викликає File.Move. Інші подяки нормалізують вихідний файл і роблять додаткові перевірки помилок на аргументи, тобто. файл існує, ім'я файлу не є нульовим тощо. Потім він викликає File.Move.
Кріс Тейлор

Якщо Копіювати () не копіює всі потоки файлів, за якими я вважаю, що це не так, я б утримався від використання видалення / копіювання. Я припускаю, що Move (), принаймні, перебуваючи в одній файловій системі, є просто перейменуванням, і таким чином всі потоки файлів будуть підтримуватися.
нікду

"вона не працює через мережу", тоді ви збираєтесь скопіювати та видалити, що насправді завантажувати та завантажувати, просто для зручності в часі-коді ... Яка мережа? Вікна в загальну папку ( smb), ftp, sshабо що - то все є команди / примітиви для файлу переміщення / перейменування , якщо не допускається (наприклад , тільки для читання).
Meow Cat 2012,

16

Ви можете скопіювати його як новий файл, а потім видалити старий за допомогою System.IO.Fileкласу:

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

4
Примітка для всіх, хто читає це: Це анти-шаблон, файл може бути видалений або перейменований іншим процесом або ОС між перевіркою на наявність, і вашим дзвінком на Копіювати. Натомість вам потрібно використовувати спробу лову.
user9993

Якщо обсяг однаковий, це також велика трата вводу-виводу, оскільки перехід фактично перейменує на рівні інформації про каталог.
Адріан Гум

Я обробляю тисячі файлів і склав враження Скопіювати / Видалити швидше, ніж Перемістити.
Роберто

Як би хтось придумав таку ідею. Швидше чи ні, принаймні, ви вбиваєте диск. Сказавши "перейменувати" у питанні, це повинно означати перейменування локально, що, звичайно, не передбачає переміщення перехресної секції.
Meow Cat 2012,

з File.Move я наткнувся на UnauthorizedAccessException, але ця послідовність копіювання та видалення спрацювала. Дякую!
Олівер

6

ПРИМІТКА. У цьому прикладі коду ми відкриваємо каталог та шукаємо PDF-файли з відкритими та закритими дужками у назві файлу. Ви можете перевірити та замінити будь-який символ у вподобаному імені або просто вказати цілком нове ім’я за допомогою функцій заміни.

Існують інші способи роботи з цим кодом, щоб зробити більш детальні перейменування, але головним моїм наміром було показати, як використовувати File.Move, щоб зробити пакетне перейменування. Це працювало проти 335 файлів PDF у 180 каталогах, коли я запускав його на своєму ноутбуці. Це стимул коду моменту, і є більш складні способи зробити це.

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
@Adam: це дуже специфічна реалізація саме тієї відповіді, яку вже було дано за три роки до цього, на питання, яке стосувалося в першу чергу не про якусь конкретну реалізацію. Не бачите, як це в будь-якому випадку конструктивне.
Nyerguds

@Nyerguds, то у нас є різні визначення поняття "поруч із точкою", що не дивно, оскільки це суб'єктивний термін.
Адам

@Nyerguds, якщо для вас це не має значення, то це добре. Деяким люблять багатослів’я, тому що це допомагає їм знаходити реалізацію коду "зразок / приклад" у реальному світі. Він перейменовує файли (файли). Як це поруч із сутністю, як це сказав Адам, це суб'єктивно. Чомусь ти вважаєш це абсолютно об'єктивним. Ну добре, кожному своє. Дякуємо за вклад, будь-яким способом.
MicRoc

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
Якщо ви збираєтесь це робити, я б запропонував перевірити, чи існує "oldFilePath", перш ніж робити що-небудь ... інакше ви видалите "newFilePath" без жодної причини.
Джон Кроетч

Це навіть компілює ( 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);

Про всяк випадок, якщо у когось буде такий сценарій;)


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

Перейменувати () функцію визначено у файлі заголовка stdio.h. Він перейменовує файл або каталог із старого імені на нове ім'я. Операція перейменування така ж, як і переміщення, тому ви також можете використовувати цю функцію для переміщення файлу.


Ласкаво просимо. Це питання стосується перейменування файла за допомогою мови C #. Я не впевнений, як тут допомагає вказівка ​​на щось із стандартної бібліотеки C (не C #).
Джефф Даммейер

-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
C # абсолютно має можливість перейменувати файли.
Ендрю Барбер

76
Я мовчу
Кріс МакГрат

Дякую, це саме те, що я хотів. Він може змінити ім'я власного власного файлу у виконуваний файл.
Джейк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.