Лучший способ решить путь к файлу слишком длинный исключением



Я создал приложение, которое загружает все библиотеки документов на сайте SP , но в какой-то момент он дает мне эту ошибку (я пытался смотреть на google, но не смог найти ничего, теперь, если кто-нибудь знает какой-либо трюк, чтобы решить эту проблему, пожалуйста, ответьте в противном случае спасибо за просмотр его)




System.IO.PathTooLongException: указанный путь, имя файла или оба слишком длинны. Полное имя файла не должно превышать 260 символов, а имя каталога не должно превышать 248 символов.
в системе.ИО.Путь.NormalizePathFast(string путь, логическое fullCheck)
в системе.ИО.Путь.GetFullPathInternal(string путь)
в системе.ИО.Типа FileStream.Метод init(string путь, режим filemode необходимо открыть флагами fileaccess, int32 и прав, логическое useRights, доля обменник, типа int32 значение bufferSize, варианты FileOptions, в разделе security_attributes secAttrs, строки msgPath, логическое bFromProxy)
в системе.ИО.Хранилище FileStream..чтор(string путь, режим filemode необходимо открыть флагами fileaccess, обменник акцию, типа int32 значение bufferSize, Параметры FileOptions)
в System.IO.File. Create(путь к строке)




он достигает предела для строки, код приведен ниже,



#region Downloading Schemes

private void btnDownload_Click(object sender, EventArgs e)
{
TreeNode currentNode = tvWebs.SelectedNode;
SPObjectData objectData = (SPObjectData)currentNode.Tag;
try
{
CreateLoggingFile();
using (SPWeb TopLevelWeb = objectData.Web)
{
if(TopLevelWeb != null)
dwnEachWeb(TopLevelWeb, TopLevelWeb.Title, tbDirectory.Text);
}
}
catch (Exception ex)
{
Trace.WriteLine(string.Format("Exception caught when tried to pass TopLevelWeb:{1}, Title = {2}, object data to (dwnEachWeb_method), Exception: {0}", ex.ToString(), objectData.Web, objectData.Title));
}
finally
{
CloseLoggingFile();
}
}

private void dwnEachWeb(SPWeb TopLevelWeb, string FolderName, string CurrentDirectory)
{
if (TopLevelWeb != null)
{
if (TopLevelWeb.Webs != null)
{
CurrentDirectory = CurrentDirectory + "" + TopLevelWeb.Title;
CreateFolder(CurrentDirectory);
foreach (SPWeb ChildWeb in TopLevelWeb.Webs)
{

dwnEachWeb(ChildWeb, ChildWeb.Title, CurrentDirectory);
ChildWeb.Dispose();
}
dwnEachList(TopLevelWeb, CurrentDirectory);
//dwnEachList(TopLevelWeb, FolderName, CurrentDirectory);
}
}
}

private void dwnEachList(SPWeb oWeb, string CurrentDirectory)
{
foreach (SPList oList in oWeb.Lists)
{
if (oList is SPDocumentLibrary && !oList.Hidden)
{
dwnEachFile(oList.RootFolder, CurrentDirectory);
}
}
}

private void dwnEachFile(SPFolder oFolder, string CurrentDirectory)
{
if (oFolder.Files.Count != 0)
{
CurrentDirectory = CurrentDirectory + "" + oFolder.Name;
CreateFolder(CurrentDirectory);
foreach (SPFile ofile in oFolder.Files)
{
if (CreateDirectoryStructure(CurrentDirectory, ofile.Url))
{
var filepath = System.IO.Path.Combine(CurrentDirectory, ofile.Url);
byte[] binFile = ofile.OpenBinary();
System.IO.FileStream fstream = System.IO.File.Create(filepath);
fstream.Write(binFile, 0, binFile.Length);
fstream.Close();
}
}
}
}

//creating directory where files will be download
private bool CreateDirectoryStructure(string baseFolder, string filepath)
{
if (!Directory.Exists(baseFolder)) return false;

var paths = filepath.Split('/');

for (var i = 0; i < paths.Length - 1; i++)
{
baseFolder = System.IO.Path.Combine(baseFolder, paths[i]);
Directory.CreateDirectory(baseFolder);
}
return true;
}

//creating folders
private bool CreateFolder(string CurrentDirectory)
{
if (!Directory.Exists(CurrentDirectory))
{
Directory.CreateDirectory(CurrentDirectory);
}
return true;
}

//shorting string

#endregion
619   8  

8 ответов:

поскольку причина ошибки очевидна, вот некоторая информация, которая должна помочь вам решить проблему:

посмотреть этот MS статья об именовании файлов, путей и пространств имен

вот цитата из ссылки:

