Aracılığıyla paylaş


Azure NetApp Files'da yol uzunluklarını anlama

Dosya ve yol uzunluğu, dizinler de dahil olmak üzere bir dosya yolundaki Unicode karakter sayısını ifade eder. Bu sınır, karakterin bayt cinsinden boyutuna göre belirlenen tek tek karakter uzunluklarındaki bir faktördür. Örneğin, NFS ve SMB 255 baytlık yol bileşenlerine izin verir. ASCII'nin dosya kodlama biçimi 8 bit kodlama kullanır; yani ASCII'deki dosya yolu bileşenleri (dosya veya klasör adı gibi), ASCII karakterleri 1 bayt boyutunda olduğundan en fazla 255 karakter olabilir.

Aşağıdaki tabloda Azure NetApp Files birimlerinde desteklenen bileşen ve yol uzunlukları gösterilmektedir:

Bileşen NFS SMB
Yol bileşeni boyutu 255 bayt 255 bayt
Yol uzunluğu boyutu Sınırsız Varsayılan: 255 bayt
Sonraki Windows sürümlerinde en fazla: 32.767 bayt
Aktarım için en büyük yol boyutu 4.096 bayt 255 bayt

Not

Çift protokollü birimler en düşük maksimum değeri kullanır.

SMB paylaşım adı ise \\SMB-SHARE, her karakter 1 bayt olduğundan, paylaşım adı yol uzunluğuna 11 Unicode karakter ekler. Belirli bir dosyanın yolu ise 29 Unicode karakterdir \\SMB-SHARE\apps\archive\file; eğik çizgi de dahil olmak üzere her karakter 1 bayttır. NFS bağlamaları için aynı kavramlar geçerlidir. Bağlama yolu /AzureNetAppFiles , her biri 1 baytlık 17 Unicode karakterdir.

Azure NetApp Files, modern Windows sunucularının desteklediği SMB paylaşımları için aynı yol uzunluğunu destekler: en fazla 32.767 bayt. Ancak, Windows istemcisinin sürümüne bağlı olarak, bazı uygulamalar 260 bayttan uzun yolları destekleyemez. Tek tek yol bileşenleri (dosya veya klasör adları gibi eğik çizgiler arasındaki değerler) en fazla 255 baytı destekler. Örneğin, Azure NetApp Files'daki bir dosya yolunda Latin büyük "A" (karakter başına 1 bayt alır) kullanan bir dosya adı 255 karakteri aşamaz.

# mkdir 256charsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

mkdir: cannot create directory ‘256charsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa’: File name too long 

# mkdir 255charsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

# ls | grep 255 
255charsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

Ayırt edici karakter boyutları

Linux yardımcı programıuniutils, karakter örneğinin birden çok örneğini yazarak ve bayt alanını görüntüleyerek Unicode karakterlerin bayt boyutunu bulmak için kullanılabilir.

Örnek 1: Latin büyük A, her kullanıldığında 1 bayt artırır (0-255 ASCII karakter aralığındaki tek onaltılık değer kullanılarak).

# printf %b 'AAA' | uniname
character  byte  UTF-32   encoded as glyph      name
        0     0  000041   41             A      LATIN CAPITAL LETTER A
        1     1  000041   41             A      LATIN CAPITAL LETTER A
        2     2  000041   41             A      LATIN CAPITAL LETTER A

Sonuç 1: AAA adı 255'in 3 baytını kullanır.

Örnek 2: Japonca karakter 字 her örneği 3 bayt artırır. Bu, kodlanmış alanının altındaki 3 ayrı onaltılık kod değeri (E5, AD, 97) ile de hesaplanabilir. Her onaltılık değer 1 bayt'ı temsil eder:

# printf %b '字字字' | uniname
character  byte  UTF-32   encoded as  glyph     name
        0     0  005B57   E5 AD 97       字      CJK character Nelson 1281
        1     3  005B57   E5 AD 97       字      CJK character Nelson 1281
        2     6  005B57   E5 AD 97       字      CJK character Nelson 1281

