使用 #1.png 增加数字并重命名多个文件

Increment number & Rename multiple files with #1.png

环境:Visual Studio 2019,Windows 表格申请,C#

嗨!我想用#1、#2、#3 等重命名(批处理)一些文件。我有 1 个文件、2 个文件之类的文件夹,在每个文件夹中我有大约 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);`
}

但是这段代码不起作用。此处出错...

Exception was originally thrown at this call stack: [External Code] NFT.Form1.button1_Click.AnonymousMethod__1_1(<>f__AnonymousType0<string, string>) in Form1.cs [External Code] NFT.Form1.button1_Click(object, System.EventArgs) in Form1.cs [External Code] NFT.Program.Main() in Program.cs

此外,我不确定我是否可以实现增加计数器并将该数字包含到 #

之前的文件中

请告诉我

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

还使用字符串插值和 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;
    }
  }
}