Как проверить, существует ли файл в Eiffel - PullRequest
0 голосов
/ 13 декабря 2018
feature 

    open_file_sample
        local
            l_file: UNIX_FILE_INFO
            l_path: STRING
        do
            make
            l_path := "/var/log/syslog"
            l_file.update (l_path)
            if l_file.parent_directory.exists and then l_file.parent_directory.is_writtable then
                create l_file.make
            end
             -- AS the above statement doesn't exist!
            check
                syslog_file_exists_and_is_readable: l_file.exists and then l_file.is_readable
            end
        end

Это правильный способ проверить наличие файлов в Eiffel?

Мне было интересно, есть ли способ не создавать 2 объекта.Я завершу проверку следующим утверждением:

  • определить путь `l_file_path: =" /some/path/with_file.log"
  • проверить, существует ли родительский каталог и имеет ли права назаписать в
  • создать файл журнала

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Проблема при доступе к файловой системе заключается в том, что свойство файла или каталога могло изменяться между временем, когда вы запрашиваете его, и временем, когда вы хотите его использовать (даже если это всего лишь небольшая доля секунды).Из-за этого утверждения в Eiffel вида:

f (a_file: RAW_FILE)
    require
        a_file.is_writable
    do
        a_file.open_write

могут быть нарушены.В библиотеках Gobo Eiffel вместо проверки возможности открытия файла в режиме записи перед фактическим открытием был выбран способ возврата: попробуйте открыть файл и проверить, успешно ли он был открыт.

f (a_pathname: STRING)
    local
        l_file: KL_TEXT_OUTPUT_FILE
    do
        create l_file.make (a_pathname)
        l_file.recursive_open_write
        if l_file.is_open_write then
            -- Write to the file.
            l_file.close
        else
            -- Report the problem.
        end

Обратите внимание, что он использует recursive_open_write, а не только open_write, поэтому также создаются и отсутствующие каталоги в пути.

0 голосов
/ 13 декабря 2018

Вы можете использовать {FILE_UTILITIES} .file_exists (имя_файла)

или (создать {RAW_FILE} .make_with_name (имя_файла)). Существует

0 голосов
/ 14 декабря 2018

Мое окончательное решение следующее, и оно подлежит критике, лично я нахожу его очень сложным по сравнению с языками и библиотеками более низкого уровня (как bash для бывших)

log_file_path: detachable PATH
        -- Attached if can be created
    local
        l_file: UNIX_FILE_INFO
        l_path, l_parent_dir: PATH
        l_fu: FILE_UTILITIES
    do
        create l_fu
        -- Parent directory check
        create l_path.make_from_string ({APP_CONFIGURATION}.application_log_file_path)
        l_parent_dir := l_path.parent
        if not l_fu.directory_exists (l_parent_dir.out) then
            l_fu.create_directory_path (l_parent_dir)
        end
        create l_file.make
        l_file.update (l_parent_dir.out)
        if not l_file.exists or
            l_file.is_access_writable
        then
            io.putstring ("Error: " + log_file_path_string + " parent directory is not writtable and cannot be created")
            check
                parent_dir_exists_and_is_writtable: False
            end
        else
            Result := l_path
        end
    ensure
        file_name_could_be_created: Result /= Void
    end
0 голосов
/ 13 декабря 2018
do
  if not l_file.exists then
    print ("error: '" + l_path + "' does not exist%N")
  else
    ...

Можно что-то похожее на это

...