Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions tests/Пути.os
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,122 @@

КонецПроцедуры

&Тест
// Абсолютные - буква диска
&Параметры("C:\", Истина)
&Параметры("C:\Windows", Истина)
&Параметры("C:\Program Files\", Истина)
&Параметры("D:\Data\file.txt", Истина)
&Параметры("C:/", Истина)
&Параметры("C:/Windows/System32", Истина)
&Параметры("Z:\folder", Истина)
&Параметры("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", Истина)
// Относительные
&Параметры("Windows\System32", Ложь)
&Параметры(".\file.txt", Ложь)
&Параметры("..\parent", Ложь)
&Параметры("C:", Ложь)
&Параметры("C:file.txt", Ложь)
&Параметры("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", Истина)
#КонецЕсли
Процедура Тест_ЭтоАбсолютныйПуть(Путь, ЭтоАбсолютный) Экспорт

Ожидаем.Что(лФС.ЭтоАбсолютныйПуть(Путь)).Равно(ЭтоАбсолютный);

КонецПроцедуры

Процедура СоздатьФайлЗаглушку(Каталог, ИмяФайла)
ПолныйПуть = ОбъединитьПути(Каталог, ИмяФайла);
Текст = Новый ЗаписьТекста(ПолныйПуть);
Expand Down
52 changes: 52 additions & 0 deletions Модули/ФС.os
Original file line number Diff line number Diff line change
Expand Up @@ -339,3 +339,55 @@
Возврат РезультирующийПуть;

КонецФункции

Функция ЭтоАбсолютныйПуть(Знач Путь) Экспорт
Если ЭтоWindows() Тогда
Возврат ЭтоАбсолютныйПутьWindows(Путь);
Иначе
Возврат ЭтоАбсолютныйПутьUnix(Путь);
КонецЕсли;
КонецФункции

Функция ЭтоАбсолютныйПутьUnix(Знач Путь) Экспорт
Путь = СокрЛП(Путь);
Возврат Лев(Путь, 1) = "/";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Считать ли абсолютными путями пути с ".." в теле?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если начинаются с корня, то да, конечно.

КонецФункции

Функция ЭтоАбсолютныйПутьWindows(Знач Путь) Экспорт

Путь = СокрЛП(Путь);
ПервыйСимвол = Лев(Путь, 1);

Если ПервыйСимвол = "\" Или ПервыйСимвол = "/" Тогда
Возврат Истина;
КонецЕсли;

// C:\ или C:/
Если СтрДлина(Путь) >= 3 Тогда
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если не ошибаюсь, винда тоже считает начальный слеш абсолютным путем. Путь, начинающийся со слэша винда воспринимает как путь относительно корня "текущего" диска

C:\Users\user>cd /Desktop
The system cannot find the path specified.

а вот относительно корня диска (срабатывает, как корневой путь от текущего диска)

C:\Users\user>cd /Users/user/Desktop
C:\Users\user\Desktop>

переключаемся на диск D: и уже не найдет

C:\Users\user\Desktop>D:
D:\>cd /Users/user/Desktop
The system cannot find the path specified.

ВторойСимвол = Сред(Путь, 2, 1);
ТретийСимвол = Сред(Путь, 3, 1);

Если ЭтоДопустимаяБукваДискаWindows(ПервыйСимвол)
И ВторойСимвол = ":"
И (ТретийСимвол = "\" Или ТретийСимвол = "/") Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;

Возврат Ложь;

КонецФункции

Функция ЭтоДопустимаяБукваДискаWindows(Символ)

Код = КодСимвола(Символ);

Возврат (Код >= КодСимвола("A") И Код <= КодСимвола("Z"))
ИЛИ (Код >= КодСимвола("a") И Код <= КодСимвола("z"));

КонецФункции

Функция ЭтоWindows()
Платформа = Новый СистемнаяИнформация().ТипПлатформы;
Возврат Платформа = ТипПлатформы.Windows_x86 Или Платформа = ТипПлатформы.Windows_x86_64;
КонецФункции