Kullanıcıların dosyalarına neden uzun uzun isimler vermeyi tercih etmeleri üzerine yazılan tezleri araştırmadan önce böyle bir yol izlemiş kişilerin dosyalarını kopyalarken karşılaşılan hataların çözümüne kafa yordum. Microsoft'un niye böyle bir kısıtlamaya ihtiyacı var diye düşündüm. Sonra öğrendim ki Windows 10 1607 sürüm ve üstünde bu kısıtlamayı kaldırmayı seçebiliyormuşuz [1]. Bilmeden bu kısıtlamaya takıldığım için üzüldüm.
İkinin sekizinci kuvveti olması sebebiyle 256 olarak hafızalarda yer etmesine rağmen aslında 260 karakterlik bir sınır söz konusu. Çünkü sürücü adı, iki nokta üst üste, bir ters bölü ve en sondaki NUL karakterini de sayarsak aslında 256 karakterlik klasör ve dosya isimlerinin toplamına 4 daha ilave ederek 260'a ulaşıyoruz.
Yerel bilgisayarda çalışırken mutlu mesut +260 karakterlik isimler ile klasör oluşturup dosya kaydedebilen, bunları tekrar açabilen kullanıcı, aslında bu dosyaları kopyalayamıyor, yeniden adlandıramıyor hatta silemiyor (ortalama bir kullanıcının robocopy kullanmadığını varsayarak [3]). Ta ki bir gün bu verilerin başka bir diske veya başka bir bilgisayara kopyalanması gerekene kadar. Bunu da yaparken ya eksik kopyalanıyor, ya da bir bilenden yardım isteniyor. Kopyalama sırasında Windows kullanıcıya çok yardımcı olmadığı için o anda ekranda görüntülenen mesajda tam olarak hangi dosya veya klasörün 260 sınırından daha fazla isme sahip olduğunu göremiyor. Bu durumda görüntülenen hata mesajında "Atla" tuşuna basıp işlem bittikten sonra aslında işlemin bitmediğini, eksik kalan dosyaları aramak zorunda olduğumuz ikinci aşamaya geçtiğimizi farkediyoruz. Böyle bir durumda hangi dosyaların kopyalanmadığını bulabilmek için Powershell ile aşağıdaki gibi bir komut ile dosyalar tespit edilerek bir dosyaya yazılabilir [2].
dir -recurse | where {$_.Fullname.Length -gt 260} | select FullName | out-file uzun-dosya-isimleri.txt
Ya da doğrudan cmd.exe ile
dir /s /b | sort /r /+261 /o longpaths.txt
Öngörülü insanların kullanacağı yöntem ise [1]'de belirtildiği gibi:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
Bu ayarı tek bir makinede Powershell ile yapmak için
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem"
-Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
Bir Active Directory ortamında etki alanına üye bilgisayarların tümünde grup ilkesi ile bunu yapmak istersek yapılacak olan da
Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths
ile Enable Win32 Long paths'i etkinleştirmek. Bunun öncesinde veya sonrasında LongPathsEnabled değerini kontrol etmek için
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem"
-Name "LongPathsEnabled"
Etki alanındaki bütün bilgisayarlarda grup ilkesi ile uzun dosya isimleri desteğini etkinleştirdim, ama etki alanı üyesi dosya sunucularından biri maalesef 1607 sürümden eski. Bu sunucu üzerinde uzun isme sahip dosyalarla yine de işlem yapılmıyor maalesef.
---
[1] https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry
[2] https://www.mindgems.com/article/find-long-paths-long-file-names/
Hiç yorum yok:
Yorum Gönder