c# - 使用 #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()
另外,我不确定我是否可以实现增加计数器并将该数字包含在 # 之前的文件中
请告诉我
解决方案
您应该使用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;
}
}
}
推荐阅读
- node.js - 在 AWS Lambda 上使用 jsonwebtoken 解码函数时出错
- ssl - 如何为本地/实习网络 IP 生成证书
- android - Can't migrate a table to Room do to an error with the way booleans is saved in Sqlite
- c# - 使用路径中的变量从 php 上传文件不起作用,但如果我添加了一个值则有效
- android - 使用 RecyclerView 在 MasterDetail Flow 中突出显示具有 BackgroundColor 的选定项目
- swift - Realm 和 Swift - 为要更新的模型传递的参数
- spring - 不正确的 JPA 实体列类型导致 FindById 出现问题
- c++ - 使用模数来确定数字是否可以被变量整除
- c - 遍历数组 N 次
- django - 通过 https 部署 Elastic Beanstalk 应用程序后,我收到 408 错误