Share via


Format jalur file pada sistem Windows

Anggota dari banyak jenis 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 tersebut ada, jalurnya absolut. Jika tidak ada volume atau huruf kandar yang ditentukan dan nama direktori dimulai dengan karakter pemisah direktori, jalur relatif dari akar drive saat ini. Jika tidak, jalurnya relatif terhadap direktori saat ini. Tabel berikut menunjukkan beberapa kemungkinan direktori dan jalur 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 dari 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 drive C: 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 umum bug 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 tersebut dapat mencakup segmen direktori relatif (. dan ..) dan masih sepenuhnya memenuhi syarat jika jalur yang diselesaikan selalu menunjuk ke lokasi yang sama.

Contoh berikut menggambarkan perbedaan antara jalur absolut dan relatif. Ini mengasumsikan bahwa direktori D:\FY2018\ ada, dan Anda belum menentukan direktori saat ini untuk D:\ dari prompt perintah 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 dengan \\. Nama server dapat menjadi nama mesin 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 akar drive C: pada system07.
\\Server2\Share\Test\Foo.txt File Foo.txt di direktori Uji volume \\Server2\Share.

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

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 terpapar lapisan Win32 melalui folder khusus tautan simbolis tempat jalur DOS dan UNC lama dipetakan. 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 berdasarkan huruf kandar, Anda dapat mengidentifikasi volume dengan menggunakan GUID volume. Ini berbentuk:

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

Catatan

Sintaks jalur perangkat DOS didukung pada implementasi .NET yang berjalan pada Windows 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 itu sebagai jalur perangkat DOS.

    Catatan

    \\?\ didukung di semua versi .NET Core dan .NET 5+ dan di .NET Framework 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 dipanggil, tidak mengherankan, UNC. Contohnya:

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

    Untuk UNC perangkat, bagian server/berbagi membentuk volume. Misalnya, dalam \\?\server1\utilities\\filecomparer\, bagian server/berbagi adalah server1\utilities. Ini signifikan ketika memanggil metode seperti Path.GetFullPath(String, String) dengan segmen direktori relatif; tidak mungkin menavigasi melewati volume.

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

Contoh: Cara merujuk ke file yang sama

Contoh berikut mengilustrasikan beberapa cara agar Anda dapat merujuk ke file saat menggunakan API di namespace System.IO. Contoh membuat instans 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 dilalui ke API Windows dinormalisasi. Selama normalisasi, Windows melakukan langkah-langkah berikut:

  • Mengidentifikasi jalan.
  • Menerapkan direktori saat ini ke jalur yang sebagian memenuhi syarat (relatif).
  • Komponen kanonis 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 metode Path.GetFullPath, yang membungkus panggilan ke fungsi GetFullPathName(). Anda juga dapat memanggil fungsi Windows GetFullPathName() secara langsung menggunakan P/Invoke.

Mengidentifikasi jalur

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

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

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

Menangani perangkat lama

Jika jalur adalah perangkat DOS lama seperti CON, COM1 atau LPT1, jalur tersebut dikonversi menjadi jalur perangkat dengan menambahkan \\.\ dan dikembalikan.

Jalur yang dimulai dengan nama perangkat lama selalu ditafsirkan sebagai perangkat lama dengan metode Path.GetFullPath(String). Misalnya, jalur perangkat DOS untuk CON.TXT adalah \\.\CON, dan jalur perangkat DOS untuk COM1.TXT\file1.txt adalah \\.\COM1.

Menerapkan direktori saat ini

Jika jalur tidak sepenuhnya memenuhi syarat, Windows menerapkan direktori saat ini untuk itu. UNC dan jalur perangkat tidak memiliki direktori saat ini yang diterapkan. Tidak ada 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 kandar, pemisah volume, dan tidak ada pemisah komponen, direktori terakhir saat ini yang ditetapkan dari shell perintah untuk drive yang ditentukan diterapkan. Jika direktori terakhir saat ini tidak diatur, drive saja diterapkan. 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 "drive relative" ini adalah sumber umum kesalahan logika program dan skrip. Dengan asumsi bahwa jalur yang dimulai dengan huruf dan titik dua tidak relatif jelas tidak benar.

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

