我有一个目录,里面有多个我要重命名的excel文件。名称都有前导整数和'-
'。例如: 0123456-Test_01
。我想通过删除此前缀来重命名此目录中的所有文件。 0123456-Test_01
应该是 Test_01
。我可以重命名字符串的硬编码实例,但是无法获取文件并重命名所有文件。
我的代码如下。感谢任何帮助,因为我显然是C#的新手。
public static void Main()
{
//Successfully splits hardcoded string
var temp = "0005689-Test_01".Split('-');
Console.WriteLine(temp[1]);
Console.ReadLine();
//Unsuccessful renaming of all files within directory
List<string> files = System.IO.Directory.GetFiles(@"C:\Users\acars\Desktop\B", "*").ToList();
System.IO.File.Move(@"C:\Users\acars\Desktop\B\", @"C:\Users\acars\Desktop\B\".Split('-'));
foreach (string file in files)
{
var temp = files.Split('-');
return temp[1];
};
}
答案 0 :(得分:3)
您的代码中有一些错误需要修复。
第一个是变量files
的错误用法。这是文件的完整列表,而不是您要拆分和移动的单个文件。正如所解释的那样,您应该使用存储在变量 file
最重要的问题是,如果目标文件存在,File.Move方法会抛出异常。删除文件名字符串的第一部分后,您无法确定结果名称在目录中是否唯一 因此,必须在移动前检查文件是否存在。
最后,最好使用Directory.EnumerateFiles,因为此方法允许您开始执行移动代码,而无需先在列表的内存中加载所有文件名。 (在一个充满文件的文件夹中,这可能会在速度上产生明显的差异)
public static void Main()
{
string workPath = @"C:\Users\acars\Desktop\B";
foreach (string file in Directory.EnumerateFiles(workPath)
{
string[] temp = file.Split('-');
if(temp.Length > 1)
{
string newName = Path.Combine(workPath, temp[1]);
if(!File.Exists(newName))
File.Move(file, newName);
}
}
}
另请注意CodeNotFound中的以下评论。您正在使用硬编码路径,因此问题实际上并不存在,但如果目录中包含一个"-"
,那么您应该使用类似这样的内容来获取分割数组中的最后一个元素
string newName = Path.Combine(workPath, temp[temp.Length-1]);