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 #?
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_",""));
}
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
.
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);
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");
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.
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
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).
string path = @"C:\NewFolder\";
string[] filesInDirectpry = Directory.GetFiles(path, "abc*");
forearch(string file in filesInDirectory)
{
FileInfo fileInfo = new FileInfo(file);
fileInfo.MoveTo(path + "NewUniqueFileNamHere");
}
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);
}
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);
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_", ""));
}
}
}
}