Ich habe eine App erstellt, die alle Dokumentbibliotheken auf einer SP-Site herunterlädt, aber irgendwann wurde mir dieser Fehler angezeigt (ich habe versucht, auf Google zu schauen, konnte aber nichts finden. Wenn jemand einen Trick zur Lösung dieses Problems kennt, antworten Sie bitte anderweitig, 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 Verzeichnisname weniger als 248 Zeichen enthalten. at System.IO.Path.NormalizePathFast (String path, Boolean fullCheck) at System.IO.Path.GetFullPathInternal (String path) at System.IO.FileStream.Init (String path, FileMode-Modus, FileAccess-Zugriff, Int32-Rechte, Boolean useRights , FileShare-Freigabe, Int32 bufferSize, FileOptions-Optionen, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) bei System.IO.FileStream..ctor (String-Pfad, FileMode-Modus, FileAccess-Zugriff, FileShare-Freigabe, Int32 bufferSize, FileOptions-Optionen) bei System. IO.File.Create (String path)
es erreicht die Grenze für Zeichenfolge, 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
Antworten:
Da die Ursache des Fehlers offensichtlich ist, finden Sie hier einige Informationen, die Ihnen bei der Lösung des Problems helfen sollen:
Weitere Informationen zum Benennen von Dateien, Pfaden und Namespaces finden Sie in diesem MS-Artikel
Hier ist ein Zitat aus dem Link:
Und ein paar Problemumgehungen (aus den Kommentaren entnommen):
Es gibt Möglichkeiten, die verschiedenen Probleme zu lösen. Die Grundidee der unten aufgeführten Lösungen ist immer dieselbe: Reduzieren Sie die Pfadlänge, um zu haben
path-length + name-length < MAX_PATH
. Du darfst:quelle
Starting in Windows 10, version 1607, MAX_PATH limitations have been removed from common Win32 file and directory functions.
Sie müssen sich jedoch anmelden und einen Registrierungsschlüssel festlegen, um ihn zu aktivieren.Die Lösung, die für mich funktioniert hat, bestand darin, den Registrierungsschlüssel zu bearbeiten, um das Verhalten bei langen Pfaden zu aktivieren, und den Wert auf 1 zu setzen. Dies ist eine neue Anmeldefunktion für Windows 10
HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
Ich habe diese Lösung aus einem benannten Abschnitt des Artikels erhalten, den @ james-hill gepostet hat.
https://docs.microsoft.com/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
quelle
<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings xmlns:ws2="https://schemas.microsoft.com/SMI/2016/WindowsSettings"> <ws2:longPathAware>true</ws2:longPathAware> </windowsSettings> </application>
Für mich in Visual Studio 2019 war diese zweite Anforderung nach dem Neustart von Visual Studio nicht erforderlich.Es gibt eine Bibliothek namens Zeta Long Paths , die eine .NET-API für die Arbeit mit langen Pfaden bereitstellt.
Hier ist ein guter Artikel, der dieses Problem sowohl für .NET als auch für PowerShell behandelt: " .NET, PowerShell-Pfad zu lange Ausnahme und ein .NET PowerShell-Robocopy-Klon "
quelle
Sie können einen symbolischen Link mit einem kürzeren Verzeichnis erstellen. Erste offene Befehlszeile beispielsweise durch
Shift + RightClick
in den gewünschten Ordner mit einem kürzeren Pfad (Sie es als Administrator ausgeführt werden kann).Geben Sie dann mit relativen oder absoluten Pfaden ein:
Starten Sie dann die Lösung auf dem kürzeren Weg. Der Vorteil hierbei ist: Sie müssen nichts bewegen.
quelle
Unter Windows 8.1 mit. NET 3.5 hatte ich ein ähnliches Problem.
Obwohl der Name meiner Datei nur 239 Zeichen lang war, als ich ein FileInfo-Objekt mit nur dem Dateinamen (ohne Pfad) instanziierte, trat eine Ausnahme vom Typ System auf. IO.PathTooLongException
Ich habe das Problem behoben, bei dem der Dateiname auf 204 Zeichen gekürzt wurde (Erweiterung enthalten).
quelle
Wenn Sie aufgrund eines langen Pfads ein Problem mit Ihren Bin- Dateien haben, können Sie in Visual Studio 2015 zur Eigenschaftenseite des betreffenden Projekts wechseln und das relative Ausgabeverzeichnis in ein kürzeres ändern .
Zum Beispiel ist \ debug \ wird C: \ _ bins \ MyProject \
quelle
Was für mich funktioniert hat, ist das Verschieben meines Projekts auf dem Desktop (C: \ Users \ lachezar.l \ Desktop \ MyFolder) nach (C: \ 0 \ MyFolder) Problem.
quelle
Aus meiner Erfahrung heraus wird meine unten stehende Antwort nicht für öffentlich zugängliche Webanwendungen empfohlen.
Wenn Sie es für Ihre internen Tools oder zum Testen benötigen, würde ich empfehlen, es auf Ihrem eigenen Computer freizugeben.
Dadurch wird ein freigegebenes Verzeichnis wie \\ {PCName} \ {YourSharedRootDirectory} erstellt. Dies könnte definitiv viel weniger sein als Ihr vollständiger Pfad. Ich hoffe, ich könnte von ungefähr 290 Zeichen auf 30 Zeichen reduzieren. :) :)
quelle
Bisher nicht erwähnt und ein Update, gibt es eine sehr gut etablierte Bibliothek für den Umgang mit zu langen Pfaden. AlphaFS ist eine .NET-Bibliothek, die der .NET-Plattform umfassendere Win32-Dateisystemfunktionen bietet als die Standard-System.IO-Klassen. Der auffälligste Mangel des standardmäßigen .NET System.IO ist die mangelnde Unterstützung erweiterter NTFS-Funktionen, insbesondere der Unterstützung von Pfaden mit erweiterter Länge (z. B. Datei- / Verzeichnispfade mit mehr als 260 Zeichen).
quelle
Die beste Antwort, die ich finden kann, ist in einem der Kommentare hier. Fügen Sie es der Antwort hinzu, damit jemand den Kommentar nicht verpasst und dies auf jeden Fall ausprobieren sollte. Es hat das Problem für mich behoben.
Wir müssen den Lösungsordner mit dem Befehl "subst" in der Eingabeaufforderung einem Laufwerk zuordnen, z. B. subst z:
Öffnen Sie dann die Lösung von diesem Laufwerk (in diesem Fall z). Dies würde den Pfad so weit wie möglich verkürzen und könnte das langwierige Problem mit dem Dateinamen lösen.
quelle
Dies kann auch möglicherweise eine Lösung sein. Manchmal tritt es auch auf, wenn Sie Ihr Entwicklungsprojekt zu tief halten. Dies bedeutet, dass das Projektverzeichnis möglicherweise zu viele Verzeichnisse enthält. Stellen Sie daher bitte nicht zu viele Verzeichnisse auf, um es in einem einfachen Ordner innerhalb des zu speichern fährt. Zum Beispiel: Ich habe diesen Fehler auch erhalten, als mein Projekt so beibehalten wurde.
D: \ Sharad \ LatestWorkings \ GenericSurveyApplication020120 \ GenericSurveyApplication \ GenericSurveyApplication
dann habe ich einfach mein projekt eingefügt
D: \ Sharad \ LatestWorkings \ GenericSurveyApplication
Und das Problem wurde gelöst.
quelle