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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2018, 23:44   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Append – почему не работает “if”, а работает “try”

Доброе время суток,

Есть

Код:
var
  LConnectFile: TextFile;
  LFile: string;
  begin
   LFile := 'D:\1.txt';
   AssignFile(LConnectFile, LFile);

   if FileExists(LFile) then
     showmessage('file exsist')
     …
сообщение 'file exsist' выпадает.

А при

Код:
if FileExists(LFile) then
  Append(LConnectFile)
При отладке, эта строка просто ПРОПУСКАЕТСЯ? (хотя файл существует)

Нужно пользоваться конструкцией

Код:
try
  Append(LConnectFile); 
  WriteLn(LConnectFile, 'добавление в файл');      
except
on e: EInOutError do
  showmessage('not exsist');
end;
closefile(LConnectFile);
end;
а мне нужно проверить существование файла, если он есть, то дополнить, а если не то создать новый

заранее спасибо

Последний раз редактировалось KBO; 11.01.2018 в 01:02.
KBO вне форума Ответить с цитированием
Старый 11.01.2018, 07:48   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Судя по всему, в первом случае у Вас файл действительно существует (и кстати, Ассайн нужно делать после проверки на существование, а не до, а то падать будет раньше).

В остальных случаях, судя по поведению, программа не может найти файл. Соответственно, с ифом она игнорирует аппенд, так как условие не проходит, а с траем обрабатывает исключение. Поскольку полного кода для этих случаев Вы не привели - дальше остаётся только гадать, почему файл не находится
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 11.01.2018, 10:24   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
(и кстати, Ассайн нужно делать после проверки на существование, а не до, а то падать будет раньше)
на AssignFile падать не должно - иначе как бы можно было вызвать Rewrite() ?
можно легко проверить:
Код:
var
  myFile : TextFile;
begin
  // Попытка открыть файл NewTest.txt для записи
  AssignFile(myFile, 'NewTest.txt');
  ReWrite(myFile);

  // Закрытие файла
  CloseFile(myFile);
end.
но, чтобы говорить, что не так у TC, я бы действительно хотел увидеть весь код полностью.

Пока, могу только предположить, что файл просто не закрывается и хендл остаётся захваченным. Поэтому и не срабатывает Append()
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.01.2018, 15:45   #4
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 979
По умолчанию

хмм если не путаю то AssignFile это не открытие файла, а связывание файловой переменной с определённым путём файла.
в итоге тебе этот код надо? тут if пропускает или нет?

Код:
var
  LConnectFile: TextFile;
  LFile: string;
begin
   LFile := 'D:\1.txt';
   AssignFile(LConnectFile, LFile);
   if FileExists(LFile) then
     Append(LConnectFile)
   else
     ReWrite(LConnectFile);
   WriteLn(LConnectFile, 'добавление в файл');
   CloseFile(LConnectFile);
end;
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 11.01.2018 в 15:50.
IliaIT вне форума Ответить с цитированием
Старый 11.01.2018, 18:15   #5
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Вот пожалуйста, полный код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  LConnectFile: TextFile;
  LFile: string;
begin
  LFile := 'D:\1.txt';
  AssignFile(LConnectFile, LFile);

  if FileExists(LFile) then
    showmessage('exsist');
        
  if FileExists(LFile) then
    Append(LConnectFile) 
  else showmessage('not exsist');
end;
заходит на строку "showmessage('exsist');", т.к. файл действительно существует.
А при втором варианте ("F8") строку "Append(LConnectFile)" пропускает
KBO вне форума Ответить с цитированием
Старый 11.01.2018, 18:49   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Действительно, визуально при отладке он пропускает строку, но если сделать F7, то станет понятно, что он заходит в Append. Не знаю, с чем связан такой визуальный баг. Если добавить begin..end, то не будет "пропускать".
Код:
var
  LConnectFile: TextFile;
  LFile: string;
begin
  LFile := 'E:\test.txt';
  AssignFile(LConnectFile, LFile);

  if FileExists(LFile) then
    showmessage('exsist');

  if FileExists(LFile) then begin
    Append(LConnectFile);
  end else showmessage('not exsist');
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.01.2018 в 18:55.
BDA на форуме Ответить с цитированием
Старый 12.01.2018, 02:30   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от KBO Посмотреть сообщение
заходит на строку "showmessage('exsist');", т.к. файл действительно существует.
А при втором варианте ("F8") строку "Append(LConnectFile)" пропускает
Это весьма старая недоработка отладчика. В первом случае выполняется весьма существенное для отладки действие. А именно показывается showmessage. Пропустить эту строку отладчик "по определению" не может.
А во втором варианте строка
Цитата:
Сообщение от BDA Посмотреть сообщение
Append(LConnectFile)
ничего особенного не делает с точки зрения отладчика. Она лишь продолжение строки
Код:
if FileExists(LFile) then
northener вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему прсер работает на одних сайтах и не работает на других PHP_DELETANT PHP 4 12.02.2016 13:45
Здравствуйте ! в чем проблема,почему почему время исполнения операций не работает ? ion leahu Помощь студентам 6 23.11.2014 19:36
Почему программа на С++ не работает с локальным описанием массива, но работает с глобальным? >>STINGER<< Помощь студентам 4 08.03.2011 09:56
почему интеренет на Xp не работает, а на семерке работает Lenura Windows 18 04.10.2010 12:04
Почему не работает тег align=right?valign работает а align нет! aviv HTML и CSS 5 21.01.2009 17:46