Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 \\.\CON
eski 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:
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.Performansı geliştirmek için, zaten normalleştirdiyseniz normalleştirmeyi atlayın.
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.