2008-09-09 4 views
4

Кто-нибудь знает какую-либо хорошую библиотеку, которая с удовольствием абстрагирует проблему манипуляции с курсом? Я хотел бы иметь возможность комбинировать и анализировать пути с произвольными разделителями (например, «/» или «:»), не изобретая колесо.Библиотека управления трассировкой .NET

Жаль, что System.IO.Path не является более многоразовым.

Благодаря

+0

Я думаю, System.IO.Path отлично работает. У вас есть конкретные задачи, которые вам нужны, с которыми они не справляются? – Espo 2008-09-09 14:53:45

+0

@Espo: попробуйте прочитать второе предложение моего вопроса. – 2009-08-23 14:51:30

+0

Можете ли вы использовать [Path.DirectorySeparatorChar] (http://msdn.microsoft.com/en-us/library/system.io.path.directoryseparatorchar.aspx)? – 2008-09-09 14:57:53

ответ

1

System.IO.Path.Combine будет работать отлично подходит для многих различных типов путей:

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

System.IO.Path.Combine использует текущие стандартные платформы разделители для объединения пути. Это означает, что в Windows он использует «\», а в unix/linux (моно) он использует «/». Можете ли вы дать несколько примеров того, какие пути вы пытаетесь объединить и на какой платформе?

+0

Afraid System.IO.Path не помогает, поскольку символы разделителя используются и понимаются заранее. Как я уже сказал, мне нужно использовать произвольные разделительные символы, такие как ':' и '/'. Лучшее, что я могу сделать с System.IO.Path, - это преобразовать мои произвольные символы в те, которые он распознает (например, «\»), а затем преобразовать обратно. Но в лучшем случае это хакерское решение. – 2009-08-23 14:50:42

0

Вы описываете регулярные выражения! Используйте это как основу для того, что вам нужно делать.

0

Я не могу сказать, в какой среде вы могли бы использовать на основе от ваших сепараторов, но я никогда не видел библиотеку, как это до.

Таким образом, использование рефлектора и System.IO.Path в качестве основы не сложно изобретать велосипед.

  • Создать экземпляр этого класса
  • Поставка ваших персонажей разделителей в CTOR
  • При необходимости изменить InvalidPathChars при необходимости.

Это код, который используется каркасом, поэтому он должен быть таким же быстрым или только незначительным различием. Может или не быстрее, чем RegEx, но, вероятно, стоит проверить.

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

Боюсь, you'll have to implement a path class yourself, как и я. Это дает следующие преимущества:

  • вы можете получить прибыль от типобезопасности
  • вы можете переопределить оператор /, что делает конкатенацию легче
  • вы можете добавить функции-членов удобства, такие как GetParentPath() и GetLeafPart()