Избегайте максимального ограничения символов c # - PullRequest
2 голосов
/ 22 сентября 2011

Чтобы превысить максимальный предел пути в c #, вам, очевидно, нужно объединить путь к вашему диску с @"\\?\" в начале.Если я сделаю это, то получу путь к диску со следующим:

\\\\?\\\\\\server\\share\\...

Теперь, если я найду файл / папку, произойдет сбой из-за недопустимых символов в пути(Я предполагаю ?), так как я могу принять подход, изложенный на веб-сайте Microsoft (http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx) правильно?

foreach (string filePath in Directory.GetFiles(folder))
{
    String s = @"\\?\" + filePath;

    if (filePath.Length > 255)
    {
        Console.WriteLine(filePath);
    }

    if (File.Exists(filePath))
    {
        FileInfo finfo = new FileInfo(s);
        folderSize += finfo.Length;
    }
}

foreach (string dir in Directory.GetDirectories(folder))
    folderSize += GetDirectorySize(dir);

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Стандартный System.IO не поддерживает путь длиннее 260 символов.

Но, похоже, есть библиотека с поддержкой путей расширенной длины: http://alphafs.codeplex.com/

Лично я до сих пор не пробовал.

1 голос
/ 22 сентября 2011

Не думаю, что вам следует добавлять все эти косые черты перед путем, я думаю, вы не поняли всего, что было написано здесь в MSDN:

Ограничение максимальной длины пути

В Windows API (с некоторыми исключениями, обсуждаемыми в следующих параграфах), максимальная длина пути составляет MAX_PATH, которая определяется как 260 символов.Локальный путь структурируется в следующем порядке: буква диска, двоеточие, обратная косая черта, компоненты имен, разделенные обратной косой чертой, и завершающий нулевой символ.Например, максимальный путь на диске D равен «D: \ some 256-символьная строка пути», где «» представляет невидимый завершающий нулевой символ для текущей системной кодовой страницы.(Символы <> используются здесь для наглядности и не могут быть частью допустимой строки пути.)

Примечание: Функции файлового ввода-вывода в Windows API преобразуют "/" в«\» как часть преобразования имени в имя в стиле NT, за исключением случаев использования префикса «\? \», как описано в следующих разделах.

В Windows API есть много функций, которые также имеют версии Unicodeразрешить путь расширенной длины для максимальной общей длины пути 32 767 символов.Этот тип пути состоит из компонентов, разделенных обратной косой чертой, каждая из которых соответствует значению, возвращенному в параметре lpMaximumComponentLength функции GetVolumeInformation (обычно это значение составляет 255 символов).Чтобы указать путь расширенной длины, используйте префикс "\? \".Например, «\? \ D: \ очень длинный путь».

Примечание: Максимальный путь в 32 767 символов является приблизительным, поскольку префикс «\? \» Может быть расширен доболее длинная строка системы во время выполнения, и это расширение применяется к общей длине.

, как вы можете прочитать там:

API Windows имеет много функцийкоторые также имеют версии Unicode, чтобы разрешить путь расширенной длины для максимальной общей длины пути 32 767 символов.

это ключ к вашей проблеме, если вам нужно создать или получить доступ к пути длиннеечем ~ 260 символов, вы должны использовать определенные API Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...