Aracılığıyla paylaş


Windows sistemlerinde dosya yolu biçimleri

Ad alanı içindeki System.IO türlerin birçoğunun üyeleri, bir path dosya sistemi kaynağının mutlak veya göreli yolunu belirtmenize olanak tanıyan bir parametre içerir. Bu yol daha sonra Windows dosya sistemi API'lerine geçirilir. Bu konuda, Windows sistemlerinde kullanabileceğiniz dosya yollarının biçimleri açıklanmaktadır.

Geleneksel DOS yolları

Standart bir DOS yolu üç bileşenden oluşabilir:

  • Birim veya sürücü harfi ve ardından birim ayırıcısı (:).
  • Dizin adı. Dizin ayırıcı karakteri, iç içe dizin hiyerarşisi içindeki alt dizinleri ayırır.
  • İsteğe bağlı bir dosya adı. Dizin ayırıcı karakteri, dosya yolunu ve dosya adını ayırır.

Üç bileşen de varsa, yol mutlaktır. Birim veya sürücü harfi belirtilmezse ve dizin adı dizin ayırıcı karakteriyle başlıyorsa, yol geçerli sürücünün kökünden görelidir. Aksi takdirde, yol mevcut dizine göredir. Aşağıdaki tabloda bazı olası dizin ve dosya yolları gösterilmektedir.

Yol Açıklama
C:\Documents\Newsletters\Summer2018.pdf C: sürücüsünün kökünden mutlak bir dosya yolu.
\Program Files\Custom Utilities\StringFinder.exe Geçerli sürücünün kökünden itibaren göreli bir yol.
2018\January.xlsx Geçerli dizinin alt dizinindeki bir dosyanın göreli yolu.
..\Publications\TravelBrochure.pdf Geçerli dizinden başlayarak, bulunduğu dizindeki bir dosyanın göreli yolu.
C:\Projects\apilibrary\apilibrary.sln Sürücünün C:kökünden bir dosyanın mutlak yolu.
C:Projects\apilibrary\apilibrary.sln C: sürücüsünün geçerli dizininden göreli bir yol.

Önemli

Son iki yol arasındaki farka dikkat edin. her ikisi de isteğe bağlı birim tanımlayıcısını (C: her iki durumda da) belirtir, ancak ilki belirtilen birimin köküyle başlar, ikincisi ise belirtilmez. Sonuç olarak, birincisi sürücünün C:kök dizininden mutlak bir yoldur, ikincisi ise geçerli sürücü C:dizininden göreli bir yoldur. İlki amaçlandığında ikinci formun kullanılması, Windows dosya yollarını içeren yaygın bir hata kaynağıdır.

Yöntemini çağırarak Path.IsPathFullyQualified bir dosya yolunun tam olarak nitelenip nitelenmediğini (yani, yolun geçerli dizinden bağımsız olup olmadığını ve geçerli dizin değiştiğinde değişmediğini) belirleyebilirsiniz. Bu tür bir yol göreli dizin kesimlerini (. ve ..) içerebilir ve çözümlenen yol her zaman aynı konumu işaret ediyorsa yine de tam nitelikli olabilir.

Aşağıdaki örnekte mutlak ve göreli yollar arasındaki fark gösterilmektedir. Dizinin D:\FY2018\ mevcut olduğu ve örneği çalıştırmadan önce komut isteminde D:\ için geçerli bir dizin ayarlamadığınız varsayılır.

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;

