Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 12.09.2017, 16:50   #1
fanlis
Форумчанин
 
Регистрация: 13.05.2007
Сообщений: 56
Репутация: 5
Вопрос не закрывается 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, 18:09   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 16,405
Репутация: 5838
По умолчанию

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

или так
Код:

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 в 18:33.
Slym вне форума   Ответить с цитированием
Старый 13.09.2017, 02:06   #4
northener
Профессионал
 
Регистрация: 15.07.2013
Сообщений: 1,312
Репутация: 379
По умолчанию

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, 05:51   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Адрес: Siberia
Сообщений: 998
Репутация: 602
По умолчанию

Цитата:
Сообщение от 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 в 06:00.
Slym вне форума   Ответить с цитированием
Старый 13.09.2017, 07:37   #6
Sciv
Профессионал
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Адрес: Курган
Сообщений: 2,865
Репутация: 993
По умолчанию

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

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

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

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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 18:22
TFilestream UnD)eaD)Snake Win Api 1 27.09.2007 21:22




16:51.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru