在C#中重命名文件夹中的文件

41

我有一个文件夹里有1000多个文件,它们的名称类似于abc_1,abc_2...abc_n

我想要删除这些文件名中的前缀"abc_"。有没有什么方法可以不用手动一个一个地删除,因为这太痛苦了。

我该如何使用C#实现这个功能?


也许是一个PowerShell脚本的好选择。 - Steve B
看一下这个链接:https://dev59.com/gnI-5IYBdhLWcg3wEELu - Søren Lorentzen
你只想删除前缀吗? - Ali Vojdanian
12个回答

103

你可以尝试使用以下代码

DirectoryInfo d = new DirectoryInfo(@"C:\DirectoryToAccess");
FileInfo[] infos = d.GetFiles();
foreach(FileInfo f in infos)
{
    File.Move(f.FullName, f.FullName.Replace("abc_","")); // Careful!! This will replaces the text "abc_" anywhere in the path, including directory names.
}

3
替换所有的 abc 可能是过度修饰。考虑到前缀只是一个示例,实际上出现更频繁的可能是像 ab 这样的东西。那么你也会将 Table1.ABD 替换为 Tle1.d。然后你可能需要看一下 这里 - Tim Schmelter
子文件夹中的文件怎么办?;-) - Leonardo Wildt
谢谢你分享这个小技巧。它对我的小样本集非常有效。不过我听说在大规模场景下,移动方法有时会有点棘手,不能总是成功完成。你有什么建议吗? - user4059321
1
小心!如果你要搜索的文本(“abc_”)包含在文件路径中,它也会被替换/从文件路径字符串中删除。我不确定当Move方法执行时会发生什么。相反,只应该搜索和替换文件名。 - Diomoid

13

你可以使用File.MoveString.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);
}

注意:Directory.EnumerateFiles(rootDir, prefix + "*", SearchOption.AllDirectories); 还会搜索您的根目录下的子文件夹。 如果这不是您想要的,请使用 SearchOption.TopDirectoryOnly


3
您可以枚举文件。
using System.IO;

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

然后,对于string[]进行ForEach操作,创建一个IO.File对象的新实例。

一旦你掌握了一个文件的处理方式,只需调用Move方法并传入String.Replace("abc_", String.Empty)即可。

我说的是Move,因为IO.File中没有直接的Rename方法。

File.Move(oldFileName, newFileName);

注意扩展名。


3

您应该查看DirectoryInfo类和GetFiles()方法。并且还需要查看File类,该类提供了Move()方法。

File.Move(oldFileName, newFileName);

3
以下代码应该可以工作,尚未经过测试:
 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; }
    }

你可以将这个类用作:
  FileNameFixer fixer=new FileNameFixer();
        fixer.StringReplacement = String.Empty;
        fixer.StringToRemove = "@@";
        fixer.FixAll("C:\\temp");

1

1

我其实不知道那个。谢谢! - Søren Lorentzen
我也不知道。谢谢你! - Jason Paddle

1
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
这段代码使用户能够替换文件名的一部分。如果目录中有许多文件具有相同的部分,则非常有用。
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

我喜欢获得最多赞的答案的简洁性,但我不想修改文件路径,所以稍微改了一下代码...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接