2013-02-19 2 views
5

Мой открытый исходный код software синхронизирует удаленную папку с локальным рабочим столом. Удаленная папка может находиться на Alfresco, где длина пути не имеет ограничений (/root/very/very/very/long/name.txt).C# библиотека ввода/вывода, которая поддерживает длинные пути (для решения PathTooLongException)

При разработке приложения я использовал System.IO.File.OpenWrite и System.IO.Stream.Write, но это, кажется, что they don't support paths over a few hundred characters, так что пользователи сообщают об ошибках, как PathTooLongException при работе с длинными путями.

UNC Следует избегать путей, поскольку они приводят к несовместимости с некоторыми приложениями.

Какую библиотеку/код следует использовать в этом случае?

Должно быть C# с открытым кодом.

+0

Я просто заметил, что ты сделал «пост свой ответ» функцию. Я готов поспорить вам, когда вы стучите головой, размышляя об этом, и теперь вы хотите поделиться тем, как вы его решили, чтобы другим не пришлось страдать. [Я был там] (http://stackoverflow.com/q/11346554/80274). –

ответ

1

".NET 2.0 Workaround for PathTooLongException" (артикул + код).

Лицензия на основании открытого кода проекта (CPOL), который не является открытым исходным кодом apparently.

только 2 фиксаций не делают для очень активного проекта, хотя ...

+1

Ummm, на самом деле это не «проект», а просто говорит вам использовать PInvoke для вызова 'CreateFileW' и использовать' \\? \. 'В начале вашего имени пути. –

+0

Я забираю это, я посмотрел на источник, он действительно приложил к нему какую-то работу. Меня не волнует «не слишком активная» часть.Вы просто обертываете Windows API несколькими вспомогательными функциями, как только вы избавились от своих ошибок, там не так много сделать –

1

Native File System Access

После пересмотра 185 (19 февраля го 2013), библиотека покрыта Microsoft Public License (MS-PL), как указано в заголовках файлов исходного кода.

Выглядит многообещающе, но автор advises не использует его в корпоративной среде, так как код недостаточно прочный.

В этой библиотеке есть unit tests, но документации отсутствует.

+0

Ссылка не работает –

+0

@ThomasLevesque: Исправлено, спасибо за подсказку! –

+0

Я не могу рекомендовать эту библиотеку. Основные функции, такие как 'File.Open', не работают (удаляет дескриптор потока, который он возвращает, и игнорирует параметры' access'/'share'), и перечисление файлов молча игнорирует ошибки. – CodesInChaos

2

Вы можете попробовать Base Class Libraries Long Path implementation. Но имейте в виду, что не все будет работать, если вы начнете смешиваться с методами .NET I/O по умолчанию.

+0

Это рекомендуемое решение. +1 Раньше использовали. Я вспоминаю ошибку там во время первоначального выпуска, но это с открытым исходным кодом, и я уверен, что с тех пор официально зафиксировано. –

+0

+1 Отлично! Лицензия - это Microsoft Public License (Ms-PL), которая является открытым исходным кодом, хотя она, к сожалению, не совместима с GNU-GPL: http://www.gnu.org/licenses/license-list.html#ms-pl –

1

Вы могли бы попытаться расколоть путь вверх, используя относительные пути, как указано в этом ответе, используя:

Directory.SetCurrentDirectory() 

PathTooLongException in C# code

+0

Интересно ... может быть, есть библиотека, которая делает этот трюк автоматически для меня? –

3

AlphaFS позволяет использовать очень длинные пути (с помощью «\? \» Стиль) и имитирует пространство имен System.IO.

Возможно, вы сможете использовать эту библиотеку так же, как если бы вы использовали System.IO. Например, AlphaFS.Win32.Filesystem.File.Copy() вместо System.IO.File.Copy().

(source)