Penting

Jalur relatif berbahaya dalam aplikasi multialur (yaitu, sebagian besar aplikasi) karena direktori saat ini adalah pengaturan per proses. Setiap alur 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 dasar (direktori saat ini) yang ingin Anda atasi.

Pemisah kanonis

Semua garis miring (/) dikonversi menjadi pemisah Windows standar, garis miring terbalik (\). Jika itu ada, serangkaian garis miring yang mengikuti dua garis miring pertama runtuh menjadi satu garis miring.

Mengevaluasi komponen relatif

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

  • Untuk periode tunggal, 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 prefiks jalur perangkat untuk jalur perangkat (\\?\ atau \\.\).

Memangkas karakter

Seiring dengan berjalannya pemisah dan segmen relatif yang dihapus sebelumnya, beberapa karakter tambahan dihapus selama normalisasi:

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

  • Jika jalur tidak berakhir di pemisah, semua periode dan spasi berikutnya (U+0020) akan dihapus. Jika segmen terakhir hanyalah periode tunggal atau ganda, itu termasuk dalam aturan komponen relatif di atas.

    Aturan ini berarti Anda dapat membuat nama direktori dengan spasi berikutnya dengan menambahkan pemisah berikutnya setelah spasi.

    Penting

    Anda tidak boleh membuat direktori atau nama file dengan spasi berikutnya. Space berikutnya dapat membuat sulit atau tidak mungkin untuk mengakses direktori, dan aplikasi biasanya gagal ketika mencoba untuk menangani direktori atau file yang namanya termasuk spasi berikutnya.

Lewati normalisasi

Biasanya, jalur apa pun yang diteruskan ke API Windows (secara efektif) diteruskan ke fungsi GetFullPathName dan dinormalisasi. Ada satu pengecualian penting: jalur perangkat yang dimulai dengan tanda tanya, bukan periode. Kecuali jalur dimulai persis dengan \\?\ (perhatikan penggunaan garis miring terbalik kanonis), jalur 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 dipanggil hidden., misalnya, tidak mungkin diakses dengan cara lain.

  2. Untuk meningkatkan performa dengan melewati normalisasi jika Anda telah menormalkan.

  3. Hanya pada .NET Framework, untuk melewati pemeriksaan MAX_PATH panjang jalur untuk mengizinkan jalur yang lebih besar dari 259 karakter. Sebagian besar API mengizinkan ini, dengan beberapa pengecualian.

Catatan

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

Melewatkan normalisasi dan pemeriksaan jalur maks adalah satu-satunya perbedaan antara dua sintaks jalur perangkat; keduanya sebaliknya identik. Berhati-hatilah dengan melewatkan normalisasi, karena Anda dapat dengan mudah membuat jalur yang sulit untuk ditangani oleh 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 yang berubah-ubah hingga ukuran string maksimum yang dapat ditangani Windows.

Kasus dan sistem file Windows

Keunikan sistem file Windows yang bukan pengguna Windows dan pengembang merasa membingungkan adalah bahwa jalur dan nama direktori tidak peka huruf besar/kecil. Artinya, nama direktori dan file mencerminkan kerangka string yang digunakan saat dibuat. Misalnya, metode panggilan

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

membuat direktori bernama TeStDiReCtOrY. Jika Anda mengganti nama direktori atau file untuk mengubah huruf besar kecilnya, direktori atau nama file mencerminkan kerangka 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 direktori dan nama file tidak peka huruf besar/kecil. Jika Anda mencari file bernama "test.txt", API sistem file .NET mengabaikan huruf besar kecil dalam perbandingan. "Test.txt", "TEST.TXT", "test.TXT", dan kombinasi huruf besar dan huruf kecil lainnya akan cocok dengan "test.txt".