powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Stream write error при TStringList.SaveToStream
21 сообщений из 21, страница 1 из 1
Stream write error при TStringList.SaveToStream
    #39619394
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В нижеприведенном коде при вызове UOCFGStringList.SaveToStream(Stream); при невыясненных обстоятельствах у некоторых пользователей иногда вылетает ошибка EWriteError с сообщением Stream write error.

И вторая, не связанная с первой, условия те же. При Stream.DisposeOf; (то, что в конце) вылетает EAccessViolation.

Я как только не крутил - не могу представить себе, как и из-за чего это может быть. Может кто-то сталкивался?

P.S. Дополнительные Stream создаются из-за fmShareDenyNone, которого нет в стандартном TStringList.SaveToFile. Т.к. файл с очень большой вероятностью может уже отрыт, то вот так делаю.

P.P.S. с первым стримом, который для чтения - проблем нет вообще.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
var Stream : TStream;

UOCFGStringList := TStringList.Create;
try
  Stream := nil;
  if FileExists(ClientDir + 'uo.cfg') then
    try
      Stream := TFileStream.Create(ClientDir + 'uo.cfg', fmShareDenyNone);
      UOCFGStringList.LoadFromStream(Stream);
    finally
      if Assigned(Stream) then Stream.DisposeOf;
    end;
  i := 0;
  while i < UOCFGStringList.Count do
  begin
    if UOCFGStringList.Strings[i].Contains('AcctID') then
      UOCFGStringList.Delete(i);
    if i >= UOCFGStringList.Count then Break;
    if UOCFGStringList.Strings[i].Contains('AcctPassword') then
      UOCFGStringList.Delete(i);
    if i >= UOCFGStringList.Count then Break;
    //...еще пять таких же
    Inc(i);
  end;

  UOCFGStringList.Add('AcctPassword=' + String(b));
  UOCFGStringList.Add('RememberAcctPW=on');

  try
    try
      if FileExists(ClientDir + 'uo.cfg') then
        Stream := TFileStream.Create(ClientDir + 'uo.cfg',
          fmOpenWrite + fmShareDenyNone)
      else
        Stream := TFileStream.Create(ClientDir + 'uo.cfg',
          fmCreate);
    except
      //обрабатываю ошибку
      Exit;
    end;
    UOCFGStringList.SaveToStream(Stream);
  finally
    if  Assigned(Stream) then Stream.DisposeOf;
  end;
finally
  UOCFGStringList.Free;
end;


На всякий случай приложил 2 репорта от эврики, с 2 ошибками.


Гуглил, в основном все сводится к багам VS и советам проверить хендл файла в process explorer.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619492
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жесть
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619516
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наводящий вопрос: чем FreeAnd Nil отличается от .Free?
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619528
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmokerНаводящий вопрос: чем FreeAnd Nil отличается от .Free?

Во валит, а!
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619542
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmokerНаводящий вопрос: чем FreeAnd Nil отличается от .Free?

если это намек на то, что остается указатель на освобожденный класс остается после первого Stream.DisposeOf; и по какой-то причине не создается заново - так в блоке except для этого и стоит Exit.

Или я что-то не так понял?
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619545
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окей, наводящий вопрос №2: выполняются ли блоки finally при Exit изнутри?
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619547
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*задумался*
Не знаю.
а пойду-ка я проверю.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619548
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r*задумался*
Не знаю.
а пойду-ка я проверю.

занавес
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619554
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r*задумался*
Не знаю.
а пойду-ка я проверю.

Блок finally выполняется всегда.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619794
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понял, спасибо.

Порылся по коду, нашел сходу еще пару сомнительных мест, буду копать дальше.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619833
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

http://www.gunsmoker.ru/2018/03/riddle-23.html

:)

Я говорил, что лучше всегда использовать freeandnil. Даже локально. Но разве кто-то прислушивается? Ну ок, разгребайте баги тогда :)
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619835
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rпонял, спасибо.

Порылся по коду, нашел сходу еще пару сомнительных мест, буду копать дальше.
1-е сомнительное место - в 8-й строчке кода. Она должна быть 6-й. Иначе очень возможно повторное другое исключение.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619855
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot YuRock]Vizit0r1-е сомнительное место - в 8-й строчке кода. Она должна быть 6-й. Иначе очень возможно повторное другое исключение.

уже.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619857
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonVizit0r,

http://www.gunsmoker.ru/2018/03/riddle-23.html

:)

Я говорил, что лучше всегда использовать freeandnil. Даже локально. Но разве кто-то прислушивается? Ну ок, разгребайте баги тогда :)
В коде гансмокера проблема совсем не в отсутствии freeandnil а в кривых блоках try..finally.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619859
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var
  Stream: TFileStream;
begin
  Stream := nil;

  // что-то делаем

  Stream := TFileStream.Create({ ... });
  try
    // что-то делаем
  finally
    Stream.Free;
  end;

  Stream := TFileStream.Create({ ... });
  try
    // что-то делаем
  finally
    Stream.Free;
  end;
end;
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619860
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем необходимость Stream := nil; не очевидна.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39619927
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonVizit0r,

http://www.gunsmoker.ru/2018/03/riddle-23.html

:)

Я говорил, что лучше всегда использовать freeandnil. Даже локально. Но разве кто-то прислушивается? Ну ок, разгребайте баги тогда :)

http://www.nickhodges.com/post/Using-FreeAndNil.aspx

“If your code requires you to use FreeAndNil to reveal and easily find bugs, then your design is wrong. Good, clean code never feels the need to worry about errant pointers.”

Собственно, пример 21282207 это утверждение неплохо иллюстрирует.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39620357
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schi http://www.nickhodges.com/post/Using-FreeAndNil.aspx

“If your code requires you to use FreeAndNil to reveal and easily find bugs, then your design is wrong. Good, clean code never feels the need to worry about errant pointers.”

Собственно, пример 21282207 это утверждение неплохо иллюстрирует.
Это не истина в последней инстанции, а мнение одного Ника, причем очень спорное.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39620380
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий №2,

FreeAndNil - один из инструментов, который помогает чистоте кода в том числе. Нравится людям зомби-ссылки хранить? Ну ок, хорошо :) Главное - что бы никому не навязывали.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39620652
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonFreeAndNil - один из инструментов, который помогает чистоте кода в том числе.
у гансмокера в блобах хорошая статья по этому поводу была. Может Алексей заглянет сюда и кинет ссылкой.
...
Рейтинг: 0 / 0
Stream write error при TStringList.SaveToStream
    #39620653
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докв блобах
зарапортовался :)

... в блогах ...
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Stream write error при TStringList.SaveToStream
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]