Renommer un fichier en C#

Comment renommer un fichier en utilisant C#?

505
demandé sur Default 2010-07-10 15:05:54

14 réponses

Jetez un oeil à System. IO. File. Move , "déplacer" le fichier vers un nouveau nom.

System.IO.File.Move("oldfilename", "newfilename");
772
répondu Chris Taylor 2018-09-05 14:01:08
System.IO.File.Move(oldNameFullPath, newNameFullPath);
110
répondu Aleksandar Vucetic 2010-07-10 12:00:50

Vous pouvez utiliser File.Move de le faire.

37
répondu Franci Penov 2010-07-10 11:11:23

Dans le fichier.Déplacer la méthode, cela n'écrasera pas le fichier s'il existe déjà. Et il va jeter une exception.

Nous devons donc vérifier si le fichier existe ou non.

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

Ou entourez-le d'un try catch pour éviter une exception.

37
répondu Mohamed Alikhan 2016-06-12 14:49:18

Il suffit d'ajouter:

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

Et puis...

FileInfo file = new FileInfo("c:\test.txt");
file.Rename("test2.txt");
23
répondu Nogro 2016-06-12 14:49:35
  1. Première solution

    Évitez les solutions System.IO.File.Move affichées ici (réponse marquée incluse). Il échoue sur les réseaux. Cependant, copier / supprimer le motif fonctionne localement et sur les réseaux. Suivez l'une des solutions de déplacement, mais remplacez-la par copier à la place. Ensuite, utilisez fichier.Supprimer pour supprimer le fichier d'origine.

    Vous pouvez créer une méthode de Renommage pour la simplifier.

  2. Facilité d'utilisation

    Utilisez L'assemblage VB en C#. Ajouter une référence à Microsoft.VisualBasic

    Puis à renommer le fichier:

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

    Les deux sont des chaînes. Notez que myfile a le chemin complet. newName ne fonctionne pas. Par exemple:

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

    Le dossier C:\whatever\ contiendra désormais b.txt.

18
répondu Ray 2016-06-12 14:54:41

Vous pouvez le copier en tant que nouveau fichier, puis supprimer l'ancien en utilisant la classe System.IO.File:

if (File.Exists(oldName))
{
    File.Copy(oldName, newName, true);
    File.Delete(oldName);
}
13
répondu Zaki Choudhury 2016-06-12 14:55:31

NOTE: dans cet exemple de code, nous ouvrons un répertoire et recherchons des fichiers PDF avec des parenthèses ouvertes et fermées dans le nom du fichier. Vous pouvez vérifier et remplacer n'importe quel caractère dans le nom que vous aimez ou simplement spécifier un nouveau nom entier en utilisant les fonctions de remplacement.

Il existe d'autres façons de travailler à partir de ce code pour faire des renommages plus élaborés, mais mon intention principale était de montrer comment utiliser le fichier.Déplacer pour faire un renommage par lots. Cela a fonctionné contre 335 fichiers PDF dans 180 répertoires quand je l'ai couru sur mon ordinateur portable. C'est le code du moment et il existe des moyens plus élaborés de le faire.

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();
        }
    }
}
5
répondu MicRoc 2016-06-12 14:48:15

Utilisation:

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);
4
répondu Avinash Singh 2016-06-12 14:51:02

Espérons! il sera utile pour vous. :)

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

Comment utiliser ce code ?

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);
        }
    }
2
répondu 2016-09-22 04:54:40

Move fait la même chose = copier et supprimer l'ancien.

File.Move(@"C:\ScanPDF\Test.pdf", @"C:\BackupPDF\" + string.Format("backup-{0:yyyy-MM-dd_HH:mm:ss}.pdf",DateTime.Now));
1
répondu Nalan Madheswaran 2014-11-04 06:00:46

Dans mon cas, je veux que le nom du fichier renommé soit unique, donc j'ajoute un tampon datetime au nom. De cette façon, le nom de fichier de l'ancien journal est toujours unique:

   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"))));
                }
            }
1
répondu real_yggdrasil 2017-11-14 08:55:51

Je n'ai pas trouvé l'approche qui me convient, donc je propose ma version. Bien sûr besoin d'entrée, la gestion des erreurs.

public void Rename(string filePath, string newFileName)
{
    var newFilePath = Path.Combine(Path.GetDirectoryName(filePath), newFileName + Path.GetExtension(filePath));
    System.IO.File.Move(filePath, newFilePath);
}
0
répondu valentasm 2018-08-13 17:59:05

Lorsque C# n'a pas de fonctionnalité, j'utilise C++ ou 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);
    }
}
-11
répondu Alexander Chernosvitov 2016-06-12 14:44:50