Ограничение Максимальной Длины Пути в Windows API (за некоторыми исключениями, описанными в следующих параграфах) максимальная длина для пути используется MAX_PATH, который определяется как 260 символов. Один местный путь структурирован в следующем порядке: буква диска, двоеточие, обратная косая черта, компоненты имен, разделенные обратными косыми чертами, и завершение нулевой символ. Например, максимальный путь на диске D равен "D:\some 256-символьная строка пути " где " " представляет невидимое завершение нулевого символа для текущей системной кодовой страницы. (Этот символы используются здесь для визуальной ясности и не могут быть частью допустимая строка пути.)

и несколько обходные пути (взяты из комментариев):

есть способы решения различных проблем. Основная идея решений, перечисленных ниже, всегда одна и та же: уменьшите длину пути, чтобы иметь path-length + name-length < MAX_PATH. Вы можете:

  • поделиться в подпапке
  • используйте командную строку для назначения буквы диска с помощью SUBST
  • используйте AddConnection под VB, чтобы назначить букву диска пути

есть библиотека под названием Зета Длинные Пути это обеспечивает .NET API для работы с длинными путями.

вот хорошая статья, которая охватывает эту проблему для обоих .Чистая и PowerShell: ".Чистый, путь в PowerShell слишком долго и исключение .Чистая PowerShell для клонирования программы"

на Windows 8.1, используя. NET 3.5, у меня была аналогичная проблема.
Хотя имя моего файла было длиной всего 239 символов, когда я пошел создавать экземпляр объекта FileInfo только с именем файла (без пути), произошло исключение типа System. ИО.PathTooLongException

2014-01-22 11:10:35 DEBUG LogicalDOCOutlookAddIn.LogicalDOCAddIn - fileName.Length: 239 
2014-01-22 11:10:35 ERROR LogicalDOCOutlookAddIn.LogicalDOCAddIn - Exception in ImportEmail System.IO.PathTooLongException: Percorso e/o nome di file specificato troppo lungo. Il nome di file completo deve contenere meno di 260 caratteri, mentre il nome di directory deve contenere meno di 248 caratteri.
   in System.IO.Path.NormalizePathFast(String path, Boolean fullCheck)
   in System.IO.FileInfo..ctor(String fileName)
   in LogicalDOCOutlookAddIn.LogicalDOCAddIn.GetTempFilePath(String fileName) in C:\Users\alle\Documents\Visual Studio 2010\Projects\MyAddin1Outlook20072010\MyAddin1Outlook20072010\LogicalDOCAddIn.cs:riga 692
   in LogicalDOCOutlookAddIn.LogicalDOCAddIn.ImportEmail(_MailItem mailItem, OutlookConfigXML configXML, Int64 targetFolderID, String SID) in C:\Users\alle\Documents\Visual Studio 2010\Projects\MyAddin1Outlook20072010\MyAddin1Outlook20072010\LogicalDOCAddIn.cs:riga 857
   in LogicalDOCOutlookAddIn.LogicalDOCAddIn.ImportEmails(Explorers explorers, OutlookConfigXML configXML, Int64 targetFolderID, Boolean suppressResultMB) in C:\Users\alle\Documents\Visual Studio 2010\Projects\MyAddin1Outlook20072010\MyAddin1Outlook20072010\LogicalDOCAddIn.cs:riga 99

Я решил проблему обрезки имени файла до 204 символов (расширение включено).

Вы можете создать символическую ссылку с более коротким каталога. Первый открыть командную строку например,Shift + RightClick в нужной папке с более коротким путем (возможно, вам придется запустить его от имени администратора).

затем введите относительные или абсолютные пути:

mklink ShortPath\To\YourLinkedSolution C:\Path\To\Your\Solution /D

а затем начать решение с более короткого пути. Преимущество: Вам не нужно ничего двигать.

Если у вас возникли проблемы с вашим bin файлы из-за длинного пути в Visual Studio 2015 Вы можете перейти на страницу свойств проекта-нарушителя и изменить относительное Выход Каталог к более короткому.

например.bin\debug\ становится C:\_bins\MyProject\

то, что работало для меня, перемещает мой проект, как это было на рабочем столе (C:\Users\lachezar.l\Desktop\MyFolder) to (C:\0\MyFolder) который, как вы можете видеть, использует более короткий путь и уменьшает его, решая проблему.

решение, которое сработало для меня, состояло в том, чтобы отредактировать раздел реестра, чтобы включить поведение длинного пути, установив значение 1. Это новая функция выбора для Windows 10

HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)

Я получил это решение из именованного раздела статьи, которую опубликовал @james-hill.

https://docs.microsoft.com/fr-ca/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation

вы можете уменьшить название проекта:

Solution Properties -> Application -> Assembly Name

Comments

    Ничего не найдено.