Редактируя мой ответ, исходный был неверным.Да, метод Path.NormalizePath () претерпел некоторые значительные изменения в .NET 4.0.Мне удалось отладить это с помощью Reference Source и найти в исходном коде комментарий, объясняющий его поведение:
// The max total path is 260, and the max individual component length is 255.
// For example, D:\<256 char file name> isn't legal, even though it's under 260 chars.
internal static readonly int MaxPath = 260;
private static readonly int MaxDirectoryLength = 255;
...
if (newBuffer.Length - 1 - lastDirectorySeparatorPos > MaxDirectoryLength)
{
throw new PathTooLongException(Environment.GetResourceString("IO.PathTooLong"));
}
Это исключение, которое отключается вашим кодом.Это выглядит странно, потому что код, по-видимому, проверяет длину имени каталога, которая явно не близка к 255 символам в вашем коде.Тем не менее, комментарий объясняет, почему ваш путь отклонен, часть имени файла пути составляет 259-3 = 256 символов.Слишком много.
Ранее я не знал об этом ограничении и немного сомневаюсь, что все версии Windows имеют это ограничение.Все, что я видел, задокументировано, что действительно есть максимальная длина имени каталога (путь минус имя файла).В коде есть другие комментарии, которые предполагают, что в Windows 2000 есть ошибка, которая может быть как-то связана с этим.
В любом случае, вы можете сами убедиться в этом, изменив
const string prefix = "C:\\a\\";
И теперь принимается строка пути из 259 символов.Другими словами, такое поведение должно выполняться только в том случае, если имя пути относится к корневой папке диска.Не то место, где вы должны хранить файлы.
Учитывая комментарии в исходном коде, это изменение было довольно преднамеренным и должно рассматриваться как функция, а не ошибка.Тем не менее, я разместил комментарий к статье обратной связи, которую вы начали.Я все еще не покупаю это полностью ...
Обновление: хорошо, я продан на этом.Я попытался создать такой файл с помощью C ++ на Win7, и это не удалось.Файлы в корневом каталоге действительно не могут иметь пути более 258 символов.По-видимому, ограничение вызвано компонентом пути (имя подкаталога, имя файла), длина которого не может превышать 255 символов.Поведение .NET 4.0 полностью корректно.