Bagikan melalui


Format jalur file pada sistem Windows

Anggota dari banyak tipe di namespace System.IO menyertakan parameter path yang memungkinkan Anda menentukan jalur absolut atau relatif ke sumber daya sistem file. Jalur ini kemudian diteruskan ke API sistem file Windows. Topik ini membahas format untuk jalur file yang dapat Anda gunakan pada sistem Windows.

Jalur DOS tradisional

Jalur DOS standar dapat terdiri dari tiga komponen:

Jika ketiga komponen ada, jalurnya absolut. Jika tidak ada volume atau huruf drive yang ditentukan dan nama direktori dimulai dengan karakter pemisah direktori, jalan relatif dari root drive saat ini. Jika tidak, jalur relatif terhadap direktori saat ini. Tabel berikut ini memperlihatkan beberapa kemungkinan jalur direktori dan file.

Jalur Deskripsi
C:\Documents\Newsletters\Summer2018.pdf Jalur file absolut dari akar drive C:.
\Program Files\Custom Utilities\StringFinder.exe Jalur relatif dari akar drive saat ini.
2018\January.xlsx Jalur relatif ke file dalam subdirektori direktori saat ini.
..\Publications\TravelBrochure.pdf Jalur relatif ke file dalam direktori yang dimulai dari direktori saat ini.
C:\Projects\apilibrary\apilibrary.sln Jalur absolut ke file dari akar drive C:.
C:Projects\apilibrary\apilibrary.sln Jalur relatif dari direktori C: drive saat ini.

Penting

Perhatikan perbedaan antara dua jalur terakhir. Keduanya menentukan penentu volume opsional (C: dalam kedua kasus), tetapi yang pertama dimulai dengan akar volume yang ditentukan, sedangkan yang kedua tidak. Akibatnya, yang pertama adalah jalur absolut dari direktori akar drive C:, sedangkan yang kedua adalah jalur relatif dari direktori drive C:saat ini . Penggunaan formulir kedua ketika yang pertama dimaksudkan adalah sumber bug umum yang melibatkan jalur file Windows.

Anda dapat menentukan apakah jalur file sepenuhnya memenuhi syarat (yaitu, jika jalur independen dari direktori saat ini dan tidak berubah ketika direktori saat ini berubah) dengan memanggil Path.IsPathFullyQualified metode . Perhatikan bahwa jalur seperti itu dapat mencakup segmen direktori relatif (. dan ..) dan masih sepenuhnya memenuhi syarat jika jalur yang diselesaikan selalu menunjuk ke lokasi yang sama.

Contoh berikut mengilustrasikan perbedaan antara jalur absolut dan relatif. Ini mengasumsikan bahwa direktori D:\FY2018\ sudah ada, dan Anda belum mengatur direktori saat ini pada prompt perintah D:\ sebelum menjalankan contoh.

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

Jalur UNC

Jalur konvensi penamaan universal (UNC), yang digunakan untuk mengakses sumber daya jaringan, memiliki format berikut:

  • Nama server atau host, yang diawali oleh \\. Nama server dapat berupa nama komputer NetBIOS atau alamat IP/FQDN (IPv4 serta v6 didukung).
  • Nama berbagi, yang dipisahkan dari nama host dengan \. Bersama-sama, server dan nama berbagi membentuk volume.
  • Nama direktori. Karakter pemisah direktori memisahkan subdirektori dalam hierarki direktori berlapis.
  • Nama file opsional. Karakter pemisah direktori memisahkan jalur file dan nama file.

Berikut ini adalah beberapa contoh jalur UNC:

Jalur Deskripsi
\\system07\C$\ Direktori root dari drive C: pada system07.
\\Server2\Share\Test\Foo.txt File Foo.txt dalam direktori Uji dari volume \\Server2\Share.

Jalur UNC harus selalu sepenuhnya memenuhi syarat. Mereka dapat mencakup segmen direktori relatif (. dan ..), tetapi ini harus menjadi bagian dari jalur yang sepenuhnya memenuhi syarat. Anda hanya dapat menggunakan path relatif dengan memetakan jalur UNC ke huruf drive.

Jalur perangkat DOS

