2

我有一个包含一些文本文件的目录。我正在尝试以从 01、02、03 ... 103 等开始的顺序以编程方式重命名文件...

我的目录中有很多文件,但文件的顺序不正确。我想删除它的当前序列并从 01 开始,依此类推。

目前,我写了这个,但它缺少一些东西并且它不能正常工作。你能为我指出正确的方向吗?

在此处输入图像描述

    public static void NumberFiles()
    {
        var files = Directory.GetFiles(@"C:\Test-File", "*.txt");
        var filenames = files.Select(Path.GetFileName).ToArray();
        int count = 1;
        foreach (var f in files)
        {
            System.IO.File.Move(f, filenames[count -1].Remove(0, 2));
            string newFileName = Path.Combine(Path.GetDirectoryName(f), (count + Path.GetFileName(f)));
            System.IO.File.Move(f, newFileName);
            count++;
        }

        Console.WriteLine("Job Complete!");
        Console.ReadKey();
    }

错误:当我运行它时,我找不到文件。

在此处输入图像描述

4

2 回答 2

1

首先,我们应该得到要重命名的文件。我怀疑是否应该移动所有*.txt 文件,可能我们应该使用一些模式

string pattern = @"^[0-9]{1,3}\..*Copy \([A-Z0-9]+\)$";

所以我们可以把

var files = Directory
  .EnumerateFiles(@"C:\Test-File", "*.txt")
  .Where(file => Regex.IsMatch(Path.GetFileNameWithoutExtension(file), pattern))
  .Select(file => new {
     // C:\Test-File\25.New File - Copy (A4).txt
     file  = file,                              
     // 25    
     index = int.Parse(Regex.Match(Path.GetFileName(file), @"^[0-9]+").Value),
     // New File - Copy (A4).txt
     name  = Path
       .GetFileName(file)
       .Substring(Regex.Match(Path.GetFileName(file), @"^[0-9]+\.").Value.Length)  
       .Trim()  
   }) 
  .OrderBy(item => item.index)
  .Select((item, i) => new {
     // C:\Test-File\25.New File - Copy (A4).txt
     oldFile = item.file,
     // C:\Test-File\07.New File - Copy (A4).txt 
     newFile = Path.Combine(
         Path.GetDirectoryName(item.file),
       $"{i + 1:d2}.{item.name}") 
   })
  .ToArray();

如果我们想看看发生了什么:

foreach (var record in files)
  Console.WriteLine($"{record.oldFile} -> {record.newFile}");

最后,循环和移动:

foreach (var record in files)  
  File.Move(record.oldFile, record.newFile);

Console.WriteLine("Job Complete!");
Console.ReadKey();
于 2019-09-10T09:12:52.467 回答
1

您的数字似乎由 . 分隔.

您可以将文件名拆分为'.'. 跳过第一条记录,然后使用 count 更新您的文件名。

就像是,

//Instead of .Remove() use below logic
System.IO.File.Move(f, string.Join(".", filenames[count -1].Split('.').Skip(1)));
于 2019-09-10T08:56:30.553 回答