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 символов.