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