重命名服务器目录上的图像文件
Posted
技术标签:
【中文标题】重命名服务器目录上的图像文件【英文标题】:Rename image files on server directory 【发布时间】:2010-12-08 21:29:22 【问题描述】:我需要一些帮助来重命名位于 /images/graphicsLib/ 的目录中的一些图像。
/graphicsLib/ 中的所有图像名称都具有如下命名约定: 400-60947.jpg。我们将文件的“400”部分称为前缀,将“60957”部分称为后缀。我们称之为 sku 的整个文件名。
因此,如果您看到 /graphicLib/ 的内容,它看起来像: 400-60957.jpg 400-60960.jpg 400-60967.jpg 400-60968.jpg 402-60988.jpg 402-60700.jpg 500-60725.jpg 500-60733.jpg 等等……
使用 C# 和 System.IO ,根据文件名的前缀重命名所有图像文件的可接受方法是什么?用户需要能够输入当前前缀,查看 /graphicsLib/ 中匹配的所有图像,然后输入新前缀以使用新前缀重命名所有这些文件。只有文件的前缀被重命名,其余的文件名需要保持不变。
到目前为止我所拥有的是:
//enter in current prefix to see what images will be affected by
// the rename process,
// bind results to a bulleted list.
// Also there is a textbox called oldSkuTextBox and button
// called searchButton in .aspx
private void searchButton_Click(object sender, EventArgs e)
string skuPrefix = oldSkuTextBox.Text;
string pathToFiles = "e:\\sites\\oursite\\siteroot\\images\graphicsLib\\";
string searchPattern = skuPrefix + "*";
skuBulletedList.DataSource = Directory.GetFiles(pathToFiles, searchPattern);
skuBulletedList.DataBind();
//enter in new prefix for the file rename
//there is a textbox called newSkuTextBox and
//button called newSkuButton in .aspx
private void newSkuButton_Click(object sender, EventArgs e)
//Should I loop through the Items in my List,
// or loop through the files found in the /graphicsLib/ directory?
//assuming a loop through the list:
foreach(ListItem imageFile in skuBulletedList.Items)
string newPrefix = newSkuTextBox.Text;
//need to do a string split here?
//Then concatenate the new prefix with the split
//of the string that will remain changed?
【问题讨论】:
【参考方案1】:你可以看看string.Split。
遍历目录中的所有文件。
string[] fileParts = oldFileName.Split('-');
这将为您提供一个包含两个字符串的数组:
fileParts[0] -> "400"
fileParts[1] -> "60957.jpg"
使用列表中的名字。
您的新文件名将变为:
if (fileParts[0].Equals(oldPrefix))
newFileName = string.Format("(0)-(1)", newPrefix, fileParts[1]);
然后重命名文件:
File.Move(oldFileName, newFileName);
遍历目录中的文件:
foreach (string oldFileName in Directory.GetFiles(pathToFiles, searchPattern))
// Rename logic
【讨论】:
谢谢克里斯。如果循环遍历目录而不是bulletedList,我的“foreach”语句会是什么样子。我有将逻辑从列表转换为目录对象的代码块。问候, 虽然安德烈的回答同样重要,但对于这种特殊情况,使用 string.split 更简单。克里斯得到了接受的答案。谢谢你们俩。问候,【参考方案2】:其实你应该迭代目录中的每个文件,并一个一个地重命名
要确定新的文件名,您可以使用类似:
String newFileName = Regex.Replace("400-60957.jpg", @"^(\d)+\-(\d)+", x=> "NewPrefix" + "-" + x.Groups[2].Value);
要重命名文件,您可以使用类似:
File.Move(oldFileName, newFileName);
如果你不熟悉正则表达式,你应该检查: http://www.radsoftware.com.au/articles/regexlearnsyntax.aspx
并下载此软件进行练习: http://www.radsoftware.com.au/regexdesigner/
【讨论】:
谢谢安德烈 - 你在 String.split 上使用 RegEx 的理由是什么?我可以得到这些建议中的任何一个,但想了解更多......问候,Doug Split 可以正常工作,但 Regex 会给您更多的灵活性。在您的情况下,它很容易拆分,但假设您想使用更复杂的模式进行替换,例如:012-123112-167-ab-128-bb.jpg。假设您要替换第一组字母,可能在任何地方?您会做什么?正则表达式更适合这种情况。 好点。这意味着我必须回到最终用户(公司经理)那里,看看他们对未来需求的预测。问候,以上是关于重命名服务器目录上的图像文件的主要内容,如果未能解决你的问题,请参考以下文章
powershell PowerShell文件,用于根据图像尺寸递归重命名和编辑目录中的图像。
如何批量识别图像中的文字并对图片进行识别的文字图片文件重命名,也可以识别后更改文件夹也支持多级目录