Mengatasi batasan panjang jalur file maksimum di Windows

36

Salah satu pelanggan kami biasanya menggunakan nama jalur yang sangat panjang (beberapa folder bersarang, dengan nama panjang) dan kami secara rutin menjumpai "masalah pendidikan pengguna" untuk mempersingkat jalur menjadi kurang dari 260 karakter.

Apakah ada solusi teknis yang tersedia, dapatkah kita menjentikkan semacam saklar di Windows 7 dan Windows 2008 R2 untuk mengatakan "yeah abaikan saja masalah historis ini, dan buat nama jalur karakter +260 berfungsi".

PS Saya telah membaca dan sama sekali tidak diverifikasi oleh Penamaan File, Paths, dan Namespace

Christopher Edwards
sumber
3
Di sini kita berada di 2018 dan masalahnya masih ada di ROBOCOPY. Batas 255. Mereka yang melebihi itu hanya berbunyi bip tetapi jangan menyalin.
SDsolar
@SDsolar: apakah Anda menggunakan robocopy versi lama?
Naikrovek
Ya, akan mengatakan hal yang sama - seseorang harus menggunakan robocopy khusus karena dapat menangani jalan panjang ...
Rob Nicholson

Jawaban:

12

Metode ada di sana, tetapi sampai Microsoft kembali kode widget file-browser kami cukup banyak terjebak dengan masalah lama itu. Ini kurang optimal, tapi hanya cara kerjanya.

sysadmin1138
sumber
5
Bug dalam perangkat lunak MS yang tidak diperbaiki untuk beberapa rilis OS, itu yang baru ...
Hubert Kario
2
Windows 10 1607 akhirnya memperbaiki masalah browser-file dan memiliki beberapa sihir untuk mengelabui aplikasi Win32 untuk bekerja di dunia baru yang aneh dari jalur besar ini: howtogeek.com/266621/…
HackSlash
28

Hanya menyebutkan trik yang belum saya lihat disebutkan di sini.

Ambil file ini misalnya:

C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow\Still Going\I will run out of ideas soon\I have organizational problems\Obsessive compulsive subdirectory disorder\Here is a guid for no good reason\936DA01F-9ABD-4d9d-80C7-02AF85C822A8\Almost there\Tax Returns\2013\2013_tax_return.pdf

Jalur file lengkap ini sepanjang 290 karakter. Shell (Windows Explorer) dan sebagian besar utilitas baris perintah mungkin tidak akan membiarkan Anda menyentuhnya.

Gunakan substperintah seperti ini:

subst X: "C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow"

Sekarang Anda dapat mengakses (dan menghapus, memindahkan, dll.) File dengan demikian:

X:\Still Going\I will run out of ideas soon\I have organizational problems\Obsessive compulsive subdirectory disorder\Here is a guid for no good reason\936DA01F-9ABD-4d9d-80C7-02AF85C822A8\Almost there\Tax Returns\2013\2013_tax_return.pdf

Dan sekarang nama file itu hanya ~ 235 karakter atau lebih, jadi Anda tidak akan menemui masalah "Nama file terlalu panjang" lagi.

Di Windows API, ada konstanta terkenal yang dikenal sebagai MAX_PATH. MAX_PATH adalah 260 karakter. Sistem file NTFS sebenarnya mendukung jalur file hingga 32.767 karakter. Dan Anda masih dapat menggunakan 32.767 nama jalur panjang karakter dengan mengakses versi Unicode (atau "lebar") dari fungsi Windows API, dan juga dengan mengawali lintasan dengan \\?\.

MAX_PATHdidirikan di batu sangat lama di dunia Windows. Saya pikir itu ada hubungannya dengan standar ANSI pada saat itu ... tetapi itu adalah salah satu hal yang sangat sulit bagi Microsoft untuk berubah sekarang, karena sekarang kami memiliki ribuan program dan aplikasi, termasuk beberapa yang ditulis oleh Microsoft sendiri, yang menggunakan MAX_PATHdan akan gagal dengan cara baru yang aneh jika konstanta tiba-tiba berubah. (Buffer meluap, menumpuk korupsi, dll.)

Ryan Ries
sumber
9
Saya telah mengambil pendekatan yang mirip substdengan menggunakan persimpangan direktori, yang mungkin lebih nyaman untuk dibersihkan jika Anda hanya ingin membuat beberapa perubahan cepat. Saya menggunakan link Shell Extension , tapi Anda hanya dapat menggunakan mklinkperintah seperti: mklink /J C:\Wow "C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow".
Charles Grunwald
10

Anda dapat mengatasi batasan ini dengan menggunakan notasi \\? \ C: Itu jelek, tetapi mendukung panjang file hingga 2 ^ 15.

http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx#maxpath

Chris K
sumber
2
Ya saya baca itu, seperti yang saya katakan (lihat tautan saya). Tetapi bagaimana saya mendapat manfaat darinya? Bisakah saya memetakan drive ke \\? \ Sesuatu misalnya. Saya tidak mengerti. Artikel ini ditujukan untuk programmer yang menggunakan windows API. Sementara saya melakukan kode dalam. NET sesuai kebutuhan saya tidak menggunakan C ++ dll. Dan tidak dapat melihat bagaimana ini relevan untuk staf pelanggan saya yang menggunakan windows explorer dan dialog file umum dll.
Christopher Edwards
1
Pada akhirnya, tidak ada. : - / Sedihnya.
Chris K
@ChristopherEdwards Anda dapat membuat persimpangan ke titik yang lebih rendah dalam hierarki folder.
Hubert Kario
1
@ChristopherEdwards Anda dapat melakukan tautan c:\usr-datake `c: \ Users \ VeryLongUserName \ LongFolderName` dan katakan padanya untuk menggunakan yang pertama, tetapi jika ia secara teratur memberi nama folder dalam karakter 40-sesuatu maka ini tidak akan membantu ...
Hubert Kario
2
7-zip akan dengan senang hati menelusuri dan menyalin di \\? \ C: notasi, untuk apa nilainya.
Matt Lyons
9

Microsoft sekarang memiliki perbaikan yang tersedia untuk ini dimulai dengan Windows 10, yang dijelaskan dalam artikel Penamaan File, Paths, dan ruang nama MSDN.

darthcoder telah menjawab dengan rincian tentang \\?\C:notasi HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)yang dapat diselesaikan , tetapi sekarang ada kunci registri yang dapat digunakan untuk menghapus batasan MAX_PATH untuk satu sistem. Artikel tersebut juga menyebutkan dukungan untuk kontrol Kebijakan Grup di Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long pathsuntuk implementasi organisasi atau seluruh kelompok jika diperlukan.

JimNim
sumber
Saya belum punya waktu untuk pengujian menyeluruh, tetapi saya telah melihat hasil yang beragam dengan solusi ini sejauh ini, dan tidak dapat mengkonfirmasi bahwa ini memecahkan masalah untuk Windows [file] Explorer.
JimNim
2
Ini tidak berfungsi di File Explorer karena meskipun sistem dan NTFS dapat menangani lintasan yang panjang, Explorer tidak dapat sampai ia sendiri dikodekan ulang.
ingyhere
PS, Anda harus menggunakan salah satu dari program salinan di tautan SO ini di atas Explorer untuk benar-benar membuatnya bekerja.
ingyhere
1
Info bagus! Saya mungkin akan tetap berpegang pada Robocopy dalam kasus itu.
JimNim