C#拆分文件名初学者练习

时间:2016-02-13 18:03:01

标签: c# string split

我有一个目录,里面有多个我要重命名的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];
    };            
}

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]);