Пожалуйста, подтвердите изменение поведения, связанного с длиной пути, в .NET 4.0 - PullRequest
4 голосов
/ 30 июня 2010

Может ли кто-нибудь подтвердить, что Microsoft изменила поведение некоторого класса, связанного с длиной пути, из System.IO в .NET 4.0? Например, приведенный ниже код отлично работает на .NET 3.5, но на 4.0 выдает исключение PathTooLongException для меня.

const string prefix = "C:\\";
const string suffix = ".txt";

var sb = new StringBuilder();
sb.Append(prefix);
for (var i = 0; i < 260 - prefix.Length - suffix.Length - 1; i++)
{
    sb.Append("a");
}
sb.Append(suffix);

var info = new FileInfo(sb.ToString());

Кроме того, вызов File.Create(sb.ToString()) вызывает исключение IOException в .NET 3.5, но исключение PathTooLongException в .NET 4.0. Там может быть больше различий.

Документированы ли эти изменения где-нибудь?

Спасибо!

[РЕДАКТИРОВАТЬ]

Я последовал совету Ханса Пассанта и написал отчет на connect.microsoft.com. Вы можете найти его здесь .

Ответы [ 2 ]

5 голосов
/ 30 июня 2010

Редактируя мой ответ, исходный был неверным.Да, метод 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 полностью корректно.

0 голосов
/ 30 июня 2010

Вы изучили методы File.Create() в отражателе и сравнили две версии?

...