Sistem operasi Windows memiliki model objek terpadu yang menunjuk ke semua sumber daya, termasuk file. Jalur objek ini dapat diakses dari jendela konsol dan diekspos ke lapisan Win32 melalui folder khusus untuk tautan simbolis yang dipetakan ke jalur DOS dan UNC lama. Folder khusus ini diakses melalui sintaks jalur perangkat DOS, yang merupakan salah satu dari:

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

Selain mengidentifikasi drive dengan huruf drive-nya, Anda dapat mengidentifikasi volume dengan menggunakan GUID volumenya. Ini berbentuk:

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

Nota

Sintaks jalur perangkat DOS didukung pada implementasi .NET yang berjalan di Windows yang dimulai dengan .NET Core 1.1 dan .NET Framework 4.6.2.

Jalur perangkat DOS terdiri dari komponen berikut:

  • Penentu jalur perangkat (\\.\ atau \\?\), yang mengidentifikasi jalur sebagai jalur perangkat DOS.

    Nota

    \\?\ didukung di semua versi .NET Core dan .NET 5+ dan di .NET Framework yang dimulai dengan versi 4.6.2.

  • Tautan simbolis ke objek perangkat "nyata" (C: dalam kasus nama drive, atau Volume{b75e2c83-0000-0000-0000-602f00000000} dalam kasus GUID volume).

    Segmen pertama jalur perangkat DOS setelah penentu jalur perangkat mengidentifikasi volume atau drive. (Misalnya, \\?\C:\ dan \\.\BootPartition\.)

    Ada tautan khusus untuk UNC yang disebut, tidak mengherankan, UNC. Contohnya:

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

    Untuk perangkat UNC, bagian server/share membentuk volume. Misalnya, di \\?\server1\utilities\\filecomparer\, bagian server/share adalah server1\utilities. Ini penting ketika memanggil metode seperti Path.GetFullPath(String, String) dengan segmen direktori relatif; tidak mungkin untuk menavigasi melampaui batas volume.

Jalur perangkat DOS sepenuhnya memenuhi syarat menurut definisi dan tidak dapat dimulai dengan segmen direktori relatif (. atau ..). Direktori saat ini tidak pernah masuk ke dalam penggunaannya.

Contoh: Cara untuk merujuk ke file yang sama

Contoh berikut mengilustrasikan beberapa cara untuk merujuk pada berkas saat menggunakan API di namespace System.IO. Contoh membuat instance objek FileInfo dan menggunakan properti Name dan Length untuk menampilkan nama file dan panjang file.

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

Normalisasi jalur

Hampir semua jalur yang diteruskan ke API Windows dinormalisasi. Selama normalisasi, Windows melakukan langkah-langkah berikut:

  • Mengidentifikasi jalur.
  • Menerapkan direktori saat ini ke jalur (relatif) yang memenuhi syarat sebagian.
  • Mengkanonisasi komponen dan pemisah direktori.
  • Mengevaluasi komponen direktori relatif (. untuk direktori saat ini dan .. untuk direktori induk).
  • Memangkas karakter tertentu.

Normalisasi ini terjadi secara implisit, tetapi Anda dapat melakukannya secara eksplisit dengan memanggil Path.GetFullPath metode , yang membungkus panggilan ke fungsi GetFullPathName(). Anda juga dapat memanggil fungsi Windows GetFullPathName() secara langsung menggunakan P/Invoke.

Identifikasi jalur

Langkah pertama dalam normalisasi jalur adalah mengidentifikasi jenis jalur. Jalur termasuk dalam salah satu dari beberapa kategori:

  • Mereka adalah jalur perangkat; artinya, mereka dimulai dengan dua karakter pemisah dan tanda tanya atau titik (\\? atau \\.).
  • Mereka adalah jalur UNC; artinya, mereka dimulai dengan dua pemisah tanpa tanda tanya atau titik.
  • Mereka adalah jalur DOS yang sepenuhnya memenuhi syarat; yaitu, mereka dimulai dengan huruf drive, pemisah volume, dan pemisah komponen (C:\).
  • Mereka menunjuk perangkat warisan (CON, LPT1).
  • Mereka relatif terhadap akar drive saat ini; artinya, mereka dimulai dengan pemisah komponen tunggal (\).
  • Mereka relatif terhadap direktori drive yang ditentukan saat ini; yaitu, mereka dimulai dengan huruf drive, pemisah volume, dan tidak ada pemisah komponen (C:).
  • Mereka relatif terhadap direktori saat ini; artinya, mereka memulai dengan hal lain (temp\testfile.txt).

Jenis jalur menentukan apakah direktori saat ini diterapkan dengan cara tertentu atau tidak. Ini juga menentukan apa "akar" dari jalur tersebut.

Menangani perangkat warisan

Jika jalur adalah perangkat DOS warisan seperti CON, , COM1atau LPT1, jalur tersebut dikonversi menjadi jalur perangkat dengan prepending \\.\ dan dikembalikan.

Sebelum Windows 11, jalur yang dimulai dengan nama perangkat warisan selalu ditafsirkan sebagai perangkat warisan oleh metode Path.GetFullPath(String). Misalnya, jalur perangkat DOS untuk CON.TXT adalah \\.\CON, dan jalur perangkat DOS untuk COM1.TXT\file1.txt adalah \\.\COM1. Karena ini tidak lagi berlaku dengan Windows 11, tentukan jalur lengkap ke perangkat DOS warisan, seperti \\.\CON.

Terapkan direktori saat ini

Jika jalur tidak sepenuhnya memenuhi syarat, Windows menerapkan direktori saat ini ke jalur tersebut. Jalur UNC dan perangkat tidak menerapkan direktori saat ini. Tidak juga drive penuh dengan pemisah C:\.

Jika jalur dimulai dengan pemisah komponen tunggal, drive dari direktori saat ini diterapkan. Misalnya, jika jalur file adalah \utilities dan direktori saat ini adalah C:\temp\, normalisasi menghasilkan C:\utilities.

Jika jalur dimulai dengan huruf drive, pemisah volume, dan tanpa pemisah komponen, direktori kerja terakhir yang diatur dari shell perintah untuk drive yang ditentukan akan diterapkan. Jika direktori kerja terakhir tidak diatur, hanya drive yang digunakan. Misalnya, jika jalur file adalah D:sources, direktori saat ini adalah C:\Documents\, dan direktori terakhir saat ini pada drive D: adalah D:\sources\, hasilnya adalah D:\sources\sources. Jalur "dorong relatif" ini adalah sumber umum kesalahan logika program dan skrip. Menganggap bahwa jalur yang dimulai dengan huruf dan titik dua bukan jalur relatif jelas merupakan kesalahan.

Jika jalur dimulai dengan sesuatu selain pemisah, drive saat ini dan direktori saat ini akan digunakan. Misalnya, jika jalurnya adalah filecompare dan direktori saat ini adalah C:\utilities\, hasilnya adalah C:\utilities\filecompare\.

Penting

Jalur relatif berbahaya dalam aplikasi multithreaded (yaitu, sebagian besar aplikasi) karena direktori saat ini adalah pengaturan per proses. Utas apa pun dapat mengubah direktori saat ini kapan saja. Dimulai dengan .NET Core 2.1, Anda dapat memanggil metode Path.GetFullPath(String, String) untuk mendapatkan jalur absolut dari jalur relatif dan jalur basis (direktori saat ini) yang ingin Anda gunakan sebagai acuan.

Standarisasi pemisah

Semua garis miring ke depan (/) dikonversi menjadi pemisah Windows standar, garis miring belakang (\). Jika ada, serangkaian garis miring yang mengikuti dua garis miring pertama diciutkan menjadi satu garis miring.

Nota

Dimulai dengan .NET 8 pada sistem operasi berbasis Unix, runtime tidak lagi mengubah karakter garis miring kembali (\) menjadi pemisah direktori (garis miring ke depan /). Untuk informasi selengkapnya, lihat Pemetaan garis miring terbalik di jalur file Unix.

Mengevaluasi komponen relatif

Saat jalur diproses, komponen atau segmen apa pun yang terdiri dari satu atau periode ganda (. atau ..) dievaluasi:

  • Untuk satu periode, segmen saat ini dihapus, karena mengacu pada direktori saat ini.

  • Untuk periode ganda, segmen saat ini dan segmen induk dihapus, karena periode ganda mengacu pada direktori induk.

    Direktori induk hanya dihapus jika tidak melewati akar jalur. Akar jalur tergantung pada jenis jalur. Ini adalah drive (C:\) untuk jalur DOS, server/berbagi untuk UNC (\\Server\Share), dan awalan jalur perangkat untuk jalur perangkat (\\?\ atau \\.\).

