DirectoryNotFoundException - 找不到路径的一部分

问题描述:

我有一个控制台应用程序,我为自己构建了用于重命名我下载的.mp3文件。这个应用程序已经完美运行了好几个月,但突然之间在一个特定的目录下抛出了标题为例外的情况。它不仅是一个目录,而且仅在一定数量的文件上发生 - 其中3个已成功重命名。DirectoryNotFoundException - 找不到路径的一部分

这里是我的目录路径和文件:

enter image description here

这里就是抛出异常的目录路径的一个片段,有异常的消息一起:

enter image description here

这里是我的代码:

static void Main(string[] args) { 
    string dir = @"M:\Temp Downloading Folder"; 

    var files = new DirectoryInfo(dir + @"\Gregory Alan Isakov Discography [2005 - 2013]\Rust Colored Stones").GetFiles("*.mp3").ToList(); 

    foreach (var item in files) { 
     if (item.Name.Substring(0, 2).All(char.IsDigit)) { 
      //string fullName = item.FullName.Replace("\\", "/"); 
      string newName = "Gregory Alan Isakov "; 
      //exception thrown here 
      File.Move(item.FullName, item.FullName.Replace(item.Name.Substring(0, 3), newName)); 
     } 
    } 
    Console.WriteLine("Done!"); 
    Console.ReadKey(); 
} 

我尝试改变路径以使/而不是\\具有相同的结果。

按照Documentation on MSDN

当一个文件或目录的一部分,无法 被发现时引发的异常。

然而,目录是发现和正确地重新命名为第一3个文件(作为第一图像中描绘的)。

任何人都可以向我解释为什么会发生这种情况吗?

+0

此表达式的打印值'item.FullName.Replace(item.Name.Substring(0,3),newName)'。 – PetSerAl

+0

可能是文件夹名称太长了?在相同的文件上尝试更短的路径,看看是否会产生相同的错误。 – Chase

+0

这是获取文件的常见问题。它搜索子文件夹,并会在发生任何异常时中止。要继续搜索,您需要有一个异常处理程序,该异常处理程序将在异常后继续搜索。正确做到这一点的唯一方法是具有递归功能。 – jdweng

您的代码更改文件夹,而不是文件名,运行你的代码中的错误:

C:\ TEMP下载文件夹\格雷戈里·艾伦·伊萨科夫唱片[2005 - 2013] \铁锈色的石头\ 05 - 只有Ghosts.mp3

改为:

C:\ TEMP文件夹下载\格雷戈里·艾伦·伊萨科夫唱片[20 格雷戈里 艾伦伊萨科夫 - 2013] \铁锈色的石头\格雷戈里·艾伦·伊萨科夫 - 只有 Ghosts.mp3

我让你调试和修复它自己。

+0

你确定?如果这只是一个错误,我会很乐意删除这个问题,但我实际上没有得到那个结果。 –

+1

尝试在你的'File.Move(...)之前输出所有的字符串,你会看到。 – 2016-01-24 17:04:04

+2

Yup现在看到了,似乎与文件路径有关,包括'05',与文件名相同。好吧,我会把这个问题留下来,因为其他人可能会陷入和我一样的陷阱。 –

问题可能是由于您的文件夹路径的长度。缩短长度并重试。

Microsoft's documentation on file naming and path lengths提到Windows对路径的总长度加上它的文件名限制了260个字符限制;这个被引用的最大路径长度的限制,这里列出,方便参考:

在Windows API(在以下 段落中讨论一些例外),对于路径的最大长度为MAX_PATH,这是 定义为260个字符。本地路径的结构如下 顺序:驱动器号,冒号,反斜杠,由 反斜杠分隔的名称组件,以及终止空字符。例如,驱动器D上的最大路径 是“D:\某些256个字符的路径字符串” 其中“”表示当前系统代码页的不可见的终止空字符。 (字符<>在这里用于 视觉清晰度,并不能有效的路径字符串的一部分。)

但是,如果你在使用路径名作为-是坚持,你可以探索使用扩展通过用“\?”前缀路径来扩展路径名称约定符号。

在Windows API具有许多功能也具有Unicode的版本,以允许 用于 32,767个字符的最大总路径长度的延伸长度的路径。此类路径由用反斜杠分隔的组件 组成,每个组件由GetVolumeInformation 函数(此值通常为255个字符)的 lpMaximumComponentLength参数返回的值。要指定 扩展长度路径,请使用“\?\”前缀。例如,“\?\ D:\很 长路径”。

+0

我没有投票,但是我没有完全意识到我犯的愚蠢错误,所以我带领你走下了花园。 Nima Ara'的回答其实是对的,我在我的评论中解释了它的问题。 –

+0

已更新的答案您可能也会遇到此问题,因此我认为这是值得发布的内容:) – Chase

+0

是的,请详细解释 - 给谁这样做。我的回应似乎很重要,即使这不是问题的实际解决方案。 – Chase