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 символов... как обойти это?

4 ответа

Решение

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

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

Что-то вроде .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

что позволит вам обрабатывать длинные файлы и папки.

С веб-сайта:

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

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

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

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

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

Другие вопросы по тегам