Скинул
сабж, предложения/замечания — вэлкам!
Примеры
static void UseCases(string path)
{
IoCode.IsWellFormedPath(path, nameof(path));
path = PathHelpers.EnsureContainerPath(path); // ensures that path ends with '\'
Code.BugIf(
PathHelpers.IsSimpleName(path),
"Never can be simple name as EnsureContainerPath() was called before");
if (PathHelpers.IsWellFormedRelativePath(path))
{
// ...
}
}
Код внутри самый дубовый, т.к. особой необходимости в перфомансе тут нет (если дело дошло до IO, проверка путей редко становится узким местом).
Плюс самостоятельно писать поддержку
вот этих правил + win 10 long path + путей linux... Я когда-то такое делал, больше не хочу
Здравствуйте, Sinix, Вы писали:
S>Скинул сабж
Уже пригодилось
S>предложения/замечания — вэлкам!
Аннотации только добавил.
И вот здесь
https://github.com/rsdn/CodeJam/blob/master/Main/src/IO/PathHelpers.cs#L22 поле
_directorySeparatorChars нигде не используется. Трогать не стал
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Здравствуйте, Sinix, Вы писали:
S>Скинул сабж, предложения/замечания — вэлкам!
Одно различие обнаружилось с .NET Core 2
Для
a:\a\..a..\ в .NET Framework
Path.GetFullPath(path) возвращает
a:\a\
// .NET Framework
Path.GetFullPath(@"a:\a\..\a..\") // a:\a\
// NET Core 2
Path.GetFullPath(@"a:\a\..\a..\") // a:\a\..a..\
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Здравствуйте, rameel, Вы писали:
R>Для a:\a\..a..\ в .NET Framework Path.GetFullPath(path) возвращает a:\a\
Он от PAL зависит
https://github.com/dotnet/coreclr/blob/6ba74dc2a7194f8d6c86c3aeab572a074ef645c8/src/mscorlib/shared/System/IO/Path.Unix.cs#L20
https://github.com/dotnet/coreclr/blob/6ba74dc2a7194f8d6c86c3aeab572a074ef645c8/src/mscorlib/shared/System/IO/Path.Windows.cs#L35
+ валидация под win не выполняется для extended ("\\.\", "\\?\", or "\??\")-путей.
Получается, выбор из двух вариантов
— или зависим от платформы, но поведение совпадает с целевым фреймворком
— или имеем одинаковое поведение на всех платформах, но потом падаем при вызове методов фреймворка.
Я выбрал первый)
R>И вот здесь https://github.com/rsdn/CodeJam/blob/master/Main/src/IO/PathHelpers.cs#L22 поле _directorySeparatorChars нигде не используется. Трогать не стал
Fixed)
Здравствуйте, Sinix, Вы писали:
То ли жарко, то ли лыжи не едут. Решил все-таки посмотреть в независимом окружении. Создал 2 консольных проекта — один под взрослый фреймворк, второй под .NET Core. Результат — одинаковый в обоих случаях.
a:\a..\
Тем более странно, в тесте, запускаемом под решарпером я вижу другой результат. Надо бы отдельный проект с тестами сделать.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Здравствуйте, Sinix, Вы писали:
S>А, тогда всё ещё проще. Решарпер временами глючит в multi-case тестах, лечится перезапуском студии. Баг не репортил, т.к. у меня он всего пару раз ловился.
Я добавил изолированный не multi-case тест, специально для этого случая. Результат:
[Test]
public void IsWellFormedTest()
{
const string path = @"a:\a\..a..\";
Console.WriteLine("{0} => `{1}`", path, Path.GetFullPath(path));
Console.WriteLine("Assembly: {0}", typeof(Path).AssemblyQualifiedName);
Assert.IsFalse(PathHelpers.IsWellFormedPath(path));
}
Под взрослым все ОК, как и должно быть. Под netcoreapp2.0 результаты вообще странные. Решарпер стабильно выдает такой результат.
Expected: False
But was: True
a:\a\..a..\ => `a:\a\..a..\`
Assembly: System.IO.Path, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
MSTest — первый запуск, все ОК
a:\a\..a..\ => `a:\a\..a\`
Assembly: System.IO.Path, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
но последующие запуски выдают тоже, что и под решарпером до перезагрузки студии.
Отдельное консольное приложение (netcoreapp2.0, вин10) выдает такой результат:
a:\a\..a..\
PS. проект для .NET Framework выдает такой же результат (
a:\a\..a..\), и он отличается от того, что выводится во время теста.
PS. Я напутал в коде в первом сообщении, скопировал кусок не оттуда, но результат как там и написано. Просто я сначала в сообщение скопировал вывод программы, но для наглядности из чего оно получилось почему-то решил скопировать уже из окна теста в студии, ну и скопировал не ту строчку
![](/Forum/Images/maniac.gif)
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>