directory.getfiles在出错时停止搜索

时间:2015-08-10 12:36:04

标签: c# .net linq

我有这个代码巫婆在我的开发环境中完美运作:

String[] FileNames = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".bak") || s.EndsWith(".dwg")).ToArray();
var queryDupNames = from f in FileNames
                    group f by Path.GetFileNameWithoutExtension(f) into g
                    where g.Count() > 1
                    select new { Name = g.Key, FileNames = g }
                 ;
var lista = queryDupNames.ToList();

使用此代码我正在寻找具有相同名称和不同扩展名(bak和dwg)的文件。当我用我的公司映射驱动器尝试这个时,我收到了这个错误:

Excepción no controlada: System.IO.DirectoryNotFoundException: No se puede encontrar una parte de la ruta de acceso 'O:\auskalononden\sistema de gestion\mantenimiento\01.-Maquinas y utiles\COMPROBADORAS\utiles y maquinas sin presion ni agua original\Deapnelizadora de alimantacion CODIGO-- ESPAÑA-- FRANCIA\JAULA GIRONA ESPAÑA FRANCIA\Jaula de utensilios KIDJQd sC-22\4403.-repu'.
   en System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   en System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption)
   en System.IO.Directory.GetFiles(String path, String searchPattern, SearchOption searchOption)
   en bakdwg.Program.Main(String[] args) en D:\dev\bakdwg\bakdwg\Program.cs:línea 19

有什么可告诉的:如果你对这条路径有错误,请按照下一条路径进行操作?还是什么?

2 个答案:

答案 0 :(得分:2)

该路径有261个字符。普通的Win32 API最大值为260(MAX_PATH),并且在.NET中不支持Win32的长路径支持(你可以P / Invoke,但这意味着在那个文件/目录上执行所有操作)。

答案 1 :(得分:2)

根据我的评论,错误发生是因为您的文件路径太长。正如@Richard评论的那样,您可以直接使用Win32 API来绕过此限制。但是,我个人更喜欢使用TechNet的Delimon.Win32.IO C#库。该库取代了System.IO的基本文件功能,并支持File&文件夹名称最多为32,767个字符。请参阅下面的基本代码示例:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

// Specifically adding the Delimon.Win32.IO Library to use in the current Code Page 
using Delimon.Win32.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            string[] files = Directory.GetFiles(@"c:\temp"); 
            foreach (string file in files) 
            { 
                Console.WriteLine(file); 
            } 
            Console.ReadLine(); 
        } 
    } 
}