-
Notifications
You must be signed in to change notification settings - Fork 115
Description
Проверялось пока только для Windows.
Воспроизведение ошибки
Файл=Новый Файл(ИмяФайла);
Результат=Файл.Существует();В зависимости от имени файла возможно следующее:
- Относительные пути
| ИмяФайла | Результат (1С) | Результат (OS) | ПолноеИмя (OS) |
|---|---|---|---|
| "c:windows" | Нет | Да | "C:\windows" |
| "windows" | Нет | Нет | "С:\Program Files\OneScript\bin\windows" (каталог oscript.exe, не файла скрипта) |
При этом для 1С в обоих вариантах ПолноеИмя == ИмяФайла, а поиск идёт в каталоге C:\Program Files\1cv8\common. Вместо любого Нет может оказаться и Да.
Поиск на дисках, отличных от того, на котором расположен рабочий каталог программы производится в текущем каталоге соответствующего диска.
Варианты без пути и с пробелами:
| ИмяФайла | Результат (1С) | ПолноеИмя (1С) | Результат (OS) | ПолноеИмя (OS) |
|---|---|---|---|---|
| "C: " | Да | "C:" | Да | "c:\Program Files\OneScript\bin" |
| " C:" | Нет | "sfile://sfile:// C:" | Да | "c:\Program Files\OneScript\bin" |
| " C:" (два пробела в начале) | Нет | "sfile://sfile:// C:" | Нет (а может и Да) | "c:\Program Files\OneScript\bin\C" (!) |
Полученное ПолноеИмя в последней строке - это баг функции System.IO.Path.GetFullPath() в .Net Framework версий с 4 по 4.6.1 включительно.
А вот это похоже на баг и в 1С:
| ИмяФайла | Результат (1С) | ПолноеИмя (1С) | Результат (OS) | ПолноеИмя (OS) |
|---|---|---|---|---|
| "\..\.." | Нет | "" | Да | "c:" |
| "..\.." | Нет | "" | Да | "c:\Program Files" |
| "\." | Нет | "" | Да | "c:" |
| "." | Нет | "" | Да | "c:\Program Files\OneScript\bin" |
| "c:." | Да | "c:" | Да | "c:\Program Files\OneScript\bin" |
| "c:..\.." | Да | "c:" | Да | "c:\Program Files" |
- Имя файла - предопределённое устройство
1С даёт следующее:
| ИмяФайла | Результат 1С |
|---|---|
| "nul" | Да |
| "c:\nul" | Да |
| "\\.\nul" | Нет |
OScript во всех вариантах рассматривает полное имя \\.\nul и падает с исключением
System.IO.IOException: Синтаксическая ошибка в имени файла, имени папки или метке тома, соответствуя документации .net.
- Все прочие исключения
| ИмяФайла | Результат OS |
|---|---|
| "c:*" | System.ArgumentException: Illegal characters in path |
| "file://c:/windows" | System.ArgumentException: URI formats are not supported |
| "\\.\c:\windows" | System.NotSupportedException): The given path's format is not supported |
| "\\OtherComp\WrongShare" | System.IO.IOException: Не найдено сетевое имя |
| "\\Inaccessible\RealShare" | System.IO.IOException: Не найден сетевой путь |
| "\\Nonexistent\Any" | System.IO.IOException: Указан недопустимый путь |
| "СлишкомДлинноеИмяФайла" (>260 символов) | System.IO.PathTooLongException: The specified path, file name, or both are too long. |
"c:\tmp\denied\test" (доступ к denied запрещён) |
System.UnauthorizedAccessException: Access to the path 'c:\tmp\denied\test' is denied |
Результат 1С всегда Нет, без исключений.
От большей части исключений можно избавиться, используя File.Exists() и Directory.Exists() вместо File.GetAttributes().
C первыми двумя пунктами надо разбираться вручную. Многие различия связаны с разным поведением свойства Файл.ПолноеИмя.