public class Example2
{
    public static void Main(string[] args)
    {
        Console.WriteLine($"Current directory is '{Environment.CurrentDirectory}'");
        Console.WriteLine("Setting current directory to 'C:\\'");

        Directory.SetCurrentDirectory(@"C:\");
        string path = Path.GetFullPath(@"D:\FY2018");
        Console.WriteLine($"'D:\\FY2018' resolves to {path}");
        path = Path.GetFullPath(@"D:FY2018");
        Console.WriteLine($"'D:FY2018' resolves to {path}");

        Console.WriteLine("Setting current directory to 'D:\\Docs'");
        Directory.SetCurrentDirectory(@"D:\Docs");

        path = Path.GetFullPath(@"D:\FY2018");
        Console.WriteLine($"'D:\\FY2018' resolves to {path}");
        path = Path.GetFullPath(@"D:FY2018");

        // This will be "D:\Docs\FY2018" as it happens to match the drive of the current directory
        Console.WriteLine($"'D:FY2018' resolves to {path}");

        Console.WriteLine("Setting current directory to 'C:\\'");
        Directory.SetCurrentDirectory(@"C:\");

        path = Path.GetFullPath(@"D:\FY2018");
        Console.WriteLine($"'D:\\FY2018' resolves to {path}");

        // This will be either "D:\FY2018" or "D:\FY2018\FY2018" in the subprocess. In the sub process,
        // the command prompt set the current directory before launch of our application, which
        // sets a hidden environment variable that is considered.
        path = Path.GetFullPath(@"D:FY2018");
        Console.WriteLine($"'D:FY2018' resolves to {path}");

        if (args.Length < 1)
        {
            Console.WriteLine(@"Launching again, after setting current directory to D:\FY2018");
            Uri currentExe = new(Assembly.GetExecutingAssembly().Location, UriKind.Absolute);
            string commandLine = $"/C cd D:\\FY2018 & \"{currentExe.LocalPath}\" stop";
            ProcessStartInfo psi = new("cmd", commandLine); ;
            Process.Start(psi).WaitForExit();

            Console.WriteLine("Sub process returned:");
            path = Path.GetFullPath(@"D:\FY2018");
            Console.WriteLine($"'D:\\FY2018' resolves to {path}");
            path = Path.GetFullPath(@"D:FY2018");
            Console.WriteLine($"'D:FY2018' resolves to {path}");
        }
        Console.WriteLine("Press any key to continue... ");
        Console.ReadKey();
    }
}
// The example displays the following output:
//      Current directory is 'C:\Programs\file-paths'
//      Setting current directory to 'C:\'
//      'D:\FY2018' resolves to D:\FY2018
//      'D:FY2018' resolves to d:\FY2018
//      Setting current directory to 'D:\Docs'
//      'D:\FY2018' resolves to D:\FY2018
//      'D:FY2018' resolves to D:\Docs\FY2018
//      Setting current directory to 'C:\'
//      'D:\FY2018' resolves to D:\FY2018
//      'D:FY2018' resolves to d:\FY2018
//      Launching again, after setting current directory to D:\FY2018
//      Sub process returned:
//      'D:\FY2018' resolves to D:\FY2018
//      'D:FY2018' resolves to d:\FY2018
// The subprocess displays the following output:
//      Current directory is 'C:\'
//      Setting current directory to 'C:\'
//      'D:\FY2018' resolves to D:\FY2018
//      'D:FY2018' resolves to D:\FY2018\FY2018
//      Setting current directory to 'D:\Docs'
//      'D:\FY2018' resolves to D:\FY2018
//      'D:FY2018' resolves to D:\Docs\FY2018
//      Setting current directory to 'C:\'
//      'D:\FY2018' resolves to D:\FY2018
//      'D:FY2018' resolves to D:\FY2018\FY2018
Imports System.IO
Imports System.Reflection

Public Module Example2

    Public Sub Main(args() As String)
        Console.WriteLine($"Current directory is '{Environment.CurrentDirectory}'")
        Console.WriteLine("Setting current directory to 'C:\'")
        Directory.SetCurrentDirectory("C:\")

        Dim filePath As String = Path.GetFullPath("D:\FY2018")
        Console.WriteLine($"'D:\\FY2018' resolves to {filePath}")
        filePath = Path.GetFullPath("D:FY2018")
        Console.WriteLine($"'D:FY2018' resolves to {filePath}")

        Console.WriteLine("Setting current directory to 'D:\\Docs'")
        Directory.SetCurrentDirectory("D:\Docs")

        filePath = Path.GetFullPath("D:\FY2018")
        Console.WriteLine($"'D:\\FY2018' resolves to {filePath}")
        filePath = Path.GetFullPath("D:FY2018")

        ' This will be "D:\Docs\FY2018" as it happens to match the drive of the current directory
        Console.WriteLine($"'D:FY2018' resolves to {filePath}")

        Console.WriteLine("Setting current directory to 'C:\\'")
        Directory.SetCurrentDirectory("C:\")

        filePath = Path.GetFullPath("D:\FY2018")
        Console.WriteLine($"'D:\\FY2018' resolves to {filePath}")

        ' This will be either "D:\FY2018" or "D:\FY2018\FY2018" in the subprocess. In the sub process,
        ' the command prompt set the current directory before launch of our application, which
        ' sets a hidden environment variable that is considered.
        filePath = Path.GetFullPath("D:FY2018")
        Console.WriteLine($"'D:FY2018' resolves to {filePath}")

        If args.Length < 1 Then
            Console.WriteLine("Launching again, after setting current directory to D:\FY2018")
            Dim currentExe As New Uri(Assembly.GetExecutingAssembly().GetName().CodeBase, UriKind.Absolute)
            Dim commandLine As String = $"/C cd D:\FY2018 & ""{currentExe.LocalPath}"" stop"
            Dim psi As New ProcessStartInfo("cmd", commandLine)
            Process.Start(psi).WaitForExit()

            Console.WriteLine("Sub process returned:")
            filePath = Path.GetFullPath("D:\FY2018")
            Console.WriteLine($"'D:\\FY2018' resolves to {filePath}")
            filePath = Path.GetFullPath("D:FY2018")
            Console.WriteLine($"'D:FY2018' resolves to {filePath}")
        End If
        Console.WriteLine("Press any key to continue... ")
        Console.ReadKey()
    End Sub
End Module
' The example displays the following output:
'      Current directory is 'C:\Programs\file-paths'
'      Setting current directory to 'C:\'
'      'D:\FY2018' resolves to D:\FY2018
'      'D:FY2018' resolves to d:\FY2018
'      Setting current directory to 'D:\Docs'
'      'D:\FY2018' resolves to D:\FY2018
'      'D:FY2018' resolves to D:\Docs\FY2018
'      Setting current directory to 'C:\'
'      'D:\FY2018' resolves to D:\FY2018
'      'D:FY2018' resolves to d:\FY2018
'      Launching again, after setting current directory to D:\FY2018
'      Sub process returned:
'      'D:\FY2018' resolves to D:\FY2018
'      'D:FY2018' resolves to d:\FY2018
' The subprocess displays the following output:
'      Current directory is 'C:\'
'      Setting current directory to 'C:\'
'      'D:\FY2018' resolves to D:\FY2018
'      'D:FY2018' resolves to D:\FY2018\FY2018
'      Setting current directory to 'D:\Docs'
'      'D:\FY2018' resolves to D:\FY2018
'      'D:FY2018' resolves to D:\Docs\FY2018
'      Setting current directory to 'C:\'
'      'D:\FY2018' resolves to D:\FY2018
'      'D:FY2018' resolves to D:\FY2018\FY2018

UNC yolları

Ağ kaynaklarına erişmek için kullanılan evrensel adlandırma kuralı (UNC) yolları aşağıdaki biçime sahiptir:

  • \\ ile başlayan bir sunucu veya ana bilgisayar adı. Sunucu adı bir NetBIOS makine adı veya IP/FQDN adresi olabilir (IPv4 ve v6 desteklenir).
  • Ana bilgisayar adından ile \ayrılmış bir paylaşım adı. Sunucu ve paylaşım adı bir araya gelerek disk bölümünü oluşturur.
  • Dizin adı. Dizin ayırıcı karakteri, iç içe dizin hiyerarşisi içindeki alt dizinleri ayırır.
  • İsteğe bağlı bir dosya adı. Dizin ayırıcı karakteri, dosya yolunu ve dosya adını ayırır.

UnC yollarına bazı örnekler aşağıda verilmiştir:

Yol Açıklama
\\system07\C$\ C: sürücüsünün system07 kök dizini.
\\Server2\Share\Test\Foo.txt Test dizinindeki Foo.txt dosyası \\Server2\Share biriminde.

UNC yolları her zaman tam nitelikli olmalıdır. Göreli dizin segmentlerini (. ve ..) içerebilir, ancak bunlar tam bir yolun parçası olmalıdır. Göreli yolları yalnızca unc yolunu bir sürücü harfine eşleyerek kullanabilirsiniz.

DOS cihaz yolları

Windows işletim sistemi, dosyalar da dahil olmak üzere tüm kaynakları işaret eden birleşik bir nesne modeline sahiptir. Bu nesne yollarına konsol penceresinden erişilebilir ve eski DOS ve UNC yollarının eşlendiği özel bir sembolik bağlantı klasörü aracılığıyla Win32 katmanına sunulur. Bu özel klasöre AŞAĞıDAKIlerden biri olan DOS cihaz yolu söz dizimi aracılığıyla erişilir:

\\.\C:\Test\Foo.txt \\?\C:\Test\Foo.txt

Bir sürücüyü sürücü harfiyle tanımlamanın yanı sıra birim GUID'sini kullanarak da bir birimi tanımlayabilirsiniz. Bu, şu biçimi alır:

\\.\Volume{b75e2c83-0000-0000-0000-602f00000000}\Test\Foo.txt \\?\Volume{b75e2c83-0000-0000-0000-602f00000000}\Test\Foo.txt

Uyarı

DOS cihaz yolu söz dizimi, .NET Core 1.1 ve .NET Framework 4.6.2 ile başlayan Windows üzerinde çalışan .NET uygulamalarında desteklenir.

DOS cihaz yolu aşağıdaki bileşenlerden oluşur:

  • Yolu DOS cihaz yolu olarak tanımlayan cihaz yolu tanımlayıcısı (\\.\ veya \\?\).

    Uyarı

    \\?\, .NET Core ve .NET 5+ sürümlerinin tüm sürümlerinde ve 4.6.2 sürümünden itibaren .NET Framework'te desteklenir.

  • "Gerçek" cihaz nesnesine sembolik bağlantı (C: sürücü adı söz konusu olduğunda veya birim GUID'si söz konusu olduğunda Volume{b75e2c83-0000-0000-0000-602f00000000} ).

    DoS cihaz yolunun, cihaz yolu tanımlayıcısı birimi veya sürücüyü tanımladıktan sonraki ilk kesimi. (Örneğin, \\?\C:\ ve \\.\BootPartition\.)

    UNC'ler için, şaşırtıcı olmayacak şekilde, UNC adında belirli bir bağlantı vardır. Örneğin:

    \\.\UNC\Server\Share\Test\Foo.txt \\?\UNC\Server\Share\Test\Foo.txt

    Cihaz UNC'leri için sunucu/paylaşım bölümü birimi oluşturur. Örneğin, \\?\server1\utilities\\filecomparer\ içindeki sunucu/paylaşım bölümü, server1\utilities şeklindedir. Bu, göreli dizin kesimleri içeren Path.GetFullPath(String, String) gibi bir yöntemi çağırdığınızda önemlidir; birim sınırını aşmak asla mümkün değildir.

DOS cihaz yolları tanım gereği tam olarak nitelenir ve göreli dizin kesimiyle (. veya ..) başlayamaz. Geçerli dizinler asla kullanıma girmez.

Örnek: Aynı dosyaya başvurmanın yolları

Aşağıdaki örnekte, ad alanında API'leri System.IO kullanırken bir dosyaya başvurmanın bazı yolları gösterilmektedir. Örnek bir FileInfo nesnesi oluşturur ve dosya adını ve dosyanın uzunluğunu görüntülemek için Name ve Length özelliklerini kullanır.

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string[] filenames = {
            @"c:\temp\test-file.txt",
            @"\\127.0.0.1\c$\temp\test-file.txt",
            @"\\LOCALHOST\c$\temp\test-file.txt",
            @"\\.\c:\temp\test-file.txt",
            @"\\?\c:\temp\test-file.txt",
            @"\\.\UNC\LOCALHOST\c$\temp\test-file.txt" };

        foreach (string filename in filenames)
        {
            FileInfo fi = new(filename);
            Console.WriteLine($"file {fi.Name}: {fi.Length:N0} bytes");
        }
    }
}
// The example displays output like the following:
//      file test-file.txt: 22 bytes
//      file test-file.txt: 22 bytes
//      file test-file.txt: 22 bytes
//      file test-file.txt: 22 bytes
//      file test-file.txt: 22 bytes
//      file test-file.txt: 22 bytes
Imports System.IO

Module Program
    Sub Main()
        Dim filenames() As String = {
                "c:\temp\test-file.txt",
                "\\127.0.0.1\c$\temp\test-file.txt",
                "\\LOCALHOST\c$\temp\test-file.txt",
                "\\.\c:\temp\test-file.txt",
                "\\?\c:\temp\test-file.txt",
                "\\.\UNC\LOCALHOST\c$\temp\test-file.txt"}

        For Each filename In filenames
            Dim fi As New FileInfo(filename)
            Console.WriteLine($"file {fi.Name}: {fi.Length:N0} bytes")
        Next
    End Sub
End Module

Yol normalizasyonu

Windows API'lerine geçirilen neredeyse tüm yollar normalleştirilir. Normalleştirme sırasında Windows aşağıdaki adımları gerçekleştirir:

  • Yolu tanımlar.
  • Kısmi olarak nitelenmiş (göreli) yollara geçerli dizini uygular.
  • Bileşen ve dizin ayırıcılarını standart hale getirir.
  • Göreli dizin bileşenlerini (. geçerli dizin ve .. üst dizin için) değerlendirir.
  • Belirli karakterleri kesiyor.

Bu normalleştirme örtük olarak gerçekleşir, ancak Path.GetFullPath bir çağrı sarmalayan yöntemini çağırarak bunu açıkça yapabilirsiniz. Windows GetFullPathName() işlevini doğrudan P/Invoke kullanarak da çağırabilirsiniz.

Yolu tanımlama

Yolu normalleştirmenin ilk adımı, yol türünü tanımlamaktır. Yollar birkaç kategoriden birine ayrılır:

  • Bunlar cihaz yollarıdır; diğer bir ifadeyle, iki ayırıcı ve bir soru işareti veya nokta (\\? veya \\.) ile başlarlar.
  • Bunlar UNC yollarıdır; yani, soru işareti veya nokta olmadan iki ayırıcı ile başlarlar.
  • Bunlar tam DOS yollarıdır; yani bir sürücü harfi, birim ayırıcısı ve bir bileşen ayırıcı (C:\) ile başlarlar.
  • Eski bir cihaz (CON, LPT1) olarak tanımlarlar.
  • Bunlar geçerli sürücünün köküne göredir; yani, tek bir bileşen ayırıcısı (\ ) ile başlarlar.
  • Bunlar, belirtilen sürücünün geçerli dizinine göredir; yani, bir sürücü harfi, birim ayırıcısı ile başlar ve bileşen ayırıcısı (C:) içermezler.
  • Bunlar geçerli dizine göredir; yani, başka bir şeyle başlarlar (temp\testfile.txt).

Yolun türü, geçerli bir dizinin bir şekilde uygulanıp uygulanmayacağını belirler. Ayrıca yolun "kökünün" ne olduğunu da belirler.

Eski cihazları işleme

Yol, CON, COM1 veya LPT1 gibi eski bir DOS cihazıysa, başına \\.\ eklenerek bir cihaz yoluna dönüştürülür ve döndürülür.

Windows 11'in öncesinde, eski cihaz adıyla başlayan bir yol her zaman yöntemiyle Path.GetFullPath(String) eski bir cihaz olarak yorumlanır. Örneğin, CON.TXT için DOS cihaz yolu \\.\CON ve COM1.TXT\file1.txt için DOS cihaz yolu \\.\COM1 şeklindedir. Bu artık Windows 11 için geçerli olmadığından, gibi \\.\CONeski DOS cihazının tam yolunu belirtin.

Geçerli dizini uygula

Bir yol tam olarak nitelenmemişse, Windows geçerli dizini buna uygular. UNC ve cihaz yollarına geçerli dizin uygulanmaz. Ayırıcısı C:\olan tam sürücü de yoktur.

Yol tek bir bileşen ayırıcısıyla başlıyorsa, geçerli dizindeki sürücü uygulanır. Örneğin, dosya yolu \utilities ve geçerli dizin C:\temp\ ise, normalleştirme C:\utilities üretir.

Yol bir sürücü harfi, birim ayırıcısı ile başlıyorsa ve bir bileşen ayırıcısı yoksa, belirtilen sürücü için komut kabuğundan ayarlanan son geçerli dizin kullanılır. Son geçerli dizin ayarlanmamışsa, yalnızca sürücü uygulanır. Örneğin, dosya yolu D:sources ise, geçerli dizin C:\Documents\ ve D: sürücüsündeki son geçerli dizin D:\sources\ idi, sonuç D:\sources\sources olur. Bu "sürücüye göreli" yollar, program ve betik mantığı hatalarının yaygın bir kaynağıdır. Harf ve iki nokta üst üste ile başlayan bir yolun göreli olmadığını varsayarsak, açıkça doğru değildir.

Yol ayırıcı dışında bir şeyle başlıyorsa, geçerli sürücü ve geçerli dizin uygulanır. Örneğin, yol filecompare ve geçerli dizin C:\utilities\ olduğunda, sonuç C:\utilities\filecompare\ olur.

Önemli

Geçerli dizin işlem başına bir ayar olduğundan, göreli yollar çok iş parçacıklı uygulamalarda (çoğu uygulamada) tehlikelidir. Herhangi bir iş parçacığı, geçerli dizini istediği zaman değiştirebilir. .NET Core 2.1'den başlayarak, bir göreli yoldan ve çözümlemek istediğiniz temel yoldan (geçerli dizin) mutlak bir yol elde etmek için Path.GetFullPath(String, String) yöntemini çağırabilirsiniz.

Ayırıcıları standart hale getirin

Tüm eğik çizgiler (/) standart Windows ayırıcı olan ters eğik çizgiye (\) dönüştürülür. Varsa, ilk iki eğik çizgiyi izleyen bir dizi eğik çizgi tek bir eğik çizgiye daraltılır.

Uyarı

Unix tabanlı işletim sistemlerinde .NET 8'den başlayarak, çalışma zamanı artık ters eğik çizgi (\) karakterlerini dizin ayırıcılarına (eğik çizgi) dönüştürmez /. Daha fazla bilgi için bkz. Unix dosya yollarında ters eğik çizgi kullanımı.

Göreli bileşenleri değerlendirme

Yol işlenirken, tek veya çift bir dönemden (. veya ) oluşan tüm bileşenler veya ..segmentler değerlendirilir:

  • Geçerli dizine başvurduğundan, geçerli kesim tek bir dönem için kaldırılır.

  • Çift nokta için geçerli segment ve üst segment kaldırılır, çünkü çift nokta üst dizine başvurur.

    Üst dizinler yalnızca yolun kök dizinini aşmıyorlarsa kaldırılır. Yolun kökü, yol türüne bağlıdır. DOS yollarının sürücüsü (C:\), UNC'ler için sunucu/paylaşım (\\Server\Share ) ve cihaz yolları (\\?\ veya \\.\) için cihaz yolu ön ekidir.

Karakterleri kırpma

Daha önce kaldırılan ayırıcı dizileri ve göreli segmentlerin yanı sıra, normalleştirme sırasında bazı ek karakterler kaldırılır.

  • Bir segment tek bir dönemde biterse, bu dönem kaldırılır. (Önceki adımda tek veya çift dönemli bir kesim normalleştirilir. Üç veya daha fazla dönemlik bir kesim normalleştirilmemiştir ve aslında geçerli bir dosya/dizin adıdır.)

  • Eğer yol bir ayırıcıyla bitmiyorsa, sonlarındaki tüm noktalar ve boşluklar (U+0020) kaldırılır. Son segment yalnızca tek veya çift dönemse, yukarıdaki göreli bileşenler kuralına girer.

    Bu kural, bir dizin adını sonda boşluk olacak şekilde oluşturmanın, bu boşluğun ardından bir ayırıcı ekleyerek mümkün olduğu anlamına gelir.

    Önemli

    Hiçbir zaman sonunda boşluk bulunan dizin veya dosya adı oluşturmayın. Sondaki boşluklar bir dizine erişimi zorlaştırabilir veya imkansız hale getirir ve adları sondaki boşlukları içeren dizinleri veya dosyaları işlemeye çalışırken uygulamalar genellikle başarısız olur.

Normalleştirmeyi atla

Normalde, Bir Windows API'sine geçirilen tüm yollar (etkili bir şekilde) GetFullPathName işlevine geçirilir ve normalleştirilir. Önemli bir istisna vardır: nokta yerine soru işaretiyle başlayan cihaz yolu. Yol tam olarak \\?\ ile başlamıyorsa (standart ters eğik çizgi kullanımına dikkat edin), normalleştirilir.

Normalleştirmeyi neden atlamak istiyorsunuz? Üç önemli neden vardır:

  1. Normalde kullanılamayan ancak yasal olan yollara erişim elde etmek için. Örneğin, adlı hidden.bir dosyaya veya dizine başka bir şekilde erişmek mümkün değildir.

  2. Performansı geliştirmek için, zaten normalleştirdiyseniz normalleştirmeyi atlayın.

  3. Yalnızca .NET Framework'te, 259 karakterden uzun yollara izin vermek için MAX_PATH yol uzunluğu denetlemesini atlamak. Çoğu API, bazı özel durumlar dışında buna izin verir.

Uyarı

.NET Core ve .NET 5+ uzun yolları örtük olarak işler ve denetim MAX_PATH gerçekleştirmez. Denetim MAX_PATH yalnızca .NET Framework için geçerlidir.

normalleştirme ve maksimum yol denetimlerinin atlanması, iki cihaz yolu söz dizimi arasındaki tek farktır; aksi takdirde aynı olur. Normalleştirmeyi atlarken dikkatli olun, çünkü "normal" uygulamaların ilgilenmesi zor olan yolları kolayca oluşturabilirsiniz.

Ile \\?\ başlayan yollar, bunları GetFullPathName işlevine açıkça geçirirseniz yine de normalleştirilir.

MAX_PATH olmadan karakterden fazla yolu \\?\'e geçirebilirsiniz. Windows'un işleyebileceği en büyük dize boyutuna kadar rastgele uzunluk yollarını destekler.

Servis talebi ve Windows dosya sistemi

Windows olmayan kullanıcıların ve geliştiricilerin kafa karıştırıcı bulduğu Windows dosya sisteminin bir özelliği, yol ve dizin adlarının büyük/küçük harfe duyarsız olmasıdır. Yani, dizin ve dosya adları, oluşturuldukları sırada kullanılan karakter dizelerinin büyük/küçük harflerini yansıtır. Örneğin, yöntem çağrısı

Directory.Create("TeStDiReCtOrY");
Directory.Create("TeStDiReCtOrY")

TeStDiReCtOrY adlı bir dizin oluşturur. Bir dizini veya dosyayı harflerin büyük/küçük durumunu değiştirmek amacıyla yeniden adlandırırsanız, dizin veya dosya adı, yeniden adlandırma sırasında kullandığınız dizenin harf durumunu yansıtır. Örneğin, aşağıdaki kod test.txt adlı dosyayı Test.txtolarak yeniden adlandırır:

using System.IO;

class Example3
{
    static void Main()
    {
        var fi = new FileInfo(@".\test.txt");
        fi.MoveTo(@".\Test.txt");
    }
}
Imports System.IO

Module Example3
    Public Sub Main()
        Dim fi As New FileInfo(".\test.txt")
        fi.MoveTo(".\Test.txt")
    End Sub
End Module

Ancak, dizin ve dosya adı karşılaştırmaları büyük/küçük harfe duyarlı değildir. "Eğer 'test.txt' adlı bir dosya arıyorsanız, .NET dosya sistemi API'leri karşılaştırmada büyük/küçük harf farkını yoksayar." "Test.txt", "TEST.TXT", "test.TXT" ve büyük ve küçük harflerin diğer bileşimleri "test.txt" ile eşleşir.