Saya membuat sebuah aplikasi yang download semua dokumen perpustakaan di SP Situs , tapi pada satu titik itu memberi saya kesalahan ini (saya mencoba mencari di google tapi tidak;t menemukan apa-apa, sekarang jika ada yang tahu setiap trik untuk memecahkan masalah ini segera merespon jika tidak, terima kasih untuk melihatnya)
System.IO.PathTooLongException: jalan tertentu, nama file, atau keduanya terlalu lama. Fully qualified nama file harus kurang dari 260 karakter, dan nama direktori harus kurang dari 248 karakter. di Sistem.IO.Jalan.NormalizePathFast(String path, Boolean fullCheck) di Sistem.IO.Jalan.GetFullPathInternal(String path) di Sistem.IO.FileStream.Init(String path, FileMode mode, FileAccess akses, Int32 hak, Boolean useRights, FileShare berbagi, Int32 bufferSize, FileOptions pilihan, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) di Sistem.IO.FileStream..ctor(String path, FileMode mode, FileAccess akses, FileShare berbagi, Int32 bufferSize, FileOptions pilihan) di Sistem.IO.File.Membuat(String path)
mencapai batas untuk string, Kode yang 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
Sebagai penyebab dari kesalahan ini jelas, di sini's beberapa informasi yang akan membantu anda memecahkan masalah ini:
Melihat ini [MS artikel tentang Penamaan File, Jalan, dan ruang Nama][1]
Berikut ini's sebuah kutipan dari link:
Maksimum Panjang Jalan yang Terbatas Dalam Windows API (dengan beberapa pengecualian dibahas dalam paragraf berikut), panjang maksimum untuk jalan MAX_PATH, yang didefinisikan sebagai 260 karakter. Lokal jalan ini disusun dalam urutan sebagai berikut: huruf drive, usus besar, backslash, nama komponen yang dipisahkan oleh garis miring terbalik, dan mengakhiri karakter null. Misalnya, maksimum jalan di drive D adalah "D:\some 256-karakter jalan string<NUL>" tempat "<NUL>" mewakili terlihat mengakhiri karakter null untuk saat ini sistem codepage. (Yang karakter < > digunakan di sini untuk kejelasan visual dan tidak bisa menjadi bagian dari a valid path string.)
Dan beberapa workarounds (diambil dari komentar-komentar):
Ada cara untuk memecahkan berbagai masalah. Ide dasar dari solusi yang tercantum di bawah ini adalah selalu sama: Mengurangi jalan-panjang dalam rangka untuk memiliki jalan-suhu udara turun menjadi + nama panjang < MAX_PATH
. Anda dapat:
[1]: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs. 85).aspx
Ada's perpustakaan disebut Zeta Panjang Jalan yang menyediakan .NET API untuk bekerja dengan panjang jalan.
Berikut ini's artikel yang baik yang meliputi masalah ini untuk investasi .BERSIH dan PowerShell: ".NET, PowerShell Jalan terlalu Lama Pengecualian dan .NET PowerShell Robocopy Clone"
Solusi yang bekerja untuk saya adalah untuk mengedit registry key untuk mengaktifkan jalan panjang perilaku, menetapkan nilai ke 1. Ini adalah fitur opt-in untuk Windows 10
HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
Saya punya solusi ini dari seorang bernama bagian dari artikel yang @james-hill diposting.
https://docs.microsoft.com/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
Anda dapat membuat sebuah symbolic link dengan yang lebih pendek direktori. Pertama buka command line misalnya dengan `Shift + klik kanan di folder yang anda inginkan dengan jalan yang lebih pendek (anda mungkin harus menjalankan sebagai administrator).
Kemudian ketik dengan relatif atau absolute path:
mklink ShortPath\To\YourLinkedSolution C:\Path\To\Your\Solution /D
Dan kemudian memulai Solusi dari lintasan yang lebih pendek. Keuntungan di sini adalah: Anda don't harus bergerak apa-apa.
Pada Windows 8.1, menggunakan. NET 3.5, saya punya masalah yang sama.
Meskipun nama file saya hanya 239 karakter panjang ketika saya pergi untuk instantiate FileInfo objek hanya dengan nama file (tanpa jalan) terjadi pengecualian dari jenis Sistem. 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
Saya memutuskan masalah pemangkasan nama file untuk 204 karakter (termasuk ekstensi).
Dari pengalaman saya, tidak't merekomendasikan saya di bawah ini jawaban untuk umum setiap menghadapi aplikasi Web.
Jika anda membutuhkannya untuk anda inhouse alat atau untuk Pengujian, saya akan merekomendasikan untuk berbagi pada mesin anda sendiri.
-Right click on the root path you need to access
-Choose Properties
-Click on Share button and add your chosen users who can access it
Hal ini kemudian akan membuat direktori bersama seperti \\{PCName}\{YourSharedRootDirectory} Ini bisa menjadi pasti jauh kurang dari path lengkap saya berharap, bagi saya, saya bisa mengurangi 30 karakter dari sekitar 290 karakter. :)
Jika anda mengalami masalah dengan anda bin file karena jalan panjang, Di Visual Studio 2015 anda dapat pergi untuk menyinggung proyek's halaman properti dan perubahan relatif Direktori Output untuk yang lebih pendek.
E. g. bin\debug\ menjadi C:\_bins\MyProject\
Apa yang bekerja untuk saya bergerak saya proyek seperti itu pada desktop (C:\Users\lachezar.l\Desktop\MyFolder) ke (C:\0\MyFolder) yang seperti yang anda lihat menggunakan jalan yang lebih pendek dan mengurangi memecahkan masalah.
Tidak menyebutkan sejauh ini dan update, ada yang sangat baik membangun perpustakaan untuk penanganan jalan yang terlalu panjang. AlphaFS adalah .NET perpustakaan yang menyediakan lebih lengkap Win32 file sistem fungsi untuk .NET platform dari Sistem standar.IO kelas. Yang paling menonjol kekurangan dari standar .NET Sistem.IO adalah kurangnya dukungan dari fitur NTFS lanjutan, terutama diperpanjang panjang jalan yang mendukung (misalnya. file/direktori jalur lebih dari 260 karakter).
Jawaban terbaik yang bisa saya temukan di salah satu komentar di sini. Menambahkan hal itu untuk menjawab, sehingga seseorang tidak't lewatkan komentar dan pasti harus mencoba ini. Tetap masalah untuk saya.
Kita perlu memetakan solusi folder ke drive menggunakan "subst" perintah di command prompt- misalnya, subst z: <jalan anda - seperti d:/abc/def>
Dan kemudian membuka solusi dari drive ini (z dalam kasus ini). Ini akan mempersingkat jalan sebanyak mungkin dan bisa memecahkan panjang filename masalah.