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, отпишись в комментариях, что думаешь по этому поводу и не хмурься ;)

Хорошо, когда есть компьютер, на котором так нужные программы работают без глюков, летают, можно сказать. Можно быстро запустить компиляцию, проверить, как оно работает… А если комп зависает, какой от этого прок? Может быть, как выход, — аренда компьютеров и их обслуживание?