En Fazla Yol Uzunluğu Sınırlaması
Windows API'sinde (aşağıdaki paragraflarda açıklanan bazı özel durumlar dışında), bir yol için en fazla uzunluk 260 karakter olarak tanımlanan MAX_PATHolur. Yerel yol şu sırada yapılandırılmıştır: sürücü harfi, iki nokta üst üste, ters eğik çizgi, ters eğik çizgilerle ayrılmış ad bileşenleri ve sonlandırıcı null karakter. Örneğin, D sürücüsündeki en büyük yol "D:\NUL>"<256 karakterlik yol dizesidir; burada "<NUL>", geçerli sistem kod sayfası için görünmez sonlandırıcı null karakteri temsil eder. (<> karakterler burada görsel netlik için kullanılır ve geçerli bir yol dizesinin parçası olamaz.)
Örneğin, uzun dosya adları olan bir git deposunu uzun adı olan bir klasöre kopyaladığınızda bu sınırlamaya karşılaşabilirsiniz.
Not
Windows API'sindeki Dosya G/Ç işlevleri, aşağıdaki bölümlerde ayrıntılı olarak açıklandığı gibi "\\?\" ön ekini kullanma dışında, adı NT stili bir ada dönüştürmenin bir parçası olarak "/" öğesini "\" olarak dönüştürür.
Windows API'sinde 32.767 karakterlik maksimum toplam yol uzunluğu için genişletilmiş uzunluklu bir yola izin veren Unicode sürümleri de olan birçok işlev vardır. Bu yol türü, her biri GetVolumeInformation işlevinin lpMaximumComponentLength parametresinde döndürülen değere kadar ters eğik çizgilerle ayrılmış bileşenlerden oluşur (bu değer genellikle 255 karakterdir). Genişletilmiş uzunluklu bir yol belirtmek için "\\?\" ön ekini kullanın. Örneğin, "\\?\D:\ "çok uzun bir yol.
Not
En fazla 32.767 karakterlik yol yaklaşıktır, çünkü "\\?\" ön eki çalışma zamanında sistem tarafından daha uzun bir dizeye genişletilebilir ve bu genişletme toplam uzunluk için geçerlidir.
"\\?\" ön eki, evrensel adlandırma kuralına (UNC) göre derlenen yollarla da kullanılabilir. UNC kullanarak böyle bir yol belirtmek için "\\?\UNC\" ön ekini kullanın. Örneğin, "\\?\UNC\server\share", burada "sunucu" bilgisayarın adı ve "paylaşım" paylaşılan klasörün adıdır. Bu önekler yolun bir parçası olarak kullanılmaz. Yolun sisteme en az değişiklikle geçirilmesi gerektiğini belirtir; bu da yol ayırıcılarını temsil etmek için eğik çizgi veya geçerli dizini temsil eden bir nokta ya da üst dizini temsil etmek için çift nokta kullanamazsınız. Göreli yol ile "\\?\" ön ekini kullanamayacağınız için göreli yollar her zaman toplam MAX_PATH karakterle sınırlıdır.
Dosya sistemi yol ve dosya adlarını WCHAR opak bir dizi olarak ele aldığı için, Windows dosya G/Ç API işlevleri tarafından kullanılmak üzere yol ve dosya adı dizelerinde unicode normalleştirme gerçekleştirmeye gerek yoktur. Uygulamanızın gerektirdiği herhangi bir normalleştirme, ilgili Windows dosya G/Ç API işlevlerine yapılan çağrıların dışında, bu göz önünde bulundurularak gerçekleştirilmelidir.
Dizin oluşturmak için API kullanırken, belirtilen yol 8,3 dosya adını ekleyemezsiniz (yani dizin adı MAX_PATH eksi 12'yi aşamaz).
Kabuk ve dosya sistemi farklı gereksinimlere sahiptir. Windows API'siyle kabuk kullanıcı arabiriminin düzgün yorumlayamadığı bir yol oluşturmak mümkündür.
Windows 10, sürüm 1607 ve sonraki sürümlerde uzun yolları etkinleştirme
Windows 10, sürüm 1607'den itibaren MAX_PATH sınırlamaları birçok yaygın Win32 dosya ve dizin işlevinden kaldırılmıştır. Ancak uygulamanızın yeni davranışı kabul etmesi gerekir.
Uygulama başına yeni uzun yol davranışını etkinleştirmek için iki koşul karşılanmalıdır. Bir kayıt defteri değeri ayarlanmalıdır ve uygulama bildirimi longPathAware
öğesini içermelidir.
Uzun yolları etkinleştirmek için kayıt defteri ayarı
Önemli
Bu kayıt defteri ayarının etkinleştirilmesinin yalnızca yeni özelliklerden yararlanacak şekilde değiştirilmiş uygulamaları etkileyeceğini anlayın. Geliştiricilerin, uygulama bildirimi ayarlarında altındabelirtildiği gibi, uygulamalarının uzun yol algılamalı olduğunu bildirmeleri gerekir. Bu, tüm uygulamaları etkileyecek bir değişiklik değildir.
kayıt defteri değeri HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)
var olmalı ve 1
olarak ayarlanmalıdır. Kayıt defteri değeri, etkilenen bir Win32 dosyasına veya dizin işlevine yapılan ilk çağrıdan sonra sistem (işlem başına) tarafından önbelleğe alınır (işlevlerin listesi için aşağıya bakın). Kayıt defteri değeri, işlemin ömrü boyunca yeniden yüklenmez. Sistemdeki tüm uygulamaların değeri tanıması için, anahtar ayarlanmadan önce bazı işlemler başlamış olabileceğinden yeniden başlatma gerekebilir.
Ayrıca bu kodu sizin için ayarlayabileceğiniz bir .reg
dosyasına kopyalayabilir veya yükseltilmiş ayrıcalıklara sahip bir terminal penceresinden PowerShell komutunu kullanabilirsiniz:
- Kayıt Defteri (.reg) dosyası
- PowerShell
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
Not
Bu kayıt defteri ayarı, Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths
'daki Grup İlkesi aracılığıyla da denetlenebilir. İlke, İlke Yapılandırma Hizmeti Sağlayıcısı (CSP)kullanılarak Microsoft Intune ile de uygulanabilir.
Uzun yol özelliğini bildirmek için uygulama bildirimi güncelleştirmeleri
uygulama bildirimilongPathAware
öğesini de içermelidir.
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
<ws2:longPathAware>true</ws2:longPathAware>
</windowsSettings>
</application>
MAX_PATH kısıtlaması olmayan işlevler
Uzun yol davranışını kabul ederseniz artık MAX_PATH kısıtlamaları olmayan dizin yönetimi işlevleri şunlardır: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.
Uzun yol davranışını kabul ederseniz artık MAX_PATH kısıtlamaları olmayan dosya yönetimi işlevleri şunlardır: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.