Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2012, 18:20   #1
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию Паскаль. Работа с файлами. Проверка файла на существование.

Доброго времени суток. Данный код реализует задачу " определить равны ли 2 заданных файла" Как в процедуре записи в файл осуществить проверку на существование файла?...тобишь вводим имя файла в который записать, но если он уже существует, то спрашиваем у пользователя как дальше быть....перезаписать файл, или ввести новое имя...как это реализовать?
Код:
program two_files;

var
  f1, f2: text;
  File1NotExist, File2NotExist,Live: boolean;
  rezult: string;

{----------------------------------------------------------------------}

procedure inputtrace(var f: text; var Exist: boolean);
var

  inp,v: string;
  code,outh:integer;
  
begin
  repeat
  
  repeat
  writeln('Введите путь к файлу: ');
  readln(inp);
  until(inp <> '');
  begin
  assign(f, inp);
  Exist := true;
  if FileExists(inp)=false then
  begin
    repeat
    writeln('Ошибка, файл не найден!  ');
    writeln('Нажмите 1 для выхода из программы, или 2 для повтора ввода');
    readln(v);
    val(v,outh,code);
    if outh=1 then exist:=false;
    if outh=2 then exist:=true;
    until (outh=1)or(outh=2);
  end;
  end;
  until (FileExists(inp)=true)or(Exist=false);
end;

{----------------------------------------------------------------------}
function sravnenie(var a, b: text): boolean;
var
  s1, s2: string;
  EqFiles: boolean;
begin
  reset(a);
  reset(b);
  EqFiles := true;
  while (not eof(a)) and (not eof(b)) do
  begin
    Readln(a, s1);
    Readln(b, s2);
    if (s1 <> s2) or (eof(a) xor eof(b)) then
      EqFiles := false;
  end;
  sravnenie := EqFiles;
end;


{----------------------------------------------------------------------}
procedure write_to_the_file(var w: string);
var
  itog_file: text;
  inp_itog: string;
begin
   if sravnenie(f1, f2) then
    w := 'Содержимое файлов одинаково '
  else
    w := 'Содержимое файлов различно ';
    writeln(w);
  repeat
  write('Введите путь к файлу: ');
  readln(inp_itog);
  until(inp_itog <> ''); 
  assign(itog_file, inp_itog);
  rewrite(itog_file);
  write(itog_file, w);
  close(itog_file);
end;

{----------------------------------------------------------------------}
begin
  writeln('Программа позволяет сравнить содержимое двух файлов');
  inputtrace(f1, File1NotExist);
  if  File1NotExist then
  inputtrace(f2, File2NotExist);
  if  File2NotExist then
    writeln('Результат работы программы будет отображен на экране, а затем записан в файл ');
  write_to_the_file(rezult);
  Close(f1);
  Close(f2);
  readln;
end.
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 21.03.2012, 21:18   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,331
По умолчанию

В Паскале есть модуль WinDos с функциями поиска каталогов и файлов.
Но вероятно можно использовать и это:
Код:
{$I-}  {Берём контроль ошибок ввода-вывода на себя}
assign(fh, "filename");
reset(fh);
{$I+}   {Возвращаем контроль ошибок ввода-вывода в программу}
If IOResult <> 0 then {файл не существует}
...
Как то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 21.03.2012, 21:31   #3
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Но ведь функция reset открывает файл для чтения...а это бессмысленно делать здесь, т.к. я ничего не считываю с файла а наоборот для записи открываю.
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 21.03.2012, 21:52   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А по-моему проще так:
Код:
var sr:SearchRec;
...
if FindFirst(inp,faanyfile,sr)
if DosError=0 then файл существует
Идея понятна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.03.2012, 21:57   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,331
По умолчанию

Да! Вы правы, ежели рассуждать так.
Но ведь Вы желаете знать: "А такой файл существует?"

Это можно сделать такой процедурой, которая не испортит файл.
Т.е. предлагается проверить открывая файл на чтение.

Если файл откроется, то мы его закроем и предупредим пользователя, попросив подтвердить перезапись файла или ввести новое имя.
Запрос типа: "Файл <имя файла> уже существует. Перезаписать? ([Y], N)"

- Проверяем только ввод "N" или "n". Если пользователь не согласен с перезаписью, то возвращаемся на ввод нового имени файла, а иначе открываем файл на запись.

Так что так тоже можно (я так и делаю иногда) ...

Stilet предлагает использовать библиотеку. Это будет получше, но необходимо подключить WinDos, как было сказано ранее.
Как-то так, ...

Последний раз редактировалось ViktorR; 21.03.2012 в 22:03.
ViktorR вне форума Ответить с цитированием
Старый 21.03.2012, 22:27   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Это можно сделать такой процедурой, которая не испортит файл.
Кстати это бородатый трюк... Если память не изменяет первые программы на проверку файлов в ранних версиях паскаля именно так и работали (да и сам FindFirst так поступал, после 5-й версии его изменили)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.03.2012, 18:29   #7
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Всем спасибо что откликнулись, разобрался)
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка на существование диска IvanPo Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 27.05.2011 07:53
Проверка на существование файлов Vohakisa Помощь студентам 5 01.06.2010 16:40
Проверка на существование графического файла, false - скачать с сервера kotzzz Общие вопросы Delphi 7 22.01.2010 13:10
проверка на существование папки D_E_N Общие вопросы Delphi 3 05.10.2009 22:48
Проверка на существование Lonix Общие вопросы Delphi 2 19.03.2007 19:42