Набор Ресурса всегда включал это. По крайней мере, начиная с Windows 2000.
кроме того, пакет Cygwin имеет sleep
- булькание, которое в Ваш ПУТЬ и включают cygwin.dll
(или независимо от того, что это называют), и способ пойти!
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() ); }
Вот базовое и относительно быстрое решение, продолжайте читать ниже некоторые комментарии:
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 )
на каждой итерации. В зависимости от ваших конкретных потребностей,