首页 > 解决方案 > 使用 #1.png 递增编号并重命名多个文件

问题描述

环境:Visual Studio 2019、Windows 窗体应用程序、C#

你好!我想用#1、#2、#3 等重命名(批处理)一些文件。我有 1-file、2-file 之类的文件夹,在每个文件夹中我有大约 50 000 个文件,名称为:abc.png, def.png, ghi.png 我想要:abc#1.png, def#2.png, ghi#3.png

相似的东西...

FolderBrowserDialog folderDlg = new FolderBrowserDialog();
folderDlg.ShowDialog();

string[] pngFiles = Directory.GetFiles(folderDlg.SelectedPath, "*.png");
string[] newFileName = new string[pngFiles.Length];

for (int i = 0; i < pngFiles .Length; i++)
{
    string filePath = System.IO.Path.GetDirectoryName(pngFiles [i]);
    string fileExt = System.IO.Path.GetExtension(pngFiles[i]);

    newFileName = pngFiles [i];

    File.Move(pngFiles [i], filePath + "\\" + newFileName[1] + 1 + fileExt);`
}

但是这段代码不起作用。这里错误...

异常最初在此调用堆栈中引发:Form1.cs [外部代码] NFT.Form1.button1_Click(object, System.EventArgs) 中的 [External Code] NFT.Form1.button1_Click.AnonymousMethod__1_1(<>f__AnonymousType0<string, string>)在 Form1.cs [外部代码] Program.cs 中的 NFT.Program.Main()

另外,我不确定我是否可以实现增加计数器并将该数字包含在 # 之前的文件中

请告诉我

标签: c#winformsexceptionfile-io

解决方案


您应该使用Directory.EnumerateFiles来提高性能:当您使用 时Directory.GetFiles,您必须等待返回整个名称数组才能访问该数组,而Directory.EnumerateFiles将逐个文件返回。

还使用字符串插值并FileSystem.RenameFile优雅地重命名文件。

private void button1_Click(object sender, EventArgs e)
{
  FolderBrowserDialog folderDlg = new FolderBrowserDialog();
  folderDlg.ShowDialog();
  if (folderDlg.ShowDialog() != DialogResult.OK)
  {
    return;
  }

  // Has different framework dependend implementations 
  // in order to handle unauthorized access to subfolders
  RenamePngFiles(folderDlg.SelectedPath);
}

.NET 核心/.NET

private void RenamePngFiles(string directoryPath)
{
  int fileNameSuffixCounter = 1;
  foreach (string originalFullFileName in Directory.EnumerateFiles(directoryPath, "*.png", new EnumerationOptions()))
  {
    // The new file name without path
    var newFileName = $"{Path.GetFileNameWithoutExtension(originalFullFileName)}#{fileNameSuffixCounter++}{Path.GetExtension(originalFullFileName)}";

    FileSystem.RenameFile(originalFullFileName, newFileName);
  }
}

.NET 框架

private void RenamePngFiles(string directoryPath)
{
  int fileNameSuffixCounter = 1;
  foreach (string originalFullFileName in EnumerateFiles(directoryPath, "*.png", SearchOption.AllDirectories))
  {
    // The new file name without path
    var newFileName = $"{Path.GetFileNameWithoutExtension(originalFullFileName)}#{fileNameSuffixCounter++}{Path.GetExtension(originalFullFileName)}";

    FileSystem.RenameFile(originalFullFileName, newFileName);
  }
}

private IEnumerable<string> EnumerateFiles(
  string directoryPath, 
  string searchPattern, 
  SearchOption searchOption = SearchOption.TopDirectoryOnly)
{
  IEnumerable<string> filePaths = new List<string>();
  try
  {
    filePaths = Directory.EnumerateFiles(directoryPath, searchPattern);
  }
  catch (UnauthorizedAccessException)
  {
    yield break;
  }

  foreach (string filePath in filePaths)
  {
    yield return filePath;
  }

  if (searchOption.Equals(SearchOption.TopDirectoryOnly))
  {
    yield break;
  }

  foreach (string subdirectoryPath in Directory.EnumerateDirectories(directoryPath))
  {
    foreach (string filePath in EnumerateFiles(subdirectoryPath, searchPattern))
    {
      yield return filePath;
    }
  }
}

推荐阅读