PathLib, NuGet’te mevcuttur ve kaynağı Github’da bulunabilir
Neden yollar için bir kütüphane?
Yollar, dosyaların açılmasından depolama dizinlerine kadar programlamada yaygın olarak kullanılır. Herhangi bir programın ayrılmaz bir parçasıdırlar, ancak kardeşleri URL’lerden ve URI’lerden farklı olarak çok az programlama dili (güçlü yazımla), yolları depolamak ve değiştirmek için güçlü bir şekilde yazılmış bir çözüme sahiptir.
Bunun yerine, programcılar bu yolları dizeler halinde depolamak ve bir yolu diğerine sıkıştırmak ve bükmek için bir dizi statik yöntem kullanmak zorunda kalırlar. .Net’te bunlar şurada bulunur: System.IO.Path
Ve System.IO.Directory
ad alanları. Yaygın işlemler yolları birleştirmeyi içerir (Path.Combine(path1, path2)
) ve dosya adının çıkarılması (Path.GetFileName("C:\file.txt")
). Bunlar yalnızca belirli bir dize alt kümesi için geçerli olduğundan, daha fazla dilin bir yola karşılık gelen nesnelere sahip olmamasına şaşırdım, böylece yöntemler ve kütüphaneler bir “yol nesnesi” kabul edebilir ve giriş verilerinin en azından uygun olduğundan emin olabilirler. temel bir doğrulama kriterleri seti (yolun kendisi diskte mevcut olmasa bile).
Ruby, Python, C++ ve Java’da mevcut olmasına rağmen, bu kitaplıklardan herhangi birini kullanan gerçek hayat kodunu hiç görmedim veya bunların erdemlerini öven tek bir blog yazısı okumadım (ve PathLib’i test etme deneyimim bunun bir göstergesiyse) , çok var). Bana göre yollara adanmış bir sınıfa sahip olmanın en iyi yanı, yolları kullanan yöntemlere ilişkin beklentileri belirlemektir. Bunlardan hangisi yönteme hangi değerin aktarılacağını daha açık bir şekilde açıklıyor?
public Database OpenDatabase(string dbLocation) {}
public Database OpenDatabase(Path dbLocation) {}
Başkası adına konuşamam ama kesinlikle geçme konusunda daha az istekliyim "http://localhost:4000"
ikincisine öncekinden daha.
Size PathLib’in gücü hakkında küçük bir fikir vermek için, bu (gerçek) senaryonun uygulamalarını karşılaştırın: kullanıcının “uygulamam” dizinindeki tüm dosyaları listeleyin ve tüm alfasayısal karakterleri ekstra “.clean” uzantılı yeni bir dosyaya kopyalayın (böylece file.txt
olur file.clean.txt
). Kullanmaktan kaçındım var
PathLib kullanımına kıyasla PathLib olmayan sürümde kaç tane “dizisel olarak yazılmış” nesnenin oluşturulduğunu göstermek için.
IPath appDir = new WindowsPath("~/myapp").ExpandUser();
foreach(IPath file in appDir.ListDir())
{
if(!file.IsFile()) continue;
string text = file.ReadAsText();
text = Regex.Replace(text, @"\W+", "");
IPath newFile = file.WithFilename(
file.Basename + ".clean" + file.Extension);
using(var output = new StreamWriter(newFile.Open(FileMode.Create)))
{
output.Write(text);
}
}
string userDir = Environment.GetFolderPath(
System.Environment.SpecialFolder.UserProfile); // Only in .Net 4.0
string appDir = Path.Combine(userDir, "myapp");
foreach(string file in Directory.EnumerateFiles(appDir))
{
string text = File.ReadAllText(file);
text = Regex.Replace(text, @"\W+", "");
string newFile = Path.Combine(appDir,
Path.GetFileNameWithoutExtension(file) +
".clean" +
Path.GetExtension(file));
using(var output = new StreamWriter(File.Open(newFile, FileMode.Create)))
{
output.Write(text);
}
}
PathLib nedir?
PathLib’in amacı özellik kümesini genişletmektir. System.IO.Path
ve hepsini kesin olarak yazılmış bir yol nesnesinde paketleyin. Yukarıda bahsedilen benzer isimli Python kütüphanesinden bazı terminolojiyi ödünç almıştır.
Kütüphanede dört ana sınıf ve iki ana arayüz bulunmaktadır:
- IPurePath: “Saf yollar” veya dosya sistemine dokunmayanlar için platformdan bağımsız bir arayüz. Tüm işlemlerin herhangi bir platformda destekleneceği garanti edilir; örneğin, uygulamanız bir Linux makinesinde Windows tarzı yollar oluşturabilir ve kullanabilir (uzak uygulamalar veya bir sunucudaki istemci yollarını değiştiren web uygulamaları için mükemmel).
- IP yolu: Somut yollar için platformdan bağımsız bir arayüz. Bunlar, dosya/dizin bulunması, sembolik bağlantıların çözülmesi ve dosyaların içeriklerinin okunması gibi dosya sistemine dokunan işlemleri gerçekleştirebilir. Tüm IPath’lar, dilin kendisi desteklemese de çoklu kalıtım biçimi olarak çalışan IPurePath arayüzünü devralır.
- PureWindowsPath: Windows doğrulama ve stil kurallarını kullanan saf bir yol. Örneğin, mutlak (UNC olmayan) yollar bir sürücü harfiyle başlar ve ayırıcılar olarak ters eğik çizgileri kullanır ve karşılaştırmalar büyük/küçük harfe duyarlı değildir.
- PurePosixPath: POSIX doğrulama ve stil kurallarını kullanan saf bir yol. POSIX uyumlu sistemler Linux, UNIX ve Mac OSX’i içerir. Bu yollar, bileşen ayırıcılar olarak eğik çizgileri kullanır ve diğer farklılıklar arasında büyük/küçük harfe duyarlı karşılaştırmalara sahiptir.
- Windows Yolu: Windows doğrulama ve stil kurallarını kullanan somut bir yol. Ek olarak, bu sınıfın dosya sistemine dokunan yöntemleri vardır. Bu nedenle sınıf yalnızca Windows sistemlerinde kullanılabilir.
- PosixPath: POSIX doğrulama ve stil kurallarını kullanan somut bir yol. Ek olarak, bu sınıfın dosya sistemine dokunan yöntemleri vardır. Bu nedenle sınıf yalnızca POSIX uyumlu sistemlerde kullanılabilir.
Fabrikalar
Uygulama ve kitaplık geliştiricileri genellikle mümkün olduğunca platformlar arası uyumlu olmak istediklerinden, “windows yolu” veya “posix yolu”nun örneklerini açıkça oluşturmanın pek bir anlamı yoktur. Bu amaçla kütüphane, kullanıcının işletim sistemini otomatik olarak algılayan ve komut üzerine uygun yolu oluşturan birkaç yol fabrikası sağlar.
PurePathFactory
Bu fabrika mevcut işletim sistemi için saf bir yol oluşturur. Ayrıca bir dizi de sağlayabilirsiniz. PurePathFactoryOptions
inşaatçıya:
- AutoNormalizeCase: Oluşturulan nesnedeki bir yolun büyük/küçük harf durumunu her zaman normalleştirin (bunun büyük/küçük harfe duyarlı platformlar üzerinde hiçbir etkisi yoktur).
Kolaylık olması açısından statik, global bir PurePathFactory örneğine şuradan erişilebilir: PurePath
sınıf (genel argüman yok).
Yol Fabrikası
Bu fabrika mevcut işletim sistemi için somut bir yol inşa ediyor. Ayrıca bir dizi de sağlayabilirsiniz. PathFactoryOptions
inşaatçıya:
- AutoNormalizeCase: Oluşturulan nesnedeki bir yolun büyük/küçük harf durumunu her zaman normalleştirin (bunun büyük/küçük harfe duyarlı platformlar üzerinde hiçbir etkisi yoktur).
- AutoExpandEnvironmentVariables: Her zaman oluşturulan nesnede bulunan ortam değişkenlerinin değerini değiştirin.
- AutoExpandUserDirectory: Yol yaklaşık işaretiyle başlıyorsa (
~
), geçerli kullanıcının diziniyle değiştirin. EğerUserDirectory
seçenekler sınıfındaki özellik boş değilse, bu yolu kullanıcı dizini olarak kullanın.
Kolaylık olması açısından statik, global bir PurePathFactory örneğine şuradan erişilebilir: PurePath
sınıf (genel argüman yok).
Serileştirme
Yeni bir veri türünün temel davranışlarından biri, mevcut çeşitli veri depolama ve aktarım formatlarına (yani, XML ve JSON) serileştirme ve seri durumdan çıkarma yeteneğidir. TypeConverters’ın büyüsü sayesinde bu destek yerleşiktir! JSON.Net’te bir yolun seri durumdan çıkarılmasına bir örnek:
class Data
{
public IPath Path { get; set; }
}
public static void Main()
{
var json = @"{ ""path"": ""C:/users/me/file.txt"" }";
var data = JsonConvert.DeserializeObject<Data>(json);
Console.WriteLine(data.Path.Directory);
// C:\users\me
}
WindowsPath veya PosixPath yerine IPath arayüzü kullandığımı unutmayın. Bunların her birinin kendi TypeConverter’ları olsa da, her ikisi de IPath
Ve IPurePath
doğru arayüz tipini seçmek için PathFactory kullanan özel dönüştürücülere sahiptir. Bu, herhangi bir platformdaki kullanıcıları desteklemeyi kolaylaştırır.