2008-09-09 29 views
4

Yol manipülasyonu sorununu güzel bir şekilde belirten iyi bir kitaplıktan haberi olan var mı? Tekerleği yeniden icat etmeden, keyfi ayraçlarla ('/' veya ':') yolları birleştirip ayrıştırmak istiyorum.. NET yolu işleme kitaplığı

System.IO.Path'un tekrar kullanılamayacağı bir utanç.

Teşekkür

+0

Bence System.IO.Path harika çalışıyor. Yapamayacağınız özel görevleriniz var mı? – Espo

+0

@Espo: Sorunun ikinci cümlesini okumaya çalış. –

+0

[Path.DirectorySeparatorChar] 'ı kullanabilir misiniz (http://msdn.microsoft.com/en-us/library/system.io.path.directoryseparatorchar.aspx)? –

cevap

1

System.IO.Path.Combine yolları birçok farklı türleri için büyük çalışacaktır:

http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx

System.IO.Path.Combine birleştirmek şimdiki platformu standart ayırıcılar kullanan yolları. Bu, Windows üzerinde "\" ve unix/linux (mono) 'da kullandığı anlamına gelir. Birleştirmeye çalıştığınız yollar ve hangi platformda bazı örnekler verebilir misiniz?

+0

Afraid System.IO.Path, kullanmadığı ve anladığı ayırıcı karakterlerin önceden tanımlandığından yardımcı olmaz. Belirttiğim gibi, ':' ve '/' gibi keyfi ayırıcı karakterleri kullanmam gerekiyor. System.IO.Path ile yapabileceğim en iyi şey, rasgele karakterleri tanıdığı ('\' gibi) karakterlere dönüştürür ve sonra tekrar geri dönüştürür. Ama bu en iyi ihtimalle hacky çözümü. –

0

Düzenli ifadeler açıklıyorsunuz! Bunu yapman gerekeni destekleyen destek olarak kullan.

+0

Elbette, düzenli ifadeler çalışacak ve şimdiye kadar kullandığım şey bu. Ama onlar aşırı bir yol gibi görünüyorlar ve adanmış bir yol manipülasyon kütüphanesi kadar iyi performans sergilemezler. Afterall, System.IO.Path uygulamasında normal ifadeyi kullanmıyor, değil mi? –

1

Kontrol budur link text

yol işlemlerini işlemek için Patrick kütüphane codeplex project

+0

Teşekkürler - kitaplık kullanışlı görünüyor, ancak yine de özel bir yol ayırıcısının belirtilmesine izin vermiyor. Sadece Path.DirectorySeparatorChar kullanır. –

0

ben size ayırıcılar kapalı dayalı kullanarak ne olabileceğini çevre söyleyemem, ama böyle bir kütüphane görmedim önce.

Bu nedenle reflektörü ve System.IO.Path'u temel alarak tekerleği yeniden icat etmek zor değildir.

  • gerekirse İsteğe InvalidPathChars değiştirmek CTOR
  • bu sınıfın
  • Tedarik sizin ayırıcı karakterleri bir örneğini oluşturun.

Bu, çerçeve tarafından kullanılan kodun oldukça hızlı olması veya yalnızca önemsiz bir fark olması gerektiği anlamına gelir. RegEx'den daha hızlı olabilir ya da olmayabilir, muhtemelen bir teste değer.

class ArbitraryPath 
{ 
    private readonly char _directorySeparatorChar; 
    private readonly char _altDirectorySeparatorChar; 
    private readonly char _volumeSeparatorChar; 

    public ArbitraryPath(char directorySeparatorChar, char altDirectorySeparatorChar, char volumeSeparatorChar) 
    { 
     _directorySeparatorChar = directorySeparatorChar; 
     _altDirectorySeparatorChar = altDirectorySeparatorChar; 
     _volumeSeparatorChar = volumeSeparatorChar; 
    } 

    public string Combine(string path1, string path2) 
    { 
     if ((path1 == null) || (path2 == null)) 
     { 
      throw new ArgumentNullException((path1 == null) ? "path1" : "path2"); 
     } 
     CheckInvalidPathChars(path1); 
     CheckInvalidPathChars(path2); 
     if (path2.Length == 0) 
     { 
      return path1; 
     } 
     if (path1.Length == 0) 
     { 
      return path2; 
     } 
     if (IsPathRooted(path2)) 
     { 
      return path2; 
     } 

     char ch = path1[path1.Length - 1]; 
     if (ch != _directorySeparatorChar && ch != _altDirectorySeparatorChar && ch != _volumeSeparatorChar) 
     { 
      return (path1 + _directorySeparatorChar + path2); 
     } 
     return (path1 + path2); 
    } 

    public bool IsPathRooted(string path) 
    { 
     if (path != null) 
     { 
      CheckInvalidPathChars(path); 
      int length = path.Length; 
      if (length >= 1 && (path[0] == _directorySeparatorChar || path[0] == _altDirectorySeparatorChar) || length >= 2 && path[1] == _volumeSeparatorChar) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

    internal static void CheckInvalidPathChars(string path) 
    { 
     for (int i = 0; i < path.Length; i++) 
     { 
      int num2 = path[i]; 
      if (num2 == 0x22 || num2 == 60 || num2 == 0x3e || num2 == 0x7c || num2 < 0x20) 
      { 
       throw new ArgumentException("Argument_InvalidPathChars"); 
      } 
     } 
    } 

} 
0

Korkarım ki you'll have to implement a path class yourself, yaptığım gibi. Bu şu avantajları sağlar: Eğer tip güvenliği yararlanabilirsiniz

  • sen operatörü geçersiz kılabilir/kolay birleştirme
  • Böyle GetParentPath() ve GetLeafPart (aynı kolaylık üye işlevlerini ekleyebilirsiniz
  • )
  • yapar
İlgili konular