【发布时间】:2021-09-14 01:58:55
【问题描述】:
我有以下代码将以下树中的文件从 00000001.pdf 重命名为具有这 8 个字符左填充的最后一个文件,例如:00000100.pdf
- 文件夹 1
- 子文件夹 1
- 子文件夹1
- pdffile1
- pdffile2
- 子文件夹2
- pdffile3
- pdffile4
- 子文件夹1
- 子文件夹2
- 子文件夹3
- pdffile5
- pdffile6
- 子文件夹3
- 子文件夹 1
但由于某些原因,在其中一些子文件夹中,它不断地重命名它们。 有时它只是跳转到另一个数字,就好像它是一个异步操作一样。但是,如果我停止并重新开始,直到第二个下一个文件夹,它会再次出现问题。 但是这个错误只发生在 19 个文件夹中。 确实,他们的 pdf 名称与其他名称不同,但我看不出它是如何相关的。 其他文件的名称类似于 "DOCUMENT_01" 等等,但它们是: 0000000100000001.pdf 0000000200000001.pdf 0000000300000001.pdf 等等
static void Main(string[] args)
{
Console.WriteLine("Digite a pasta 'pai' onde serão buscados pdfs dentro das pastas 'filhas':");
string path = Console.ReadLine();
foreach (string dir in Directory.EnumerateDirectories(path))
{
foreach (string subdir in Directory.EnumerateDirectories(dir))
{
Console.WriteLine($"{dir} - {subdir}");
int n = 1;
foreach (string pdffile in Directory.EnumerateFiles(subdir, "*.pdf", SearchOption.AllDirectories))
{
Console.WriteLine(n.ToString().PadLeft(8, '0') + " " + new FileInfo(pdffile).Length);
File.Move(pdffile, subdir + $"\\{n.ToString().PadLeft(8, '0')}.pdf");
n++;
}
Console.WriteLine("\n\n");
}
}
}
可能出了什么问题? 它应该等待 File.Move 方法结束以添加 n + 1,然后作为同步操作移动到下一个 pdffile。那么为什么它会在随机时间后跳跃数字以及为什么它会一直持续下去呢? 只是要记住,如果我停止程序并重新启动并将被搞砸的文件夹作为第一个文件夹,它就可以了,只有当它进入下一个文件夹时,或者它开始给我的下一个文件夹之后又是这个错误。
希望我能说清楚...感谢您的关注!
编辑:将尝试使用 FileInfo 类为我提供带有 SearchOption.AllDirectories 选项的父文件夹,并排除这个 3 阶段循环加上实际上适用于任何类型的树结构 EDIT2:尝试过,作为“树独立”脚本工作,但在第一个文件夹之后的文件名得到相同的结果......因为它真的很快,在 3 秒内它从 00000169.pdf 到00006239.pdf 在一个只有 330 个项目的文件夹中。
【问题讨论】:
-
Directory.EnumerateFiles(dir)在枚举时如果目录内容发生变化会不高兴。您应该通过附加ToList:Directory.EnumerateFiles(dir).ToList()来实现集合 -
哦,我会试试的!谢谢!但为什么只在这些特定文件夹中?我在另一个 +/-30 个文件夹中使用错误,但没有发生错误
-
可能是文件大小需要更长时间才能移动,我认为 File.Move 不会等待操作完成。
-
它工作了@KlausGütter!丹克塞尔!感谢@Matt,奇怪的行为,但至少我不必再处理它了!
-
在您最后一次编辑之后,您的问题是什么以及解决方案是什么都不清楚了。您可能希望将解决方案添加为答案,而不是通过编辑问题。