使用 #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;
}
}
}
环境: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;
}
}
}