Нормализуйте имена каталогов в C#

Набор Ресурса всегда включал это. По крайней мере, начиная с Windows 2000.

кроме того, пакет Cygwin имеет sleep - булькание, которое в Ваш ПУТЬ и включают cygwin.dll (или независимо от того, что это называют), и способ пойти!

17
задан Pavel Vladov 25 April 2016 в 13:03
поделиться

2 ответа

      static void Main( string[] args )
      {
         string[] paths = new string[] { "S:\hello\Hi", "S:\hello2\Hi\helloAgain" };
         foreach( string aPath in paths )
         {
            string normalizedPath = NormalizePath( aPath );
            Console.WriteLine( "Previous: '{0}', Normalized: '{1}'", aPath, normalizedPath );
         }
         Console.Write( "\n\n\nPress any key..." );
         Console.Read();
      }

  public static string NormalizePath( string path )
  {
     StringBuilder sb = new StringBuilder( path );
     string[] paths = path.Split('\\');
     foreach( string folderName in paths )
     {
        string normalizedFolderName = ToProperCase( folderName );
        sb.Replace( folderName, normalizedFolderName );
     }
     return sb.ToString();
  }

  /// <summary>
  /// Converts a string to first character upper and rest lower (Camel Case).
  /// </summary>
  /// <param name="stringValue"></param>
  /// <returns></returns>
  public static string ToProperCase( string stringValue )
  {
     if( string.IsNullOrEmpty( stringValue ) )
        return stringValue;

     return CultureInfo.CurrentCulture.TextInfo.ToTitleCase( stringValue.ToLower() );
  }

-3
ответ дан 30 November 2019 в 14:38
поделиться

Вот базовое и относительно быстрое решение, продолжайте читать ниже некоторые комментарии:

private static string GetCase(string path)
{      
  DirectoryInfo dir = new DirectoryInfo(path);
  if (dir.Exists)
  {
    string[] folders = dir.FullName.Split(Path.DirectorySeparatorChar);
    dir = dir.Root;

    foreach (var f in folders.Skip(1))
    {          
      dir = dir.GetDirectories(f).First();
    }

    return dir.FullName;
  }
  else
  {
    return path;
  }
}

Основная идея состоит в том, что получение подкаталогов из объекта DirectoryInfo даст вам правильный регистр, поэтому нам просто нужно разделить имя каталога и перейти от корня к целевому каталогу, получая правильный регистр на каждом шаге.

Мой первоначальный ответ основывался на получении оболочки для каждой папки на диске, и это сработало, но медленно. Я придумал небольшое улучшение, сохраняющее результаты, но все еще слишком медленное для повседневного использования. Вы можете увидеть историю редактирования этого комментария, если вам нужно сделать это для каждой вещи на диске, и даже тогда, вероятно, есть способы ускорить этот код. Это было «вот как ты мог бы это сделать», а не «вот отличный способ сделать это».

Берту, в своем ответе он придумал идею разделить путь на составляющие и получить кожух по частям, что приводит к огромному увеличению скорости, поскольку вы больше не проверяете все ] как в моем первоначальном ответе. Берту также обобщил свое решение для файлов, а также для каталогов. В моих тестах приведенный выше код (который использует идею Берту «разделить путь и сделать это по частям», но подходит к нему итеративно, а не рекурсивно) выполняется примерно вдвое быстрее, чем код Берту. Я не уверен, что это потому, что его метод также обрабатывает файлы, потому что его использование рекурсии приводит к дополнительным накладным расходам, или потому, что он вызывает Path.GetFileName (path) и Path.GetDirectoryName (path ) на каждой итерации. В зависимости от ваших конкретных потребностей,

4
ответ дан 30 November 2019 в 14:38
поделиться