Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закрытие файла, Как дождать закрытия файла 
:(
    Опции темы
ZBugz
  Дата 14.8.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Всем причет. Копирую файл в потоке через 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% был закрыт моей прогой ? Чужие конечно не в счет.
PM MAIL   Вверх
ZBugz
Дата 16.8.2011, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Шо, нихто не знам ? smile 
PM MAIL   Вверх
Snowy
Дата 16.8.2011, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Так в данном коде видно только, что имеется ненужная проверка на nil.
А ошибок из данного кода никаких не следует.
Описание проблемы тоже ясности не привносит.
Так что и сказать нечего...
PM MAIL   Вверх
rodnover
Дата 16.8.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Код

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


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

PM MAIL   Вверх
ZBugz
Дата 17.8.2011, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Код

Так в данном коде видно только, что имеется ненужная проверка на 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 
PM MAIL   Вверх
rodnover
Дата 17.8.2011, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Цитата

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


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

При возникновении исключение нужно самому освобождать ресурсы.
PM MAIL   Вверх
Snowy
Дата 17.8.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(ZBugz @  17.8.2011,  07:19 Найти цитируемый пост)
Почему не нужная ? Если ошибка будет до создания TFileStream.Create, а тупо принудительно буду делать тому же ToStream.free кого в природе еще нет, то получать ошибку буду.
Что такое метод Free? И чем он отличается от Destroy?
Отгадка в любом учебнике...
PM MAIL   Вверх
ZBugz
Дата 18.8.2011, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: 6
Всего: 6



Цитата(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);

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


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.