Обходимся без SysUtils. FileExists
В комментарии к IntToStr, StrToInt, TryStrToInt без использования SysUtils пользователь с ником fry предложил мне функцию FileExists.
Я позволил себе её немного сократить, но смысл остался — мы пытаемся открыть файл, если возвращается ошибка (HFILE_ERROR, что есть -1), то скорее всего это из-за того, что файла нет. Если не ошибка, то возвращается handle открытого файла — для дальнейшей с ним работы.
Итак,
function FileExists(param: string): boolean; begin Result:=(_lopen(PChar(param), OF_SHARE_COMPAT) <> HFILE_ERROR); end;
Если handle файла не HFILE_ERROR, то True, иначе False. Единственное, меня здесь смущает одна вещь — открыли мы файл, если он есть, а закрыть и забыли, закрывать надо аналогичной функцией _lclose.
Вот немного модифицированный вариант, рекомендую его:
function FileExists(param: string): boolean; var h: integer; begin h:=_lopen(PChar(param), OF_SHARE_COMPAT); Result:=(h <> HFILE_ERROR); if Result then _lclose(h); end;
Еще хочется добавить, что раньше я тоже был в поисках такой функции, и вот мой собственный вариант:
function FileExists(FileName:string):boolean; var FindData: TWin32FindData; begin Result:=(FindFirstFile(PChar(FileName),FindData) <> INVALID_HANDLE_VALUE); end;
Здесь, в отличие от предыдущих вариантов, мы не открываем файл, мне кажется так оптимальнее.
Все функции рабочие, все используют библиотеку kernel32.
С наилучшими пожеланиями, (c) crystalbit, http://parsers.info
Спасибо саноффке за клёвую картинку.
А еще подпишись на rss, отпишись в комментариях, что думаешь по этому поводу и не хмурься ;)
Хорошо, когда есть компьютер, на котором так нужные программы работают без глюков, летают, можно сказать. Можно быстро запустить компиляцию, проверить, как оно работает… А если комп зависает, какой от этого прок? Может быть, как выход, — аренда компьютеров и их обслуживание?
Вариант через FindFirstFile и реализация в sysUtils имеют недостаток. Функция FileExists(‘C:\*.*’) вернет true.
Вариант через _lopen скорее всего вернет false если пытаться проверить существующий, но заблокированный на чтение и запись файл
Полезное замечание, спасибо