Ich habe eine App erstellt, die alle Dokumentbibliotheken in einer SP-Site herunterlädt, aber an einem Punkt gibt es mir diese Fehlermeldung (ich habe versucht, bei Google zu suchen, aber konnte; nichts finden, jetzt, wenn jemand weiß, jeder Trick, um dieses Problem zu lösen, bitte antworten Sie andernfalls danke für die Betrachtung es)
System.IO.PathTooLongException: Der angegebene Pfad, Dateiname oder beides ist zu lang. Der voll qualifizierte Dateiname muss weniger als 260 Zeichen lang sein, und der Verzeichnisname muss weniger als 248 Zeichen lang sein. at System.IO.Path.NormalizePathFast(String path, Boolean fullCheck) at System.IO.Path.GetFullPathInternal(String path) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) at System.IO.File.Create(String path)
erreicht er das Limit für String, der Code ist unten angegeben,
#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
Da die Ursache des Fehlers offensichtlich ist, hier einige Informationen, die Ihnen bei der Lösung des Problems helfen sollen:
Siehe diesen MS-Artikel über die Benennung von Dateien, Pfaden und Namensräumen
Hier's ein Zitat aus dem Link:
Maximum Path Length Limitation In der Windows-API (mit einigen Ausnahmen, die in den folgenden Absätzen erläutert werden), ist die maximale Länge für einen Pfad ist MAX_PATH, die auf 260 Zeichen definiert ist. Ein lokaler Pfad ist in der folgenden Reihenfolge aufgebaut: Laufwerksbuchstabe, Doppelpunkt, Backslash, durch Backslashes getrennte Namensbestandteile und ein abschließendes Null-Zeichen. Der maximale Pfad auf Laufwerk D ist zum Beispiel "D:\some 256-stellige Pfadzeichenfolge
" wobei " " das unsichtbare abschließendes Null-Zeichen für die aktuelle System-Codepage darstellt. (Die Zeichen < > werden hier zur visuellen Klarheit verwendet und können nicht Teil von einer gültigen Pfadzeichenkette sein.)
Und ein paar Umgehungsmöglichkeiten (aus den Kommentaren):
Es gibt Möglichkeiten, die verschiedenen Probleme zu lösen. Die Grundidee der unten aufgeführten Lösungen ist immer dieselbe: Reduziere die Pfadlänge, um Pfadlänge + Namenslänge < MAX_PATH
zu erhalten. Sie können:
Es gibt eine Bibliothek namens Zeta Long Paths, die eine .NET-API für die Arbeit mit langen Pfaden bietet.
Hier ist ein guter Artikel, der dieses Problem sowohl für .NET als auch für PowerShell behandelt: ".NET, PowerShell Path too Long Exception and a .NET PowerShell Robocopy Clone"
Unter Windows 8.1, mit. NET 3.5, hatte ich ein ähnliches Problem.
Obwohl der Name meiner Datei nur 239 Zeichen lang war, trat beim Instanziieren eines FileInfo-Objekts nur mit dem Dateinamen (ohne Pfad) eine Ausnahme vom Typ System. IO.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
Ich habe das Problem gelöst, indem ich den Dateinamen auf 204 Zeichen gekürzt habe (einschließlich Erweiterung).