2009-07-06 1 views
2

У меня есть следующий код:PathTooLongException в C# код

public static void Serialize() 
    { 

     List<string> dirs = FileHelper.GetFilesRecursive(fileDirectoryPath); 
     List<string> dirFiles = new List<string>(); 
     foreach (string p in dirs) 
     { 
      string path = p; 

      string lastAccessTime = File.GetLastAccessTime(path).ToString(); 


      bool DirFile = File.Exists(path); 
      FileInfo fInf = new FileInfo(path); 
      long lengthInk = fInf.Length/1024; 

      DateTime lastWriteTime = File.GetLastWriteTime(p); 
      dirFiles.Add(p + "|" + lastAccessTime.ToString() + "|" + DirFile.ToString() + "|" + lastWriteTime.ToString() + "|" + lengthInk.ToString() + " kb"); 


     } 

Я попадающий ошибку PathTooLongException с помощью следующей строки:

string lastAccessTime = File.GetLastAccessTime(path).ToString(); 

приложения сверл в привод и находит все файлы/папки с приводом. Я не могу изменить этот путь, но поскольку он превышает 260 символов ... как обойти это?

+0

использование окон api [http://galratner.com/blogs/net/archive/2011/02/13/getting-around-pathtoolongexception-on-file-move-with-windows-native-api.aspx ] (http://galratner.com/blogs/net/archive/2011/02/13/getting-around-pathtoolongexception-on-file-move-with-windows-native-api.aspx) – julian

+0

Мои собственные и другие ответы [здесь] (http://stackoverflow.com/a/29605805/589059) предлагают некоторые библиотеки-обертки, которые вы можете использовать для работы с длинными путями. – rkagerer

+0

Возможный дубликат [Как избежать System.IO.PathTooLongException?] (Http://stackoverflow.com/questions/530109/how-to-avoid-system-io-pathtoolongexception) – Deantwo

ответ

4

Звонок GetLastAccessTime() с полным путем может содержать exceed the internal limit (который имеет версию ОС, но обычно 260 символов) на максимальной длине для полного пути к файлу.

Один из способов избежать этого - использовать Directory.SetCurrentDirectory(), чтобы изменить текущий системный каталог, а затем позвонить GetLastAccessTime() только с относительным путем. Просто убедитесь, что вы изменили свой текущий каталог на то, что вы начали, чтобы избежать неожиданных проблем.

+0

Я достиг этого ответа, исследуя аналогичную проблему. Но я считаю, что SetCurrentDirectory также бросает PathTooLongExceptipn. Мой вопрос: http://stackoverflow.com/questions/4050199/directory-setcurrentdirectory-throws-pathtoolongexception. Оцените любые комментарии, которые у вас есть. –

+0

@Hemal: 'SetCurrentDirectory()' принимает относительные пути. Вы пытались разделить операцию на два вызова? Например, чтобы перейти к 'C: \ FirstPart \ SecondPart \ ThirdPart', вы должны: SetCurrentDirectory (« C: \\ FirstPart \\ SecondPart »); SetCurrentDirectory ("\\ ThirdPart"); '. Разделив навигацию каталога на несколько этапов, вы можете обойти ограничения длины пути. – LBushkin

+0

спасибо, что ответили. Да, я пробовал относительные пути, но это также дает то же исключение, когда я достигаю предела длины. –

0

.NET не поддерживает пути к файлам Unicode, поэтому единственным вариантом, который я знаю в этом случае, является использование P/Invoke (если, конечно, вы не можете изменить путь) для вызова функций API Win32, которые их поддерживают , Вы можете посмотреть here для получения инструкций о том, как использовать путь к файлу Unicode, чтобы разбить барьер на 260 символов.

0

Как Microsoft говорит here, существует ограничение Windows на 260 символов.

Вы можете попытаться избежать этого с помощью symbolic link (не уверен ...).

+0

Ссылка на ограничение на самом деле содержит решение (см. мой ответ на вопрос). –

2

Нечто вроде .LastAccessTime собственности Delimon.Win32.IO.FileInfo, может сделать трюк.

Delimon библиотека на Microsoft TechNet для преодоления длинной проблемы имен файлов, это называется Delimon.Win32.I​O Library (V4.0) и у него есть свои собственные версии ключевых классов из System.IO

Например, вы должны заменить:

System.IO.Directory.GetFiles 

с

Delimon.Win32.IO.Directory.GetFiles 

, который позволит вам работать с большими файлами и сгиб ERS.

С сайта:

Delimon.Win32.IO заменяет основные функции файл System.IO и поддерживает файловые & имена папок до до 32767 символов.

Эта библиотека написана на .NET Framework 4.0 и может использоваться либо на x86 & x64 системах. Файл & Ограничения папки стандарта Пространство имен System.IO может работать с файлами с 260 символами в имени файла и 240 символами в имени папки (MAX_PATH обычно настроен как 260 символов). Обычно вы запускаете ошибку System.IO.PathTooLongException со стандартной библиотекой .NET.

+0

Последует этот совет вчера, но GetFileSystemInfos() бросил не реализованное исключение. Также прочитайте, что он больше не поддерживается, и вместо этого увидел это: https://github.com/alphaleonis/AlphaFS – Bunjy

Смежные вопросы