Memangkas karakter

Bersamaan dengan penghapusan pemisah dan segmen relatif sebelumnya, beberapa karakter tambahan dihapus selama normalisasi.

  • Jika segmen berakhir dalam satu periode, periode tersebut akan dihapus. (Segmen periode tunggal atau ganda dinormalisasi pada langkah sebelumnya. Segmen tiga periode atau lebih tidak dinormalisasi dan sebenarnya merupakan nama file/direktori yang valid.)

  • Jika jalur tidak berakhiran tanda pemisah, semua titik dan spasi di akhir (U+0020) akan dihapus. Jika segmen terakhir hanyalah periode tunggal atau ganda, segmen tersebut berada di bawah aturan komponen relatif di atas.

    Aturan ini berarti Anda dapat membuat nama direktori dengan spasi di akhir dengan menambahkan pemisah di belakang setelah spasi.

    Penting

    Anda tidak pernah membuat direktori atau nama file dengan spasi di akhir. Spasi berikutnya dapat menyulitkan atau tidak mungkin untuk mengakses direktori, dan aplikasi biasanya gagal saat mencoba menangani direktori atau file yang namanya mencakup spasi berikutnya.

Lewati normalisasi

Biasanya, jalur apa pun yang diteruskan ke WINDOWS API (efektif) diteruskan ke fungsi GetFullPathName dan dinormalisasi. Ada satu pengecualian penting: jalur perangkat yang dimulai dengan tanda tanya alih-alih titik. Kecuali jalur dimulai persis dengan \\?\ (perhatikan penggunaan tanda garis miring terbalik kanonis), jalur tersebut dinormalisasi.

Mengapa Anda ingin melewati normalisasi? Ada tiga alasan utama:

  1. Untuk mendapatkan akses ke jalur yang biasanya tidak tersedia tetapi legal. File atau direktori yang disebut hidden., misalnya, tidak mungkin diakses dengan cara lain.

  2. Untuk meningkatkan performa dengan tidak melakukan normalisasi jika Anda sudah melakukannya.

  3. Pada .NET Framework saja, untuk melewati pengecekan panjang jalur MAX_PATH sehingga mengizinkan jalur dengan panjang lebih dari 259 karakter. Sebagian besar API mengizinkan ini, dengan beberapa pengecualian.

Nota

.NET Core dan .NET 5+ menangani jalur panjang secara implisit dan tidak melakukan MAX_PATH pemeriksaan. Pemeriksaan MAX_PATH hanya berlaku untuk .NET Framework.

Melewati normalisasi dan pemeriksaan jalur maksimum adalah satu-satunya perbedaan antara dua sintaks jalur perangkat; selain itu, keduanya identik. Berhati-hatilah dengan melewatkan normalisasi, karena Anda dapat dengan mudah membuat jalur yang sulit untuk ditangani aplikasi "normal".

Jalur yang dimulai dengan \\?\ masih dinormalisasi jika Anda secara eksplisit meneruskannya ke fungsi GetFullPathName.

Anda dapat meneruskan jalur lebih dari MAX_PATH karakter ke GetFullPathName tanpa \\?\. Ini mendukung jalur panjang arbitrer hingga ukuran string maksimum yang dapat ditangani Windows.

Kasus dan sistem file Windows

Kekhasan sistem file Windows yang menurut pengguna dan pengembang non-Windows membingungkan adalah bahwa nama jalur dan direktori tidak peka huruf besar/kecil. Artinya, nama direktori dan file mencerminkan casing string yang digunakan saat dibuat. Misalnya, panggilan metode

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

membuat direktori bernama TeStDiReCtOrY. Jika Anda mengganti nama direktori atau file untuk mengubah kasusnya, direktori atau nama file mencerminkan kasus string yang digunakan saat Anda mengganti namanya. Misalnya, kode berikut mengganti nama file bernama test.txt menjadi Test.txt:

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

Namun, perbandingan nama direktori dan file tidak sensitif terhadap huruf besar/kecil. Jika Anda mencari file bernama "test.txt", API sistem file .NET mengabaikan kasus dalam perbandingan. "Test.txt", "TEST.TXT", "test.TXT", dan kombinasi huruf besar dan huruf kecil lainnya akan cocok dengan "test.txt".