Sonuç 2: 字字字 adlı dosya 255'te 9 bayt kullanır.

Örnek 3: İki noktalı ğharfi örnek başına 2 bayt kullanır (C3 + 84).

# printf %b 'ÄÄÄ' | uniname
character  byte  UTF-32   encoded as     glyph  name
        0     0  0000C4   C3 84          Ä      LATIN CAPITAL LETTER A WITH DIAERESIS
        1     2  0000C4   C3 84          Ä      LATIN CAPITAL LETTER A WITH DIAERESIS
        2     4  0000C4   C3 84          Ä      LATIN CAPITAL LETTER A WITH DIAERESIS

Sonuç 3: ÄÄğadlı bir dosya 255'in 6 baytını kullanır.

Örnek 4: Emoji gibi 😃 özel bir karakter, Unicode karakterleri için kullanılan 0-3 baytı aşan tanımsız bir aralığa düşer. Sonuç olarak, karakter kodlaması için bir vekil çift kullanır. Bu durumda, karakterin her örneği 4 bayt kullanır.

# printf %b '😃😃😃' | uniname
character  byte       UTF-32 encoded as  glyph   name
        0     0  01F603   F0 9F 98 83    😃      Character in undefined range
        1     4  01F603   F0 9F 98 83    😃      Character in undefined range
        2     8  01F603   F0 9F 98 83    😃      Character in undefined range 

Sonuç 4: Adlı 😃😃😃 dosya 255'in 12 baytını kullanır.

Emojilerin çoğu 4 bayt aralığına girer ancak 7 bayta kadar çıkabiliyor. Binden fazla standart emojinin yaklaşık 180'i Temel Çok Dilli Düzlemde (BMP) bulunur ve bu da istemcinin dil türü desteğine bağlı olarak Azure NetApp Files'da metin veya emoji olarak görüntülenebileceği anlamına gelir.

BMP ve diğer Unicode düzlemleri hakkında daha ayrıntılı bilgi için bkz . Azure NetApp Files'da birim dillerini anlama.

Yol uzunluklarında karakter bayt etkisi

Yol uzunluğunun bir dosya veya klasör adındaki karakter sayısı olduğu düşünülse de, aslında yoldaki desteklenen baytların boyutudur . Her karakter bir ada bayt boyutu eklediğinden, farklı dillerdeki farklı karakter kümeleri farklı dosya adı uzunluklarını destekler.

Aşağıdaki senaryoları göz önünde bulundurun:

  • Bir dosya veya klasör, dosya adı olarak Latin alfabesi karakterini "A" olarak yineler. (örneğin, AAAAAAAA)

    "A" 1 bayt kullandığından ve yol bileşeni boyutu sınırı 255 bayt olduğundan, dosya adında 255 "A" örneğine izin verilir.

  • Dosya veya klasör adında Japonca 字 karakterini yineler.

    "字" 3 bayt boyutunda olduğundan, dosya adı uzunluğu sınırı 85 字 örneği (3 bayt * 85 = 255 bayt) veya toplam 85 karakter olabilir.

  • Bir dosya veya klasör, adında sırıtma yüzü emojisini (😃) yineler.

Sırıtan yüz emojisi (😃) 4 bayt kullanır; yani yalnızca emoji içeren bir dosya adı toplam 64 karaktere (255 bayt/4 bayt) izin verir.

  • Dosya veya klasör, farklı karakterlerin (ad字😃) birleşimini kullanır.

Dosya veya klasör adında farklı bayt boyutlarına sahip farklı karakterler kullanıldığında, her karakterin bayt boyutu dosya veya klasör uzunluğuna bağlıdır. Ad字😃 dosya veya klasör adı, toplam 255 bayt uzunluğun 1+1+1+1+3+4 baytını (11 bayt) kullanır.

