Skip to content

Некорректное/несовместимое поведение функции Файл.Существует() #973

@Mr-Rm

Description

@Mr-Rm

Проверялось пока только для Windows.

Воспроизведение ошибки

Файл=Новый Файл(ИмяФайла);
Результат=Файл.Существует();

В зависимости от имени файла возможно следующее:

  1. Относительные пути
ИмяФайла Результат (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С даёт следующее:
ИмяФайла Результат 1С
"nul" Да
"c:\nul" Да
"\\.\nul" Нет

OScript во всех вариантах рассматривает полное имя \\.\nul и падает с исключением
System.IO.IOException: Синтаксическая ошибка в имени файла, имени папки или метке тома, соответствуя документации .net.

  1. Все прочие исключения
ИмяФайла Результат 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 первыми двумя пунктами надо разбираться вручную. Многие различия связаны с разным поведением свойства Файл.ПолноеИмя.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions