Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Закрытие файла


Автор: ZBugz 14.8.2011, 14:20
Всем причет. Копирую файл в потоке через TFileStream
Код

IshStream := TFileStream.Create(IshFileName, fmShareDenyNone or fmShareCompat);
ToStream := TFileStream.Create(ToFileName, Acc);
....
В конце 
....
  if ToStream<>nil then FreeAndNil(ToStream);
  if IshStream<>nil then FreeAndNil(IshStream);
....
Далее отсылаю в форму
PostMessage(MainForm.Handle, WM_THREAD_COMPLETE, .....

В форме жду завершения потока и т.д. 
Дык вот, когда поток завершился, хочу скачать еще раз тоже самое, а он, НЕ ВСЕГДА, но вишет что не может получить доступ к файлу ToFileName.
Вроде в моей конструкции, файл 99,9% точно должен быть закрыт.... Но попадаю на эту ошибку.

Тык вопрос, как его принудительно закрыть, что бы уже точно 100% был закрыт моей прогой ? Чужие конечно не в счет.

Автор: ZBugz 16.8.2011, 18:50
Шо, нихто не знам ? smile 

Автор: Snowy 16.8.2011, 19:39
Так в данном коде видно только, что имеется ненужная проверка на nil.
А ошибок из данного кода никаких не следует.
Описание проблемы тоже ясности не привносит.
Так что и сказать нечего...

Автор: rodnover 16.8.2011, 20:58
Код

IshStream := TFileStream.Create(IshFileName, fmShareDenyNone or fmShareCompat);
try
//работаем с блоком
finally
  IshStream.Close;
end;


Хотя, не думаю, что при вызове деструктора этот метод не вызывается.

Автор: ZBugz 17.8.2011, 07:19
Код

Так в данном коде видно только, что имеется ненужная проверка на nil.

Почему не нужная ? Если ошибка будет до создания TFileStream.Create, а тупо принудительно буду делать тому же ToStream.free кого в природе еще нет, то получать ошибку буду.

Код

А ошибок из данного кода никаких не следует.

Ошибок то нету, только не пойму, это система файл не закрывает или это Delphi так работает...

Код

Описание проблемы тоже ясности не привносит.
Так что и сказать нечего...

Качаем файл, останавливаем или ошибка, возобновляем качание сразу же, натыкаюсь на то что конечный файл еще не закрыт... Ошибка, повтор, закачка, все хорошо...

Добавлено через 1 минуту и 27 секунд
Цитата(rodnover @ 16.8.2011,  20:58)
Код

IshStream := TFileStream.Create(IshFileName, fmShareDenyNone or fmShareCompat);
try
//работаем с блоком
finally
  IshStream.Close;
end;


Хотя, не думаю, что при вызове деструктора этот метод не вызывается.

Я перед закачкой проверяю открытие файла.

Я тоже думаю что он отрабатывает IshStream.Close;
Хотя нужно проверить smile 

Автор: rodnover 17.8.2011, 07:23
Цитата

Качаем файл, останавливаем [b]или ошибка[b], возобновляем качание сразу же, натыкаюсь на то что конечный файл еще не закрыт... Ошибка, повтор, закачка, все хорошо.


Из-за этого и нету доступа. Потому что дескриптор не закрыт. Используй блоки try {...} finally {...} end

При возникновении исключение нужно самому освобождать ресурсы.

Автор: Snowy 17.8.2011, 11:41
Цитата(ZBugz @  17.8.2011,  07:19 Найти цитируемый пост)
Почему не нужная ? Если ошибка будет до создания TFileStream.Create, а тупо принудительно буду делать тому же ToStream.free кого в природе еще нет, то получать ошибку буду.
Что такое метод Free? И чем он отличается от Destroy?
Отгадка в любом учебнике...

Автор: ZBugz 18.8.2011, 06:37
Цитата(rodnover @ 17.8.2011,  07:23)
Цитата

Качаем файл, останавливаем [b]или ошибка[b], возобновляем качание сразу же, натыкаюсь на то что конечный файл еще не закрыт... Ошибка, повтор, закачка, все хорошо.


Из-за этого и нету доступа. Потому что дескриптор не закрыт. Используй блоки try {...} finally {...} end

При возникновении исключение нужно самому освобождать ресурсы.

Да, конечно, именно через try делаю, в finally делаю освобождение, потом посылаю всообщение и жду завершение потока. 
Т.е. в теории вообще файл открыт то не должен бы, finally сработал в потоке, да еще жду пока сам поток не завершиться.... А все равно если все шибко быстро сделать, то файл не закрыт...

Добавлено через 4 минуты и 53 секунды
Цитата(Snowy @ 17.8.2011,  11:41)
Цитата(ZBugz @  17.8.2011,  07:19 Найти цитируемый пост)
Почему не нужная ? Если ошибка будет до создания TFileStream.Create, а тупо принудительно буду делать тому же ToStream.free кого в природе еще нет, то получать ошибку буду.
Что такое метод Free? И чем он отличается от Destroy?
Отгадка в любом учебнике...

Я че то не пойму к чему этот разговор ? Контр предложение почитать статью, где написанно кстати и о free и о destroy (http://www.gunsmoker.ru/2009/04/freeandnil-free.html)
Я создаю в потоке 
Код

IshStream := TFileStream.Create(IshFileName, fmShareDenyNone or fmShareCompat);
ToStream := TFileStream.Create(ToFileName, Acc);

В конце делаю
Код

if ToStream<>nil then FreeAndNil(ToStream);
if IshStream<>nil then FreeAndNil(IshStream);

В чем проблема то ? Или что то не корректно в коде ? Или такое типа нельзя делать что ли ?


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)