Saya telah menghadapi masalah ini beberapa kali pada saat yang tidak tepat:
- Mencoba untuk bekerja pada proyek Java open source dengan jalur yang dalam
- Menyimpan pohon wiki Fitnesse yang dalam di kontrol sumber
- Galat mencoba menggunakan Bazaar untuk mengimpor pohon kendali sumber saya
Mengapa batas ini ada?
Mengapa belum dihapus?
Bagaimana Anda mengatasi batas jalur? Dan tidak, beralih ke Linux atau Mac OS X bukan jawaban yang valid untuk pertanyaan ini;)
Jawaban:
Mengutip artikel ini https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation
Sekarang kita melihat bahwa itu adalah 1 + 2 + 256 + 1 atau [drive] [: \] [path] [null] = 260. Orang dapat berasumsi bahwa 256 adalah panjang string tetap yang masuk akal dari hari-hari DOS. Dan kembali ke API DOS, kami menyadari bahwa sistem melacak jalur saat ini per drive, dan kami memiliki 26 (32 dengan simbol) drive maksimum (dan direktori saat ini).
INT 0x21 AH = 0x47 mengatakan "Fungsi ini mengembalikan deskripsi jalur tanpa huruf drive dan backslash awal." Jadi kita melihat bahwa sistem menyimpan CWD sebagai pasangan (drive, path) dan Anda meminta path dengan menentukan drive (1 = A, 2 = B, ...), jika Anda menentukan 0 maka ia mengasumsikan path untuk drive dikembalikan oleh INT 0x21 AH = 0x15 AL = 0x19. Jadi sekarang kita tahu mengapa itu 260 dan bukan 256, karena 4 byte itu tidak disimpan dalam string path.
Mengapa string jalur 256 byte, karena 640K cukup RAM.
sumber
Ini tidak sepenuhnya benar karena sistem file NTFS mendukung jalur hingga 32 ribu karakter. Anda dapat menggunakan api win32 dan "
\\?\
" awalan jalur untuk menggunakan lebih dari 260 karakter.Penjelasan terperinci tentang jalur panjang dari blog tim .Net BCL .
Kutipan kecil menyoroti masalah dengan jalur panjang
sumber
Pertanyaannya adalah mengapa batasan itu masih ada. Tentunya Windows modern dapat meningkatkan sisi
MAX_PATH
untuk memungkinkan jalur yang lebih panjang. Mengapa batasan belum dihapus?Melalui kontrak API, Windows telah menjamin semua aplikasi bahwa API file standar tidak akan pernah mengembalikan jalur yang lebih panjang daripada
260
karakter.Pertimbangkan kode yang benar berikut ini :
Windows menjamin program saya bahwa itu akan mengisi
WIN32_FIND_DATA
struktur saya :Aplikasi saya tidak menyatakan nilai konstanta
MAX_PATH
, API Windows melakukannya. Aplikasi saya menggunakan nilai yang ditentukan itu.Struktur saya didefinisikan dengan benar, dan hanya mengalokasikan
592
total byte. Itu berarti bahwa saya hanya dapat menerima nama file yang kurang dari260
karakter. Windows berjanji kepada saya bahwa jika saya menulis aplikasi saya dengan benar, aplikasi saya akan terus berfungsi di masa depan.Jika Windows mengizinkan nama file lebih panjang dari
260
karakter maka aplikasi saya yang ada (yang menggunakan API yang benar dengan benar) akan gagal.Bagi siapa pun yang meminta Microsoft untuk mengubah
MAX_PATH
konstanta, pertama-tama mereka perlu memastikan bahwa tidak ada aplikasi yang gagal. Misalnya, saya masih memiliki dan menggunakan aplikasi Windows yang ditulis untuk dijalankan pada Windows 3.11. Ini masih berjalan pada Windows 10. 64-bit. Itulah yang membuat kompatibilitas Anda mundur.Microsoft memang menciptakan cara untuk menggunakan nama path lengkap 32.768; tetapi mereka harus membuat kontrak API baru untuk melakukannya. Untuk satu, Anda harus menggunakan Shell API untuk menghitung file (karena tidak semua file ada di hard drive atau jaringan berbagi).
Tetapi mereka juga harus tidak merusak aplikasi pengguna yang ada. Sebagian besar aplikasi tidak menggunakan api shell untuk kerja file. Semua orang hanya menelepon
FindFirstFile
/FindNextFile
dan menyebutnya sehari.sumber
Dari Windows 10. Anda dapat menghapus batasan dengan memodifikasi kunci registri.
sumber
Anda dapat memasang folder sebagai drive. Dari baris perintah, jika Anda memiliki jalur,
C:\path\to\long\folder
Anda dapat memetakannya ke huruf driveX:
menggunakan:sumber
subst
adalah sesi / akun lokal - lihat superuser.com/questions/29072/… untuk cara menjadikannya 'sistem luas'Salah satu cara untuk mengatasi batas jalur adalah mempersingkat entri jalur dengan tautan simbolik.
Sebagai contoh:
C:\p
direktori untuk menyimpan tautan pendek ke jalur panjangmklink /J C:\p\foo C:\Some\Crazy\Long\Path\foo
C:\p\foo
ke jalur Anda alih-alih jalur panjangsumber
/j
pilihan menciptakan mountpoint persimpangan untuk perangkat volume yang lokal atau jalan pada volume lokal (seperti Unix bind mount). Itu tidak membuat tautan simbolis. Ini perbedaan penting karena titik mount persimpangan selalu dievaluasi pada server dan harus menargetkan perangkat lokal, sementara tautan simbolik dievaluasi pada klien dan dapat menargetkan jalur jarak jauh (jika diizinkan oleh kebijakan). Seperti drive subt.exe (yaituDefineDosDeviceW
), target persimpangan biasanya terbatas pada sekitar 4K karakter. Ini sebenarnya 8K karakter, terbagi rata antara jalur pengganti dan jalur tampilan.Anda dapat mengaktifkan nama jalur panjang menggunakan PowerShell:
Versi lain adalah dengan menggunakan Group Policy di
Computer Configuration
/Administrative Templates
/System
/Filesystem
:sumber
Seperti mengapa ini masih ada - MS tidak menganggapnya sebagai prioritas, dan nilai kompatibilitas mundur lebih dari memajukan OS mereka (setidaknya dalam contoh ini).
Solusi yang saya gunakan adalah menggunakan "nama pendek" untuk direktori di jalur, alih-alih versi standar mereka yang dapat dibaca oleh manusia. Jadi misalnya untuk
C:\Program Files\
saya akan menggunakanC:\PROGRA~1\
Anda dapat menemukan setara menggunakan nama pendekdir /x
.sumber
PATH
dan berikan kepadaSearchPathW
. Ini juga efisien, karena perpustakaan runtime membuat jalur perangkat "\\? \" Untuk NT. Mengenai sistem file yang lebih baru, kita mungkin tidak akan melihat perangkat lunak diinstal pada volume exFAT, selain aplikasi portabel, karena tidak memiliki keamanan, tapi saya tidak akan mengesampingkan ReFS. Pengguna memasang program di lokasi non-standar untuk alasan kenyamanan, ruang, atau kinerja.Mengenai cara mengatasi batasan ukuran lintasan pada Windows - menggunakan 7zip untuk mengemas (dan membuka paket) file sensitif lintasan Anda tampak seperti solusi yang layak. Saya telah menggunakannya untuk mengangkut beberapa instalasi IDE (jalur plugin Eclipse, ya!) Dan tumpukan dokumentasi yang di-autogenerasi dan sejauh ini tidak memiliki masalah.
Tidak begitu yakin bagaimana cara menghindari batas 260 char yang ditetapkan oleh Windows (dari PoV teknis), tapi hei, itu berhasil!
Lebih detail di halaman SourceForge mereka di sini :
dan lepaskan catatan :
CATATAN PENTING: Agar ini berfungsi dengan baik, Anda harus menentukan jalur tujuan dalam dialog "Ekstrak" 7zip secara langsung, daripada menyeret & menjatuhkan file ke folder yang dimaksud. Jika tidak, folder "Temp" akan digunakan sebagai cache sementara dan Anda akan terpental ke batasan karakter yang sama setelah Windows Explorer mulai memindahkan file ke "tempat peristirahatan terakhir" mereka. Lihat balasan untuk pertanyaan ini untuk informasi lebih lanjut.
sumber
Ya, dan ini adalah default untuk beberapa alasan, tetapi Anda dapat dengan mudah menimpanya dengan kunci registri ini:
Lihat: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
sumber
Cara lain untuk mengatasinya adalah dengan menggunakan Cygwin, tergantung pada apa yang ingin Anda lakukan dengan file (yaitu jika perintah Cygwin sesuai dengan kebutuhan Anda)
Misalnya memungkinkan untuk menyalin, memindahkan, atau mengganti nama file yang bahkan Windows Explorer tidak bisa. Atau tentu saja berurusan dengan kontennya seperti md5sum, grep, gzip, dll.
Juga untuk program yang Anda koding, Anda dapat menautkannya ke Cygwin DLL dan itu akan memungkinkan mereka untuk menggunakan jalur panjang (saya belum menguji ini)
sumber