Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
- Volume atau huruf drive diikuti oleh pemisah volume (
:
). - Nama direktori. Karakter pemisah direktori memisahkan subdirektori dalam hierarki direktori berlapis.
- Nama file opsional. Karakter pemisah direktori memisahkan jalur file dan nama file.
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 adalahserver1\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
, , COM1
atau 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:
Untuk mendapatkan akses ke jalur yang biasanya tidak tersedia tetapi legal. File atau direktori yang disebut
hidden.
, misalnya, tidak mungkin diakses dengan cara lain.Untuk meningkatkan performa dengan tidak melakukan normalisasi jika Anda sudah melakukannya.
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".