Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Существование файла


Автор: Манкуни@нец 17.5.2005, 10:45
Как можно узнать, существует ли файл, при чём мне нужен не только текстовый но и рисунок.
Знаю что наверное просто, но ненашёл.

Автор: _hunter 17.5.2005, 10:50
FileExists()

Автор: Satana 17.5.2005, 10:53
можешь попробовать открыть его на чтение и если IOResult<>0 то файла нет, а если равен 0 то файл имеется.

Код

AssignFile(f, someFile.<someextension>);
{$I-}
reset(f)
if IOResult=0 then
begin //Файл есть
end
else //Файла нету

Автор: s-mike 17.5.2005, 11:01
Цитата(Satana @ 17.5.2005, 10:53)
можешь попробовать открыть его на чтение и если IOResult<>0 то файла нет, а если равен 0 то файл имеется.

Хм, а смысл?

Автор: ~FoX~ 17.5.2005, 12:50
Путь к файлу и его имя известены?
Ели да, то FindFirs, FindNext и поехали.

Автор: s-mike 17.5.2005, 13:03
Цитата
Ели да, то FindFirs, FindNext и поехали.

FileExists это и делает.

Автор: EKoshelev 17.5.2005, 13:07
~FoX~
А если нет??? КАК БЫТЬ???

Автор: s-mike 17.5.2005, 13:09
Цитата(EKoshelev @ 17.5.2005, 13:07)
А если нет??? КАК БЫТЬ???

Тогда FindFirst вернет код ошибки.

Автор: SoWa 17.5.2005, 13:36
Попробуй обратиться к нему из tru..excepted

Автор: Medved 17.5.2005, 13:49
не надо изобретать велосипед, просто воспользуйтесь как Вам уже посоветовали
Цитата(_hunter @ 17.5.2005, 13:50)
FileExists()

Код


if not FileExists('c:\pegas.exe') then
   begin
      ShowMessage('AAAAAA! Нет файла!!!!');
      exit;
   end;

Автор: Girder 17.5.2005, 15:38
А вот с помощью ентого кода можно проверить... даже такое: Существовал ли файл?
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
 if DeleteFile('E:\Project1.exe') then ShowMessage('Файл существовал!') else
  case GetLastError() of
   Error_File_Not_Found: ShowMessage('Файл не найден!');
   ERROR_PATH_NOT_FOUND: ShowMessage('Путь не найден!');
  else
   ShowMessage('Файл существует!');
  end;
end;


PS: smile


Автор: Poseidon 17.5.2005, 20:26
Girder
http://rulezman.multik.org/3.gif
smile smile smile

Автор: Satana 17.5.2005, 21:15
Цитата(s @ 17.5.2005, 11:01)
Цитата(Satana @ 17.5.2005, 10:53)
можешь попробовать открыть его на чтение и если IOResult<>0 то файла нет, а если равен 0 то файл имеется.

Хм, а смысл?

шо значит а смысл? требовалось определить наличие файла? вот и способ. В этом то и смысл

Автор: s-mike 17.5.2005, 23:37
Цитата(Satana @ 17.5.2005, 21:15)
шо значит а смысл? требовалось определить наличие файла? вот и способ. В этом то и смысл

Я хотел бы узнать преимущества. А то мне кажется, что тот способ все равно, что ехать на Подол через Борщаговку (киевляне поймут).

Кроме того, насколько я понимаю, открытие файла будет длится дольше, чем просто проверка его наличия в каталоге.

Автор: drinkOut 17.5.2005, 23:43
Цитата(s @ 17.5.2005, 13:03)
Цитата
Ели да, то FindFirs, FindNext и поехали.

FileExists это и делает.

Код

function FileExists(const FileName: string): Boolean;
{$IFDEF MSWINDOWS}
begin
  Result := FileAge(FileName) <> -1;
end;
{$ENDIF}
{$IFDEF LINUX}
begin
  Result := euidaccess(PChar(FileName), F_OK) = 0;
end;
{$ENDIF}

Автор: s-mike 17.5.2005, 23:49
drinkOut
Код

function FileAge(const FileName: string): Integer;
{$IFDEF MSWINDOWS}
var
  Handle: THandle;
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
begin
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
      if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
        LongRec(Result).Lo) then Exit;
    end;
  end;
  Result := -1;
