Оскільки ніщо інше, що я знайшов, не допомагає вирішити це справді нормалізовано, ось ще одна відповідь.
Зверніть увагу, що деякі відповіді на подібні запитання намагаються використовувати Uri тип, але це бореться із кінцевими скісними рисками та відсутністю кінцевих скісних рисок.
Моя інша відповідь на цій сторінці працює для операцій, які запускають роботу файлової системи, але якщо ми хочемо мати вирішений шлях прямо зараз (наприклад, для порівняння), не проходячи через файлову систему, C:/Temp/..іC:/ вважатимемо іншим. Не проходячи файлову систему, навігація таким чином не забезпечує нам нормалізованого, належним чином порівнянного шляху.
Що ми можемо зробити?
Ми будемо спиратися на наступне відкриття:
Path.GetDirectoryName(path + "/") ?? "" буде надійно дати нам шлях до каталогу без слеша .
- Додавання скісної риски (як
string, не як char), nullшлях буде трактуватися так само, як і трактується "".
GetDirectoryName утримається від відхилення компонента останнього шляху завдяки доданій косой рисі.
GetDirectoryName нормалізує скісні риски та навігаційні крапки.
- Сюди входить видалення будь-яких косих рисок.
- Сюди входить руйнування
.. за допомогою навігації вгору.
GetDirectoryNameповернеться nullдо порожнього шляху, котрому ми об’єднуємось"" .
Як ми цим користуємось?
Спочатку нормуйте вхідний шлях :
dirPath = Path.GetDirectoryName(dirPath + "/") ?? "";
Потім ми можемо отримати батьківський каталог , і ми можемо повторити цю операцію скільки завгодно разів, щоб перейти далі:
path = Path.GetDirectoryName(path);
Зауважте, що ми ніколи не торкалися файлової системи. Жодна частина шляху не повинна існувати, як це було б, якби ми використовували DirectoryInfo.