Özel emoji kavramları

BMP sınıflandırması altında bayrak emojisi gibi özel emojiler vardır: emoji, istemci desteğine bağlı olarak metin veya görüntü olarak işlenir. İstemci görüntü gösterimini desteklemediğinde, bunun yerine bölgesel metin tabanlı ifadeler kullanır.

Örneğin, Birleşik Devletler bayrağı "us" karakterlerini kullanır (Latin karakterleri U+S'ye benzer, ancak aslında farklı kodlamalar kullanan özel karakterlerdir). Tek ad, karakterler arasındaki farkları gösterir.

# printf %b 'US' | uniname
character  byte  UTF-32   encoded as     glyph  name
        0     0  000055   55             U      LATIN CAPITAL LETTER U
        1     1  000053   53             S      LATIN CAPITAL LETTER S


# printf %b '🇺🇸' | uniname
character  byte  UTF-32   encoded as     glyph  name
        0     0  01F1FA   F0 9F 87 BA    🇺      Character in undefined range
        1     4  01F1F8   F0 9F 87 B8    🇸      Character in undefined range

Bayrak emojileri için belirlenen karakterler desteklenen sistemlerdeki görüntüleri bayrakla işaretlemek için çevrilir, ancak desteklenmeyen sistemlerde metin değerleri olarak kalır. Bu karakterler, bayrak emojisi kullanıldığında toplam 8 bayt için karakter başına 4 bayt kullanır. Bu nedenle, bir dosya adında (255 bayt/8 bayt) toplam 31 bayrak emojisine izin verilir.

SMB yol sınırları

Varsayılan olarak, Windows sunucuları ve istemcileri 260 bayt'a kadar yol uzunluklarını destekler, ancak değer ve etki alanı bilgileri gibi <NUL> Windows yollarına eklenen meta veriler nedeniyle gerçek dosya yolu uzunlukları daha kısadır.

Windows'ta yol sınırı aşıldığında bir iletişim kutusu görüntülenir:

Screenshot of path length dialog warning.

SMB yol uzunlukları, Windows 10/Windows Server 2016 sürüm 1607 veya üzeri kullanılırken, En Fazla Yol Uzunluğu Sınırlaması kapsamındaki bir kayıt defteri değeri değiştirilerek uzatılabilir. Bu değer değiştirildiğinde, yol uzunlukları 32.767 bayta (eksi meta veri değerleri) kadar uzatılabilir.

Screenshot of Group Policy Management window.

Screenshot of window to enable long file paths.

Bu özellik etkinleştirildikten sonra, daha uzun yol uzunluklarına izin vermek için yolu kullanarak \\?\ SMB paylaşımı gereksinimlerine erişmeniz gerekir. Bu yöntem UNC yollarını desteklemediğinden SMB paylaşımının bir sürücü harfine eşlenmesi gerekir.

Screenshot of dialog window with undiscoverable path.

Bunun yerine kullanmak \\?\Z: erişime izin verir ve daha uzun dosya yollarını destekler.

Screenshot of a directory with a long name.

Not

Windows CMD şu anda kullanımını \\?\desteklemez.

Maksimum yol uzunluğu artırılamıyorsa geçici çözüm

Windows ortamında maksimum yol uzunluğu etkinleştirilemiyorsa veya Windows istemci sürümleri çok düşükse, geçici bir çözüm vardır. SMB paylaşımını dizin yapısına daha derin bağlayabilir ve sorgulanan yol uzunluğunu azaltabilirsiniz.

Örneğin, ile eşlemek \\NAS-SHARE\AzureNetAppFilesZ:yerine ile eşleyin \\NAS-SHARE\AzureNetAppFiles\folder1\folder2\folder3\folder4Z:.

NFS yol sınırları

Azure NetApp Files birimleriyle NFS yol sınırları, tek tek yol bileşenleri için aynı 255 bayt sınırına sahiptir. Ancak her bileşen tek tek değerlendirilir ve neredeyse sınırsız toplam yol uzunluğuyla istek başına en fazla 4.096 bayt işleyebilir. Örneğin, her yol bileşeni 255 bayt ise, bir NFS istemcisi istek başına en fazla 15 bileşeni (karakterler dahil) / değerlendirebilir. Bu nedenle, 4.096 bayt sınırını aşan bir yola yönelik istek cd "Dosya adı çok uzun" hata iletisi verir.

Çoğu durumda Unicode karakterleri 1 bayt veya daha azdır, bu nedenle 4.096 bayt sınırı 4.096 karaktere karşılık gelir. Karakter boyutu 1 bayttan büyükse, yol uzunluğu 4.096 karakterden azdır. Boyutu 1 bayttan büyük olan karakterler, toplam karakter sayısına göre 1 bayt karakterden daha fazla sayar.

En fazla yol uzunluğu komutu kullanılarak getconf PATH_MAX /NFSmountpoint sorgulanabilir.

Not

Sınır, NFS istemcisindeki limits.h dosyada tanımlanır. Bu sınırları ayarlamamalısınız.

İkili protokol birimiyle ilgili dikkat edilmesi gerekenler

Çift protokollü erişim için Azure NetApp Files kullanılırken, yol uzunluklarının NFS ve SMB protokollerinde nasıl işleneceğinin farkı, dosya ve klasörler arasında uyumsuzluklar oluşturabilir. Örneğin, Windows SMB bir yolda en fazla 32.767 karakteri destekler (SMB istemcisinde uzun yol özelliği etkinleştirildiğinde), ancak NFS desteği bu miktarı aşabilir. Bu nedenle, NFS'de SMB desteğini aşan bir yol uzunluğu oluşturulursa, yol uzunluğu üst sınırına ulaşıldığında istemciler verilere erişemez. Bu gibi durumlarda, dosya ve klasör adları (ve klasör yolu derinliği) oluştururken protokoller arasında dosya yolu uzunluklarının alt uç sınırlarını göz önünde bulundurmaya dikkat edin veya yol uzunluğunu azaltmak için SMB paylaşımlarını istenen klasör yoluna yakın bir şekilde eşleyin.

bir yoluna \\share\folder1\folder2\folder3\folder4gitmek için SMB paylaşımını birimin en üst düzeyine eşlemek yerine, SMB paylaşımını yolunun \\share\folder1\folder2\folder3\folder4tamamına eşlemeyi göz önünde bulundurun. Sonuç olarak, istenen klasöre Z: bir sürücü harfi eşlemesi yapılır ve yol uzunluğu olarak Z:\folder1\folder2\folder3\folder4\fileZ:\fileazaltılır.

Özel karakter konuları

Azure NetApp Files birimleri Almanca, Kiril, İbranice ve çoğu Çince/Japonca/Korece (CJK) dahil olmak üzere birçok ülkeyi ve dili kapsayan C.UTF-8 dil türünü kullanır. Unicode'daki en yaygın metin karakterleri 3 bayt veya daha azdır. Emojiler, müzik simgeleri ve matematiksel simgeler gibi özel karakterler genellikle 3 bayttan büyüktür. Bazıları UTF-16 vekil çifti mantığını kullanır.

Azure NetApp Files'ın desteklemediği bir karakter kullanıyorsanız farklı bir dosya adı isteyen bir uyarı görebilirsiniz.

Screenshot of an invalid file name warning.

Hata, adın çok uzun olması yerine karakter bayt boyutunun Azure NetApp Files biriminin SMB üzerinden kullanamayacak kadar büyük olmasından kaynaklanır. Bu sınırlama için Azure NetApp Files'da geçici bir çözüm yoktur. Azure NetApp Files'da özel karakter işleme hakkında daha fazla bilgi için bkz . Özel karakter kümeleri ile protokol davranışı.

Sonraki adımlar