以编程方式重命名文件,递减

Renaming files programmatically, decrementing

我有一个文件夹,其中包含一定数量的名为 1.txt, 2.txt 3.txt 等的文本文件

我的目标是,当其中一个被删除时,重命名任何一个比被删除的文件大的文件向下一个。

例如。如果1.txt被删除,2应该重命名为1,3重命名为2,依此类推。

这是我目前的尝试:

 private void deletequestionbtn_Click(object sender, EventArgs e)
    {

        string fileDel = testfolderdialog.SelectedPath.ToString() + @"\" + questionCountint.ToString() + ".txt";
        DirectoryInfo d = new DirectoryInfo(testfolderdialog.SelectedPath.ToString() + @"\");

        File.Delete(fileDel);
        questionCountint++;

        foreach (var file in d.GetFiles("*.txt"))
        {
            string fn = file.Name;
            string use = fn.Replace(".txt", "");
            int count = int.Parse(use);

            if (count > questionCountint)
            {              
                File.Move(fileDel, testfolderdialog.SelectedPath.ToString() + @"\" + questionCountint--.ToString() + ".txt");
            }          
        }             
    }

问题出现在 File.Move 行,它说它无法在 fileDel 中找到文件,尽管我在删除 fileDel[= 后递增 questionCountint 17=]

我是不是用错了方法? foreach语句有没有更有效的写法?我只想重命名比删除的文件大的文件。

我哪里错了?

问题是您正在尝试重命名 fileDel,这是您已删除的文件。您应该改名为 file

不过,你很快就会运行进入下一个问题。如果您没有按照您期望的确切顺序获取文件,您将尝试将文件重命名为已经存在的名称。

如果GetFiles方法returns顺序为"3.txt", "2.txt"的文件,你会先尝试将"3.txt"重命名为"2.txt",但是"2.txt" 已经存在。

您应该首先遍历文件并收集所有应该重命名的文件。然后你应该按编号对文件进行排序,以便你可以按正确的顺序重命名它们。

由于文件名的格式很容易从数字中重新创建,因此您只需获取列表中的数字即可:

List<int> files = new List<int>();
foreach (var file in d.GetFiles("*.txt")) {
  string fn = file.Name;
  string use = fn.Replace(".txt", "");
  int count = int.Parse(use);
  if (count > questionCountint) {
    files.Add(count);
  }
}
string path = testfolderdialog.SelectedPath.ToString();
foreach (int count in files.Ordery(n => n)) {
  File.Move(String.Concat(path, count.ToString() + ".txt"), String.Concat(path, (count - 1).ToString() + ".txt");
}