Saya membuat aplikasi yang mengunduh semua pustaka dokumen di Situs SP, tetapi pada satu titik itu memberi saya kesalahan ini (saya mencoba melihat google tetapi tidak dapat menemukan apa pun, sekarang jika ada yang tahu trik untuk menyelesaikan masalah ini, silakan tanggapi jika tidak terima kasih untuk melihatnya)
System.IO.PathTooLongException: Path yang ditentukan, nama file, atau keduanya terlalu panjang. Nama file yang memenuhi syarat harus kurang dari 260 karakter, dan nama direktori harus kurang dari 248 karakter. di System.IO.Path.NormalizePathFast (Jalur string, Boolean fullCheck) di System.IO.Path.GetFullPathInternal (jalur string) di System.IO.FileStream.Init (Jalur string, mode FileMode, akses FileAccess, hak Int32, Boolean useRights , Berbagi FileShare, Int32 bufferSize, opsi FileOptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) di System.IO.FileStream..ctor (jalur String, mode FileMode, akses FileAccess, berbagi FileShare, Int32 bufferSize, opsi FileOptions) di Sistem. IO.File.Create (Jalur string)
itu mencapai batas untuk string, Kode diberikan di bawah ini,
#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
Jawaban:
Karena penyebab kesalahan sudah jelas, berikut beberapa informasi yang akan membantu Anda menyelesaikan masalah:
Lihat artikel MS ini tentang Penamaan File, Paths, dan Namespaces
Berikut kutipan dari tautan:
Dan beberapa solusi (diambil dari komentar):
Ada cara untuk mengatasi berbagai masalah tersebut. Ide dasar dari solusi yang tercantum di bawah ini selalu sama: Kurangi panjang jalur agar memiliki
path-length + name-length < MAX_PATH
. Kamu boleh:sumber
Starting in Windows 10, version 1607, MAX_PATH limitations have been removed from common Win32 file and directory functions.
Namun Anda harus ikut serta, dan menyetel kunci registri untuk mengaktifkannya.Solusi yang berhasil bagi saya adalah mengedit kunci registri untuk mengaktifkan perilaku jalur panjang, menyetel nilainya ke 1. Ini adalah fitur keikutsertaan baru untuk Windows 10
HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
Saya mendapat solusi ini dari bagian bernama artikel yang diposting @ james-hill.
https://docs.microsoft.com/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
sumber
<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>
Bagi saya di Visual Studio 2019, persyaratan kedua ini tidak diperlukan setelah memulai ulang Visual Studio.Ada pustaka bernama Zeta Long Paths yang menyediakan API .NET untuk bekerja dengan jalur panjang.
Berikut adalah artikel bagus yang membahas masalah ini untuk .NET dan PowerShell: " .NET, Pengecualian Jalur PowerShell terlalu Panjang dan Klon Robocopy .NET PowerShell "
sumber
Anda dapat membuat tautan simbolis dengan direktori yang lebih pendek. Pertama buka baris perintah misalnya dengan
Shift + RightClick
di folder yang Anda inginkan dengan jalur yang lebih pendek (Anda mungkin harus menjalankannya sebagai administrator).Kemudian ketik dengan jalur relatif atau absolut:
Dan kemudian mulai Solusi dari jalur yang lebih pendek. Keuntungannya di sini adalah: Anda tidak perlu memindahkan apapun.
sumber
Di Windows 8.1, menggunakan. NET 3.5, saya mengalami masalah serupa.
Meskipun nama file saya hanya 239 karakter ketika saya pergi untuk membuat instance objek FileInfo hanya dengan nama file (tanpa path) terjadi pengecualian tipe System. IO.PathTooLongException
Saya menyelesaikan masalah pemangkasan nama file menjadi 204 karakter (termasuk ekstensi).
sumber
Jika Anda mengalami masalah dengan file bin Anda karena jalur yang panjang, Dalam Visual Studio 2015 Anda dapat pergi ke halaman properti proyek yang melanggar dan mengubah Direktori Output relatif ke yang lebih pendek.
Misalnya bin \ debug \ menjadi C: \ _ bins \ MyProject \
sumber
Apa yang berhasil untuk saya adalah memindahkan proyek saya seperti yang ada di desktop (C: \ Users \ lachezar.l \ Desktop \ MyFolder) ke (C: \ 0 \ MyFolder) yang seperti yang Anda lihat menggunakan jalur yang lebih pendek dan menguranginya menyelesaikan masalah.
sumber
Dari pengalaman saya, tidak akan merekomendasikan jawaban saya di bawah ini untuk aplikasi Web yang dihadapi publik.
Jika Anda membutuhkannya untuk alat inhouse Anda atau untuk Pengujian, saya akan merekomendasikan untuk membagikannya di mesin Anda sendiri.
Ini kemudian akan membuat direktori bersama seperti \\ {PCName} \ {YourSharedRootDirectory} Ini pasti jauh lebih sedikit dari jalur lengkap Anda. Saya harap, bagi saya, saya dapat mengurangi menjadi 30 karakter dari sekitar 290 karakter. :)
sumber
Belum lagi sejauh ini dan pembaruan, ada perpustakaan yang didirikan dengan sangat baik untuk menangani jalur yang terlalu panjang. AlphaFS adalah pustaka .NET yang menyediakan fungsionalitas sistem file Win32 yang lebih lengkap ke platform .NET daripada kelas System.IO standar. Kekurangan yang paling menonjol dari .NET System.IO standar adalah kurangnya dukungan fitur NTFS tingkat lanjut, terutama dukungan jalur panjang yang diperpanjang (misalnya jalur file / direktori yang lebih panjang dari 260 karakter).
sumber
Jawaban terbaik yang bisa saya temukan, ada di salah satu komentar di sini. Menambahkannya ke jawaban sehingga seseorang tidak akan melewatkan komentar dan harus mencobanya. Ini memperbaiki masalah saya.
Kita perlu memetakan folder solusi ke drive menggunakan perintah "subst" di command prompt- misalnya, subst z:
Dan kemudian buka solusi dari drive ini (z dalam kasus ini). Ini akan mempersingkat jalur sebanyak mungkin dan dapat menyelesaikan masalah nama file yang panjang.
sumber
ini mungkin juga solusi. Terkadang juga terjadi ketika Anda menyimpan proyek Pengembangan Anda terlalu dalam, berarti mungkin direktori proyek mungkin memiliki terlalu banyak direktori jadi tolong jangan membuat terlalu banyak direktori, simpan dalam folder sederhana di dalam drive. Sebagai Contoh- Saya juga mendapatkan kesalahan ini ketika proyek saya disimpan seperti ini-
D: \ Sharad \ LatestWorkings \ GenericSurveyApplication020120 \ GenericSurveyApplication \ GenericSurveyApplication
lalu saya cukup Menempelkan proyek saya di dalam
D: \ Sharad \ LatestWorkings \ GenericSurveyApplication
Dan Masalah terpecahkan.
sumber