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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2017, 15:50   #1
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
Вопрос не закрывается TFileStream

Код:
var
  InFileL,InFileR: TFileStream;
begin
  try
    try
      InFileL:=TFileStream.Create(NameL,fmShareDenyNone);
      InFileR:=TFileStream.Create(NameR,fmShareDenyNone);
  
  //действия с файлами (в частности сравнение контрольных сумм)

    except
      on E: Exception do ShowMessage(E.Message);
    end;
  finally
      FreeAndNil(InFileL);
      FreeAndNil(InFileR);
  end;
Проблема в том, что при открытии второго файла InFileR возникает исключение (не могу получить доступ к файлу, так как он занят другим процессом), которое я вижу в except, и после этого не выполняется FreeAndNil(InFileR);, т.е. на нем тоже возникает исключение.
Что я делаю не так? Во всех примерах в интернете с TFileStream в try выполняется create, а в finally выполняется Free. Собственно Free я тоже пробовал, результат тот же.
fanlis вне форума Ответить с цитированием
Старый 12.09.2017, 17:09   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ну видимо занят монопольно другим приложением. И free или FreeAndNil не нужно если объект не создан, а он и не создается когда исключение при создании
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.09.2017, 17:31   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

или так
Код:
var
  InFileL,InFileR: TFileStream;
begin
try
  InFileL:=TFileStream.Create(NameL,fmShareDenyNone);
  try
    InFileR:=TFileStream.Create(NameR,fmShareDenyNone);
    try
      //действия с файлами (в частности сравнение контрольных сумм)
    finally
       InFileR.Free;
    end;
  finally
    InFileL.Free;
  end;
except
   on E: Exception do ShowMessage(E.Message);
end;
или так

Код:
var
  InFileL,InFileR: TFileStream;
begin
  InFileL:=nil;InFileR:=nil;
  try
    try
      InFileL:=TFileStream.Create(NameL,fmShareDenyNone);
      InFileR:=TFileStream.Create(NameR,fmShareDenyNone);
    //действия с файлами (в частности сравнение контрольных сумм)
    except
      on E: Exception do ShowMessage(E.Message);
    end;
  finally
      FreeAndNil(InFileL);
      FreeAndNil(InFileR);
  end;
а лучше последовательное создание и убийство

Код:
a:=Create
try
  crc(a);
finally
  a.free;
end;
b:=Create
try
  crc(b)
finally
  b.free;
end;
if a<>b .....
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 12.09.2017 в 17:33.
Slym вне форума Ответить с цитированием
Старый 13.09.2017, 01:06   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

2 Slym
Всё бы хорошо, но конструкция
Код:
try
  SomeObject:=TSomeObject.Create();
  ... //что-то делаем
finally
  SomeObject.Free; //FreeAndNil(SomeObject);
бессмысленна и способна только добавить новое исключение.
Ибо если исключение возникает в конструкторе объекта, то объект просто не создаётся. И его не нужно уничтожать.
Т.е. конструкция для временного создания любого объекта с последующим его уничтожением должна выглядеть так:
Код:
SomeObject:=TSomeObject.Create();
try
  ... //деоаем что-то
finally
  SomeObject.Free. //FreeAndNil(SomeObject);
end;
northener вне форума Ответить с цитированием
Старый 13.09.2017, 04:51   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
2 Slym
Всё бы хорошо, но конструкция
Код:
try
  SomeObject:=TSomeObject.Create();
  ... //что-то делаем
finally
  SomeObject.Free; //FreeAndNil(SomeObject);
бессмысленна и способна только добавить новое исключение.
вы забыли SomeObject:=nil;
т.к. переменная в стеке - там мусор и может произойти "Garbage.Free" - AV
но при начальной инициализации нилом все безопасно "nil.Free" - ОК

пруф:
Код:
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
проверка:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var SomeObject:TButton;
begin
  try
    Abort;
    SomeObject:=TButton.Create(nil);
  finally
    SomeObject.Free;//AV
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var SomeObject:TButton;
begin
  SomeObject:=nil;
  try
    Abort;
    SomeObject:=TButton.Create(nil);
  finally
    SomeObject.Free;//нет AV
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var SomeObject:TButton;
begin
  SomeObject:=nil;
  SomeObject.Free;//нет AV
  TObject(nil).Free;// и тут нет AV
end;
PS Я не пропагандирую за такой стиль, но оставляю его возможным
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 13.09.2017 в 05:00.
Slym вне форума Ответить с цитированием
Старый 13.09.2017, 06:37   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Предположение: а у Вас NameL случайно не равно NameR?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 13.09.2017, 08:15   #7
fanlis
Пользователь
 
Регистрация: 13.05.2007
Сообщений: 60
По умолчанию

Нет, NameL <> NameR.
Спасибо за ответы! InFileL:=nil;InFileR:=nil; наверно самый подходящий вариант.
Меня просто насторожило, что практически все примеры в интернете сделаны так, как я сделал вначале. А в итоге получается, что я ловлю исключение, а в итоге исключение же и создаю.
fanlis вне форума Ответить с цитированием
Старый 13.09.2017, 08:25   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от fanlis Посмотреть сообщение
практически все примеры в интернете сделаны так, как я сделал вначале
Плохие примеры ИМХО лучше всё-таки не только на примерах учиться, есть же и нормальные учебники
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 13.09.2017, 09:42   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от fanlis Посмотреть сообщение
Меня просто насторожило, что практически все примеры в интернете сделаны так, как я сделал вначале.
просто прочитайте статью:
90% кода в интернете - говно (Блог GunSmoker-а)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.09.2017, 01:47   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
вы забыли SomeObject:=nil;
Я ничего не забыл, имхо. Это вы невнимательно прочитали мой ответ. В моем коде секция finally выполняется только если объект создан.
northener вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TFileStream Baburek C++ Builder 3 04.07.2013 10:13
Не закрывается форма The SCS Общие вопросы Delphi 4 31.03.2012 14:57
Не закрывается приложение. the_deer_one C# (си шарп) 5 08.06.2011 14:37
Закрывается окно Никита_П Общие вопросы C/C++ 2 27.02.2010 17:22
TFilestream UnD)eaD)Snake Win Api 1 27.09.2007 21:22