以编程方式重命名文件,递减
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");
}
我有一个文件夹,其中包含一定数量的名为 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");
}