web-dev-qa-db-fra.com

Renommer des fichiers dans le dossier c #

J'ai plus de 1000 fichiers dans un dossier avec des noms comme abc_1, abc_2 ... abc_n

Je veux supprimer ce préfixe 'abc_' de tous les fichiers. Toute chance de ne pas le faire manuellement car il y en a plus de 1000, et ce sera pénible.

Comment faire cela avec c #?

25
Jason Paddle

Vous pouvez essayer avec ce code

DirectoryInfo d = new DirectoryInfo(@"C:\DirectoryToAccess");
FileInfo[] infos = d.GetFiles();
foreach(FileInfo f in infos)
{
    File.Move(f.FullName, f.FullName.Replace("abc_",""));
}
77
Aghilas Yakoub

Vous pouvez utiliser File.Move et String.Substring(index) :

var prefix = "abc_";
var rootDir = @"C:\Temp";
var fileNames = Directory.EnumerateFiles(rootDir, prefix + "*", SearchOption.AllDirectories);
foreach(String path in fileNames)
{
    var dir = Path.GetDirectoryName(path);
    var fileName = Path.GetFileName(path);
    var newPath = Path.Combine(dir, fileName.Substring(prefix.Length));
    File.Move(path, newPath);
}

Remarque: Directory.EnumerateFiles(rootDir, prefix + "*", SearchOption.AllDirectories); recherchera également les sous-dossiers de votre répertoire racine. Si ce n'est pas prévu, utilisez SearchOption.TopDirectoryOnly.

4
Tim Schmelter

Vous devriez jeter un œil à la classe DirectoryInfo et à la méthode GetFiles (). Et jetez un œil à la classe File qui fournit la méthode Move ().

File.Move(oldFileName, newFileName);
3
Mark

Le code suivant fonctionnera, non testé cependant,

 public class FileNameFixer
    {
        public FileNameFixer()
        {
            StringToRemove = "_";
            StringReplacement = "";


        }
        public void FixAll(string directory)
        {
            IEnumerable<string> files = Directory.EnumerateFiles(directory);
            foreach (string file in files)
            {
                try
                {
                    FileInfo info = new FileInfo(file);
                    if (!info.IsReadOnly && !info.Attributes.HasFlag(FileAttributes.System))
                    {
                        string destFileName = GetNewFile(file);
                        info.MoveTo(destFileName);
                    }
                }
                catch (Exception ex)
                {
                    Debug.Write(ex.Message);
                }
            }
        }

        private string GetNewFile(string file)
        {
            string nameWithoutExtension = Path.GetFileNameWithoutExtension(file);
            if (nameWithoutExtension != null && nameWithoutExtension.Length > 1)
            {
                return Path.Combine(Path.GetDirectoryName(file),
                    file.Replace(StringToRemove, StringReplacement) + Path.GetExtension(file));
            }
            return file;
        }

        public string StringToRemove { get; set; }

        public string StringReplacement { get; set; }
    }

vous pouvez utiliser cette classe comme,

  FileNameFixer fixer=new FileNameFixer();
        fixer.StringReplacement = String.Empty;
        fixer.StringToRemove = "@@";
        fixer.FixAll("C:\\temp");
3
crypted

Vous pouvez énumérer le fichier.

using System.IO;

string[] filePaths = Directory.GetFiles(@"c:\MyDir\");

Ensuite, ForEach la chaîne [] et créez une nouvelle instance de l'objet IO.File.

Une fois que vous obtenez une poignée sur un fichier, il suffit d'appeler la méthode Move et de passer String.Replace ("abc_", String.Empty).

J'ai dit Déplacer car il n'y a pas de méthode Rename directe dans IO.File.

File.Move(oldFileName, newFileName);

Soyez conscient de l'extension.

2
Hassan Gulzar

vous pouvez utiliser une itération foreach avec la classe File de l'espace de noms System.IO.

Toutes ses méthodes vous sont fournies gratuitement ici: http://msdn.Microsoft.com/en-us/library/system.io.file%28v=vs.100%29.aspx

1
Freeman

Total Commander a la possibilité de renommer plusieurs fichiers (Vous n'avez pas besoin de programmer un outil par vous-même pour chaque petite tâche).

1
Oliver
string path = @"C:\NewFolder\";    
string[] filesInDirectpry = Directory.GetFiles(path, "abc*");
forearch(string file in filesInDirectory)
{
    FileInfo fileInfo = new FileInfo(file);
    fileInfo.MoveTo(path + "NewUniqueFileNamHere");
}
1
Vignesh.N

Ce code permet à l'utilisateur de remplacer une partie du nom de fichier. Utile s'il y a beaucoup de fichiers dans un répertoire qui ont la même partie.

using System;
using System.IO;

// ...
    static void Main(string[] args)
    {
        FileRenamer(@"D:\C++ Beginner's Guide", "Module", "PDF");

        Console.Write("Press any key to quit . . . ");
        Console.ReadKey(true);
    }

    static void FileRenamer(string source, string search, string replace)
    {
        string[] files = Directory.GetFiles(source);

        foreach (string filepath in files)
        {
            int fileindex = filepath.LastIndexOf('\\');
            string filename = filepath.Substring(fileindex);

            int startIndex = filename.IndexOf(search);
            if (startIndex == -1)
                continue;
            int endIndex = startIndex + search.Length;

            string newName = filename.Substring(0, startIndex);
            newName += replace;
            newName += filename.Substring(endIndex);

            string fileAddress = filepath.Substring(0, fileindex);
            fileAddress += newName;

            File.Move(filepath, fileAddress);
        }

        string[] subdirectories = Directory.GetDirectories(source);
        foreach (string subdirectory in subdirectories)
            FileRenamer(subdirectory, search, replace);
    }
1
Bilal

J'aime la simplicité de la réponse avec le plus de votes positifs, mais je ne voulais pas que le chemin du fichier soit modifié alors j'ai légèrement changé le code ...

string searchString = "_abc_";
string replaceString = "_123_";
string searchDirectory = @"\\unc\path\with\slashes\";
int counter = 0;
DirectoryInfo d = new DirectoryInfo(searchDirectory);
FileInfo[] infos = d.GetFiles();
foreach(FileInfo f in infos)
{
    if (f.Name.Contains(searchString)) 
    {
        File.Move(searchDirectory+f.Name, searchDirectory+ f.Name.Replace(searchString, replaceString));
        counter++;
    }
}
Debug.Print("Files renamed" + counter);
1
Brent

Utilisez ceci si vous souhaitez que tous les répertoires soient récursifs:

using System;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (String filePath in Directory.GetFiles(@"C:\folderName\", "*.*", SearchOption.AllDirectories))
            {             
                File.Move(filePath, filePath.Replace("abc_", ""));
            }
        }
    }
}
0
live-love