end;

smile

Автор: drinkOut 18.5.2005, 00:01
Точняк! smile

Автор: jack128 18.5.2005, 00:20
Satana
Цитата
можешь попробовать открыть его на чтение и если IOResult<>0 то файла нет, а если равен 0 то файл имеется.


если другое приложение открыло файл эксклюзивно, то IOResult <> 0, а файл существует ;)

Автор: Satana 18.5.2005, 07:02
s-mike ну вот этого не знаю, у меня кстати схожий проект есть, поетому пользуюсь тем что предложил _hunter ибо до этого я не знал другого способа кроме того что я предлагал выше.

Автор: ~FoX~ 18.5.2005, 08:05
Цитата(EKoshelev @ 17.5.2005, 14:07)
А если нет??? КАК БЫТЬ???

А если нет, то тогда обсалютно все равно существут он или нет.

Автор: Fantasist 20.5.2005, 23:48
Цитата(Girder @ 17.5.2005, 12:38)
А вот с помощью ентого кода можно проверить... даже такое: Существовал ли файл?


Аааа! Я валялся. smile
Надо в FAQ включить.

Автор: bagira 15.6.2005, 21:48
Цитата(Satana @ 17.5.2005, 10:53)
можешь попробовать открыть его на чтение и если IOResult<>0 то файла нет, а если равен 0 то файл имеется.



AssignFile(f, someFile.<someextension>);
{$I-}
reset(f)
if IOResult=0 then
begin //Файл есть
end
else //Файла нету


Происходит что-то странное - файл на диске точно есть (правда пустой); проверяю пошагово - IOResult выдает не 0 а 32 - я уже второй день так бьюсь smile Ноль никак не получается smile

Мне нужно проверять - если файл есть, то открыть и добавить запись в конце его. Если нет, создать новый, и тоже добавить туда запись.

Автор: Alex 15.6.2005, 22:40
bagira, а FileExists не проще воспользоваться?

Автор: bagira 15.6.2005, 23:11
Цитата(Alex @ 15.6.2005, 22:40)
bagira, а FileExists не проще воспользоваться?

Попробую завтра... Если найду.

Автор: bagira 17.6.2005, 20:04
Спасибо! С FileExists - все получилось, как надо! smile Это моя вечная проблема - не зная, что задача уже решена, начинать какие-то свои собственные изобретения... Я не знала, что такая функция уже есть smile

Но все-таки странно, почему же Reset и IOResult не дали нужного эффекта? Ведь в принципе, тоже все правильно? smile

Автор: Yanis 17.6.2005, 20:36
Цитата(bagira @ 17.6.2005, 20:04)
Но все-таки странно, почему же Reset и IOResult не дали нужного эффекта? Ведь в принципе, тоже все правильно?

Не знаю где тут ошибка, но код 32 это вроде:
Цитата
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом

Автор: p0s0l 17.6.2005, 22:50
Цитата(bagira @ 17.6.2005, 20:04)
Но все-таки странно, почему же Reset и IOResult не дали нужного эффекта? Ведь в принципе, тоже все правильно
Из хелпа:
Цитата
If an I/O error occurs and I/O-checking is off, all subsequent I/O operations are ignored until the internal error flag is cleared. Calling IOResult clears the internal error flag.
Т.е. правильнее было бы так (это на тот случай, если ты где-то делаешь IO-операции, но не проверяешь результат с помощью IOResult):
Код
IOResult; // сброс флага ошибки, если она была
AssignFile(f, someFile.<someextension>); 
{$I-} 
reset(f)
if IOResult=0 then 
begin //Файл есть 
end 
else //Файла нету


Автор: bagira 17.6.2005, 23:10
Цитата(Yanis @ 17.6.2005, 20:36)
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом

smile Но реально файл ничем не был занят smile

p0s0l
Спасибо, возьму на вооружение.

Автор: RA 18.6.2005, 00:09

Цитата(bagira @ 17.6.2005, 23:10)
Но реально файл ничем не был занят

Ну раз так тогда попробуй на всякий случай после AssignFile
написать
FileMode:=$0030;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)