Важная информация
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 17

Тема: Помогите сделать проверку наличия файла

  1. #1 Помогите сделать проверку наличия файла 
    Новичок
    Регистрация
    16.08.2011
    Сообщений
    17
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях
    Нужен способ проверки наличия файла на диске. Если он есть, то открыть его. Если же его нет, то выдать ошибку "Файл не найден". Метод с LOF=0 не подходит.
    Может кто-нибудь помочь?
    Ответить с цитированием  
     

  2. #2  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Я всегда пользовался именно LOF в связке с APPEND.
    Код :
    OPEN K$ FOR APPEND AS #1
    IF LOF(1) < 1 THEN CLOSE #1: 'Такого файла нет, нужно дополнительно сделать KILL чтобы удалить его.
    CLOSE #1
    Если этот способ не годится, можно воспользоваться функцией DIR$ - однако она доступна лишь с QB 7.1 PDS.
    Вот синтаксис этой функции:
    Цитата Сообщение от QB 7.1 HELP
    DIR$ returns a filename that matches the specified pattern.

    DIR$[(filespec$)]
    ю BASIC generates the error message, "Illegal Function Call" if you
    don't specify a filespec$ when you first call DIR$.

    Usage Notes
    ю DIR$ returns the first filename that matches the filespec$ you
    specify. To retrieve additional filenames that match the filespec$
    pattern, call DIR$ again with no argument. When no filenames match,
    DIR$ returns a null string.
    ю You do not have to retrieve all the filenames that match a given
    filespec$ before calling DIR$ again with a new filespec$.
    ю DIR$ is not case sensitive. "C" is the same as "c."
    Тоесть, файл будет присутствовать на диске, если DIR$(FileName$) = FileName$. Также с помощью DIR$ можно искать файлы по маске.

    Также, если использование QB 7.1 нежелательно, можно использовать функцию Call Absolute с инлайн-вставками для вызова прерываний DOS и использования функций самой DOS ( у нее есть удобные функции вроде FindFirst-FindNext). Однако этот способ предполагает некоторого шаманства с машинным кодом и структурами данных, используемыми DOS =)
    Последний раз редактировалось Абадябер; 06.09.2011 в 02:20.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  3. #3  
    Новичок
    Регистрация
    16.08.2011
    Сообщений
    17
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях
    Ладно, это не очень важно. А вот если посоветуете способ перемещать позицию чтения в файле построчно (например мне надо прочитать пятую и двадцать третью строчки из файла), то буду вам очень благодарен.
    Ответить с цитированием  
     

  4. #4  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Вот довольно грубая, но рабочая функция для QB. Она не перемещает позицию, а вместо этого каждый раз начинает читать файл с самого начала.
    Функция принимает в FD номер файла, а в Ln номер строки, которую нужно прочитать. Содержимое строки и возвращает, тоесть Print ReadLine$(1, 1) напечатает первую строку из файла, открытого с идентификатором 1. В случае, если количество строк в файле меньше, чем запрошеннный в Ln номер строки, функция вернет пустую строку. Файл из которого будет производиться чтение должен быть открыт с помощью INPUT. Способ не очень быстрый, но вполне рабочий. Теоретически, ее можно ускорить, если сохранять предудыщую прочитанную строку в статической переменной. Это поможет читать файл построчно более быстро.
    Код qbasic:
    [Ссылки могут видеть только зарегистрированные пользователи. ] FUNCTION ReadLine$ (FD [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ], LN [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ])
    [Ссылки могут видеть только зарегистрированные пользователи. ] F [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ]
    F = 1
    [Ссылки могут видеть только зарегистрированные пользователи. ] "TASK4.BAS" FOR [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ] F
    [Ссылки могут видеть только зарегистрированные пользователи. ] ReadLine$(F, 3)  'Читаем третюю строку из файла TASK4.BAS
    [Ссылки могут видеть только зарегистрированные пользователи. ] F
     
    FUNCTION ReadLine$ (FD [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ], LN [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ])
        [Ссылки могут видеть только зарегистрированные пользователи. ] LineNum [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ]
        [Ссылки могут видеть только зарегистрированные пользователи. ] CurLine$
        CurLine$ = ""
        [Ссылки могут видеть только зарегистрированные пользователи. ] FD, 1
        FOR LineNum = LN TO 1 STEP -1
            IF [Ссылки могут видеть только зарегистрированные пользователи. ](FD) THEN
                ReadLine$ = ""
                [Ссылки могут видеть только зарегистрированные пользователи. ] FUNCTION
            [Ссылки могут видеть только зарегистрированные пользователи. ] IF
            [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ] #FD, CurLine$
        NEXT LineNum
        ReadLine$ = CurLine$
    [Ссылки могут видеть только зарегистрированные пользователи. ] FUNCTION
    Дружба-магия-радость!
    Ответить с цитированием  
     

  5. #5  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Вот оптимизированынй вариант функции, предложенной выше. Правила использования такие же, разве что теперь при последовательном чтении файла (первый цикл FOR) скорость работы будет намного выше - я провел оптимизацию, о которой говорил. На ошибки проверил, вроде все хорошо. Единственное, если собираетесь использовать ее на разных файлах - то перед сменой файла сделайте ReadLine$(старый_файл, 1). Тогда все должно быть нормально.

    Код qbasic:
    [Ссылки могут видеть только зарегистрированные пользователи. ] FUNCTION ReadLine$ (FD [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ], LN [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ])
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    [Ссылки могут видеть только зарегистрированные пользователи. ] F [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ], I [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ]
    F = 1
    [Ссылки могут видеть только зарегистрированные пользователи. ] "TASK4.BAS" FOR [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ] F
    FOR I = 1 TO 20
        [Ссылки могут видеть только зарегистрированные пользователи. ] ReadLine$(F, I)  'Читаем первые 20 строк файла последовательно. Скорость чтения будет достаточно резвой.
    NEXT I
    FOR I = 20 TO 1 STEP -1
        [Ссылки могут видеть только зарегистрированные пользователи. ] ReadLine$(F, I); 'Читаем 20 строк файла, но задом наперед. Скорость чтения будет медленнее, чем первый цикл.
    NEXT I
    [Ссылки могут видеть только зарегистрированные пользователи. ] F
     
    FUNCTION ReadLine$ (FD [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ], LN [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ])
        [Ссылки могут видеть только зарегистрированные пользователи. ] LastLine [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ]
        [Ссылки могут видеть только зарегистрированные пользователи. ] LineNum [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ]
        [Ссылки могут видеть только зарегистрированные пользователи. ] CurLine$
        CurLine$ = ""
        LineNum = LN
        IF LastLine <= LN THEN
            LineNum = LineNum - LastLine
        ELSE
            [Ссылки могут видеть только зарегистрированные пользователи. ] FD, 1
        [Ссылки могут видеть только зарегистрированные пользователи. ] IF
        
        FOR LineNum = LineNum TO 1 STEP -1
            IF [Ссылки могут видеть только зарегистрированные пользователи. ](FD) THEN
                ReadLine$ = ""
                [Ссылки могут видеть только зарегистрированные пользователи. ] FUNCTION
            [Ссылки могут видеть только зарегистрированные пользователи. ] IF
            [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ] #FD, CurLine$
        NEXT LineNum
        ReadLine$ = CurLine$
           
        LastLine = LN
    [Ссылки могут видеть только зарегистрированные пользователи. ] FUNCTION
    Дружба-магия-радость!
    Ответить с цитированием  
     

  6. #6  
    Новичок
    Регистрация
    16.08.2011
    Сообщений
    17
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях
    Я так и знал. Но в любом случае спасибо за старания!
    Ответить с цитированием  
     

  7. #7  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Да незачто) Самому интересно. Вот разве что, что именно вы знали? Что я буду использовать именно такой алгоритм? В принципе, это вполне разумно, поскольку других способов чтения файла QB не предоставляет. Можно читать файл и в двоичном режиме с помощью команд GET, однако суть все равно останется той-же: мы не знаем, сколько строк в файле и какой они длины, до тех пор, пока не прочитаем все строки файла. Этот алгоритм в принципе, можно еще оптимизировать - например, сразу же после открытия просканировать весь файл, и записать позицию начала каждой строки в массив. По памяти будет затратно, да и открываться файл будет гораздо медленнее, однако работать функции чтения строк будут гораздо быстрее, и скорость их работы не будет зависить от метода чтения.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  8. #8  
    Новичок
    Регистрация
    16.08.2011
    Сообщений
    17
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях
    Цитата Сообщение от Абадябер Посмотреть сообщение
    Вот разве что, что именно вы знали?
    То, что прыгать со строки на строку можно только с помощью INPUT'а, записанного в цикле.
    Ответить с цитированием  
     

  9. #9  
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Цитата Сообщение от Black Doomer Посмотреть сообщение
    А вот если посоветуете способ перемещать позицию чтения в файле построчно.
    В порядке обсуждения: Если ОЧЕНЬ нужно читать данные из файла в произвольном порядке, то наверное следует применять файлы базы данных, ну и уж тогда чтение и запись абсолютно произвольны.
    От себя добавлю, что как не страшно это звучит, хранить данные в базе данных очень удобно.
    Ответить с цитированием  
     

  10. #10  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,879
    Сказал(а) спасибо
    1,829
    Поблагодарили 957 раз(а) в 816 сообщениях
    Записей в блоге
    1
    OPEN K$ FOR APPEND AS #1
    IF LOF(1) < 1 THEN CLOSE #1: 'Такого файла нет, нужно дополнительно сделать KILL чтобы удалить его.
    CLOSE #1
    Лучше делать прерыванием на ошибку, т.к. файл в вашем случае может существовать, но нулевой.
    Вот как правильно:
    Код :
    CLS
    MyFL$ = "My_File.txt"
    ON ERROR GOTO FLErr    ' Ставим прерывание на ошибку
      Svob = FREEFILE      ' ID свободного файла
      Exist = 1      '  Изначально "полагаем", что файл существует
     
        OPEN "I", Svob, MyFL$      ' Пытаемся открыть
        IF Exist THEN      ' файл присутствует
          ' Закроем режим чтения
          CLOSE Svob
            OPEN "B", Svob, MyFL$  ' Откроем так, как нам нужно,
                                   ' к примеру режим BINARY
               '      . . .
               '  Работа с файлом
               '      . . .
     
            CLOSE Svob             ' Закроем
        ELSE PRINT "FILE NOT EXIST!!!"      ' Файла нет
        END IF
    CLOSE #1
    ON ERROR GOTO 0        ' Снимаем прерывание
     
     
    END   ' Конец программы
          ' Если файл отсутствует, то
          ' выполнится данный код
    FLErr: Exist = 0: RESUME NEXT

    Также, если использование QB 7.1 нежелательно, можно использовать функцию Call Absolute с инлайн-вставками для вызова прерываний DOS и использования функций самой DOS ( у нее есть удобные функции вроде FindFirst-FindNext). Однако этот способ предполагает некоторого шаманства с машинным кодом и структурами данных, используемыми DOS =)
    Я уже выкладывал это, ради проверки присутствия файла это на мой взгляд весьма накладно и по коду и по памяти и по проц. времени.
    Ответить с цитированием  
     

Страница 1 из 2 12 ПоследняяПоследняя
Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Как сделать .swf как фон сайта?
    от Vladislav в разделе HTML, CSS
    Ответов: 1
    Последнее сообщение: 23.10.2012, 20:54
  2. Сделать сайт видимым в Интернете Apache2
    от Dispetcher14 в разделе Софт
    Ответов: 2
    Последнее сообщение: 15.05.2012, 19:34
  3. Как в PHP извлечь имя файла?
    от 93RED94 в разделе PHP
    Ответов: 6
    Последнее сообщение: 21.11.2011, 16:38
  4. Ответов: 3
    Последнее сообщение: 20.11.2011, 11:52
  5. Ответов: 16
    Последнее сообщение: 03.11.2011, 21:50
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •