Die beste Möglichkeit, die Dateipfad zu lange Ausnahme zu lösen
Erstellte ich eine app, die downloads alle Dokumentbibliotheken in einer SP-Site , aber bei einem Punkt, der es mir dieser Fehler (ich habe gesucht bei google, aber konnte nicht finden, alles, jetzt, wenn jemand weiß, jeden trick, um dieses problem zu lösen bitte Antworten, ansonsten danke für das anschauen)
System.IO.PathTooLongException: Der angegebene Pfad, Dateiname oder beide sind zu lang. Der vollständig qualifizierte Dateiname muss weniger als 260 Zeichen und der name des Verzeichnisses muss mit weniger als 248 Zeichen.
System.IO.Pfad.NormalizePathFast(String path, Boolean fullCheck)
System.IO.Pfad.GetFullPathInternal(String path)
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)
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
System.IO.Datei.Create(String path)
er erreicht die Grenze für string, 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
InformationsquelleAutor der Frage Muhammad Raja | 2012-01-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als die Ursache der Fehler offensichtlich ist, hier einige Informationen, die Ihnen helfen sollten, das problem zu lösen:
Sehen diese MS-Artikel über Naming Files, Paths, and Namespaces
Hier ein Zitat aus dem link:
Und ein paar workarounds (aus den Kommentaren):
Gibt es Wege zur Lösung der verschiedenen Probleme. Die Grundidee der unten aufgeführten Lösungen ist immer die gleiche: Reduzieren Sie die Pfad-Länge, um
path-length + name-length < MAX_PATH
. Sie können:InformationsquelleAutor der Antwort James Hill
Gibt es eine Bibliothek namens Zeta Long Paths , bietet eine .NET-API für das arbeiten mit langen Pfaden.
Hier ist ein guter Artikel, deckt dieses Problem für beide .NET und PowerShell: ".NET, PowerShell-Pfad zu Lang ist Ausnahme und ein .NET PowerShell-Robocopy-Klon"
InformationsquelleAutor der Antwort Tim Lewis
Auf Windows 8.1, mit. NET 3.5, ich hatte ein ähnliches problem.
Obwohl der name meiner Datei war nur 239 Zeichen lang, wenn ich ging zu instanziieren Sie ein FileInfo-Objekt mit dem Dateinamen (ohne Pfad) aufgetreten ist, wird eine Ausnahme des Typs System. IO.PathTooLongException
Ich das problem gelöst trimmen der name der Datei, 204-Charaktere (Erweiterung enthalten).
InformationsquelleAutor der Antwort Marcel Piquet
Können Sie erstellen Sie eine symbolische Verknüpfung mit einer kürzeren Verzeichnis.
Erste Kommandozeile öffnen zum Beispiel durch
Shift + RightClick
in den gewünschten Ordner mit einem kürzeren Pfad (die Sie haben können, um es als administrator ausführen).Dann geben Sie mit relativen oder absoluten Pfaden:
Und starten Sie dann die Lösung aus dem kürzeren Pfad. Der Vorteil ist hier: Sie müssen nicht alles bewegen.
InformationsquelleAutor der Antwort Markus Weber
Wenn Sie ein Problem mit Ihrem bin Dateien aufgrund eines langen Pfad, In Visual Studio 2015 können Sie gehen, um die problematische Projekt die Eigenschaftenseite, und ändern Sie die relativen Ausgabe-Verzeichnis zu einer kürzeren.
E. g. bin\debug\ wird C:\_bins\MyProject\
InformationsquelleAutor der Antwort N-ate
Was für mich gearbeitet ist, bewegt sich mein Projekt, wie es war auf dem desktop (C:\Users\lachezar.l\Desktop\MyFolder bis C:\0\MyFolder), die, wie Sie sehen können, verwendet kürzere Weg und reduziert es das problem gelöst.
InformationsquelleAutor der Antwort Lachezar Lalov
Reduzieren Sie den Namen des Projekts in:
InformationsquelleAutor der Antwort Pauly Garcia