From 9e8533948bd60ca1c2df32a528e3f0123cedabfd Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 31 Jan 2026 16:21:42 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=B0?= =?UTF-8?q?=D0=B1=D1=81=D0=BE=D0=BB=D1=8E=D1=82=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BF=D1=83=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "tests/\320\237\321\203\321\202\320\270.os" | 115 ++++++++++++++++++ .../\320\244\320\241.os" | 53 ++++++++ 2 files changed, 168 insertions(+) diff --git "a/tests/\320\237\321\203\321\202\320\270.os" "b/tests/\320\237\321\203\321\202\320\270.os" index 3d3d23c..18f75f4 100644 --- "a/tests/\320\237\321\203\321\202\320\270.os" +++ "b/tests/\320\237\321\203\321\202\320\270.os" @@ -160,6 +160,121 @@ КонецПроцедуры +&Тест +// Абсолютные - буква диска +&Параметры("C:\", Истина) +&Параметры("C:\Windows", Истина) +&Параметры("C:\Program Files\", Истина) +&Параметры("D:\Data\file.txt", Истина) +&Параметры("C:/", Истина) +&Параметры("C:/Windows/System32", Истина) +&Параметры("Z:\folder", Истина) +&Параметры("A:\", Истина) +&Параметры("a:\folder", Истина) // строчная буква +&Параметры("E:/path/to/file", Истина) +// Абсолютные - UNC пути +&Параметры("\\server\share", Истина) +&Параметры("\\server\share\folder\file.txt", Истина) +&Параметры("\\192.168.1.1\c$", Истина) +&Параметры("\\", Истина) // граничный случай с допущением +&Параметры("\\\", Истина) // граничный случай с допущением +&Параметры("\\\\", Истина) // граничный случай с допущением +&Параметры("\\server", Истина) +&Параметры("\\SERVERNAME\ShareName$\Folder", Истина) +// Относительные +&Параметры("Windows\System32", Ложь) +&Параметры(".\file.txt", Ложь) +&Параметры("..\parent", Ложь) +&Параметры("C:", Ложь) +&Параметры("C:file.txt", Ложь) +&Параметры("\Windows", Ложь) // относительно текущего диска +&Параметры("folder\file.txt", Ложь) +&Параметры("..\..\file", Ложь) +&Параметры(".\.\file", Ложь) +// Ошибочные случаи +&Параметры("1:\path", Ложь) +&Параметры("@:\folder", Ложь) +&Параметры("AA:\file", Ложь) +&Параметры("!:\test", Ложь) +&Параметры("9:/path", Ложь) +// Пустые и пробельные строки +&Параметры("", Ложь) +&Параметры(" ", Ложь) +&Параметры(" ", Ложь) // табуляция +// Пути с пробелами +&Параметры("C:\Program Files\My App\file.exe", Истина) +&Параметры("\\server\my share\folder", Истина) +&Параметры("C:\Folder With Spaces\", Истина) +// Пути с обрамляющими пробелами (должны обрезаться) +&Параметры(" C:\Windows ", Истина) +&Параметры(" \\server\share ", Истина) +&Параметры(" C:/test ", Истина) +&Параметры(" Windows\System32 ", Ложь) +// Смешанные слэши +&Параметры("C:\Windows/System32", Истина) +&Параметры("C:/Windows\System32", Истина) +&Параметры("D:\folder/subfolder\file.txt", Истина) +Процедура Тест_ЭтоАбсолютныйПутьWindows(Путь, ЭтоАбсолютный) Экспорт + + Ожидаем.Что(лФС.ЭтоАбсолютныйПутьWindows(Путь)).Равно(ЭтоАбсолютный); + +КонецПроцедуры + +&Тест +// Абсолютные +&Параметры("/", Истина) +&Параметры("/home", Истина) +&Параметры("/home/user/file.txt", Истина) +&Параметры("/var/log/", Истина) +&Параметры("/usr/local/bin", Истина) +&Параметры("/etc/nginx/nginx.conf", Истина) +&Параметры("/tmp/", Истина) +// Относительные +&Параметры("home/user", Ложь) +&Параметры("./file.txt", Ложь) +&Параметры("../parent/file", Ложь) +&Параметры("file.txt", Ложь) +&Параметры("folder/subfolder", Ложь) +&Параметры("../../..", Ложь) +&Параметры("./././file", Ложь) +&Параметры("~", Ложь) +&Параметры("~/Documents", Ложь) +// Пустые и пробельные строки +&Параметры("", Ложь) +&Параметры(" ", Ложь) +&Параметры(" ", Ложь) // табуляция +// Пути с пробелами +&Параметры("/home/my folder/file.txt", Истина) +&Параметры("/var/log/my app/error.log", Истина) +&Параметры("/path with spaces/", Истина) +// Пути с обрамляющими пробелами +&Параметры(" /home/user ", Истина) +&Параметры(" /var/log ", Истина) +&Параметры(" home/user ", Ложь) +// Точки в путях +&Параметры("/home/user/.bashrc", Истина) +&Параметры("/home/user/.config/app/settings.json", Истина) +&Параметры("/.hidden", Истина) +Процедура Тест_ЭтоАбсолютныйПутьUnix(Путь, ЭтоАбсолютный) Экспорт + + Ожидаем.Что(лФС.ЭтоАбсолютныйПутьUnix(Путь)).Равно(ЭтоАбсолютный); + +КонецПроцедуры + +&Тест +#Если Windows Тогда +&Параметры("C:\Windows/System32", Истина) +&Параметры("/home", Ложь) +#Иначе +&Параметры("C:\Windows/System32", Ложь) +&Параметры("/home", Истина) +#КонецЕсли +Процедура Тест_ЭтоАбсолютныйПуть(Путь, ЭтоАбсолютный) Экспорт + + Ожидаем.Что(лФС.ЭтоАбсолютныйПуть(Путь)).Равно(ЭтоАбсолютный); + +КонецПроцедуры + Процедура СоздатьФайлЗаглушку(Каталог, ИмяФайла) ПолныйПуть = ОбъединитьПути(Каталог, ИмяФайла); Текст = Новый ЗаписьТекста(ПолныйПуть); diff --git "a/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\241.os" "b/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\241.os" index f33742a..ac1150f 100644 --- "a/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\241.os" +++ "b/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\241.os" @@ -339,3 +339,56 @@ Возврат РезультирующийПуть; КонецФункции + +Функция ЭтоАбсолютныйПуть(Знач Путь) Экспорт + Если ЭтоWindows() Тогда + Возврат ЭтоАбсолютныйПутьWindows(Путь); + Иначе + Возврат ЭтоАбсолютныйПутьUnix(Путь); + КонецЕсли; +КонецФункции + +Функция ЭтоАбсолютныйПутьUnix(Знач Путь) Экспорт + Путь = СокрЛП(Путь); + Возврат Лев(Путь, 1) = "/"; +КонецФункции + +Функция ЭтоАбсолютныйПутьWindows(Знач Путь) Экспорт + + Путь = СокрЛП(Путь); + + // UNC + Если СтрНачинаетсяС(Путь, "\\") Тогда + Возврат Истина; + КонецЕсли; + + // C:\ или C:/ + Если СтрДлина(Путь) >= 3 Тогда + ПервыйСимвол = Лев(Путь, 1); + ВторойСимвол = Сред(Путь, 2, 1); + ТретийСимвол = Сред(Путь, 3, 1); + + Если ЭтоДопустимаяБукваДискаWindows(ПервыйСимвол) + И ВторойСимвол = ":" + И (ТретийСимвол = "\" Или ТретийСимвол = "/") Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Функция ЭтоДопустимаяБукваДискаWindows(Символ) + + Код = КодСимвола(Символ); + + Возврат (Код >= КодСимвола("A") И Код <= КодСимвола("Z")) + ИЛИ (Код >= КодСимвола("a") И Код <= КодСимвола("z")); + +КонецФункции + +Функция ЭтоWindows() + Платформа = Новый СистемнаяИнформация().ТипПлатформы; + Возврат Платформа = ТипПлатформы.Windows_x86 Или Платформа = ТипПлатформы.Windows_x86_64; +КонецФункции \ No newline at end of file From 5dd5f90b87a5dc61ca2d06c3c0608db209c1bb9c Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 31 Jan 2026 22:52:42 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=A1=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D0=BC?= =?UTF-8?q?=20=D0=BF=D1=83=D1=82=D1=8C=20=D0=BE=D1=82=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=20=D1=82=D0=B5=D0=BA?= =?UTF-8?q?=D1=83=D1=89=D0=B5=D0=B3=D0=BE=20=D0=B4=D0=B8=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B0=D0=B1=D1=81=D0=BE=D0=BB=D1=8E=D1=82=D0=BD=D1=8B=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "tests/\320\237\321\203\321\202\320\270.os" | 7 ++++--- .../\320\244\320\241.os" | 7 +++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git "a/tests/\320\237\321\203\321\202\320\270.os" "b/tests/\320\237\321\203\321\202\320\270.os" index 18f75f4..e7777a8 100644 --- "a/tests/\320\237\321\203\321\202\320\270.os" +++ "b/tests/\320\237\321\203\321\202\320\270.os" @@ -172,13 +172,15 @@ &Параметры("A:\", Истина) &Параметры("a:\folder", Истина) // строчная буква &Параметры("E:/path/to/file", Истина) +// Абсолютные - Относительно текущего диска +&Параметры("\Windows", Истина) +&Параметры("/Windows", Истина) // Абсолютные - UNC пути &Параметры("\\server\share", Истина) &Параметры("\\server\share\folder\file.txt", Истина) &Параметры("\\192.168.1.1\c$", Истина) &Параметры("\\", Истина) // граничный случай с допущением &Параметры("\\\", Истина) // граничный случай с допущением -&Параметры("\\\\", Истина) // граничный случай с допущением &Параметры("\\server", Истина) &Параметры("\\SERVERNAME\ShareName$\Folder", Истина) // Относительные @@ -187,7 +189,6 @@ &Параметры("..\parent", Ложь) &Параметры("C:", Ложь) &Параметры("C:file.txt", Ложь) -&Параметры("\Windows", Ложь) // относительно текущего диска &Параметры("folder\file.txt", Ложь) &Параметры("..\..\file", Ложь) &Параметры(".\.\file", Ложь) @@ -264,7 +265,7 @@ &Тест #Если Windows Тогда &Параметры("C:\Windows/System32", Истина) -&Параметры("/home", Ложь) +&Параметры("/home", Истина) #Иначе &Параметры("C:\Windows/System32", Ложь) &Параметры("/home", Истина) diff --git "a/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\241.os" "b/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\241.os" index ac1150f..3f73f55 100644 --- "a/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\241.os" +++ "b/\320\234\320\276\320\264\321\203\320\273\320\270/\320\244\320\241.os" @@ -356,15 +356,14 @@ Функция ЭтоАбсолютныйПутьWindows(Знач Путь) Экспорт Путь = СокрЛП(Путь); - - // UNC - Если СтрНачинаетсяС(Путь, "\\") Тогда + ПервыйСимвол = Лев(Путь, 1); + + Если ПервыйСимвол = "\" Или ПервыйСимвол = "/" Тогда Возврат Истина; КонецЕсли; // C:\ или C:/ Если СтрДлина(Путь) >= 3 Тогда - ПервыйСимвол = Лев(Путь, 1); ВторойСимвол = Сред(Путь, 2, 1); ТретийСимвол = Сред(Путь, 3, 1);