Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Evg
Эксперт CАвтор FAQ
21160 / 8176 / 628
Регистрация: 30.03.2009
Сообщений: 22,475
Записей в блоге: 30
1

Про-блема с удалением файла после работы TIdFTP

06.02.2011, 15:52. Показов 2001. Ответов 14
Метки нет (Все метки)

У меня скачивается файл при помощи TIdFTP. Процесс скачивания вынесен в поток. Пользователю дана возможность принудительно завершить скачивание. При этом поток прибивается. При скачивании использую метод Get, который записывает в файл. Если поток, в котором идёт запуск TIdFTP прибить, то после этого файл из программы не удаляется. Я использую unlink, возвращает код ошибки "Permission denied". После завершения работы программы файл удаляется нормально. Как с этим бороться?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2011, 15:52
Ответы с готовыми решениями:

Закачка файла через TidFTP
День добрый уважаемые гурру. Необходимо на FTP загрузить файлы. Ниже описанным текстом работаю с...

Какой у вас adsl интернет? И есть про блема с телефоном?
Влияет ли adsl-модем на качество связи? У меня adsl по телефонной линии, через модем Д-Линк ДСЛ...

Про блема с записью или с чтением при работе с файлом
У меня есть задача, которую я фактически решил, всё работает. Но возникает проблема с записью или с...

Удаление файла после работы с ним
Добрый день! Подскажите пожалуйста, программа создает файл на диске(переменная типа text) затем...

14
4 / 4 / 0
Регистрация: 13.01.2011
Сообщений: 26
06.02.2011, 16:08 2
при скачивании файла Get'ом вызывается событие onWork у idftp
попробуй поставить там break или return чтобы завершить скачивание
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::IdTrivialFTP1Work(TObject *Sender,
      TWorkMode AWorkMode, const int AWorkCount)
{
if (CheckBox1->Checked)//если нужно абортить, то
{
break;//или какой-нибудь ещё выход из функции передачи данных. я думаю можно даже соединение пересоздать с серваком.
}
}
сам правда такого не делал, но вскоре буду, так что напиши как у тебя это вышло.
0
Evg
Эксперт CАвтор FAQ
21160 / 8176 / 628
Регистрация: 30.03.2009
Сообщений: 22,475
Записей в блоге: 30
06.02.2011, 16:26  [ТС] 3
Цитата Сообщение от no0bs_prey Посмотреть сообщение
при скачивании файла Get'ом вызывается событие onWork у idftp
попробуй поставить там break или return чтобы завершить скачивание
Это неправильно. Процесс скачивания должен прибиваться в тот момент, когда этого хочет пользователь, а не тогда, когда изволит сработать Work (а при медленной сети этого ждать можно очень долго)
0
4 / 4 / 0
Регистрация: 13.01.2011
Сообщений: 26
06.02.2011, 18:32 4
при медленной сети вылезет таймаут соединения и всё, а так при следующем пакете у тебя сработает break.
0
Evg
Эксперт CАвтор FAQ
21160 / 8176 / 628
Регистрация: 30.03.2009
Сообщений: 22,475
Записей в блоге: 30
06.02.2011, 18:42  [ТС] 5
no0bs_prey, я ищу нормального решения, а не череж...ной затычки ошибочной ситуации. У меня нет проблем, чтобы убить скачку. У меня проблема, что после убитой скачки что-то не так с файлом. Причём это что-то наверняка решается программными методами и являются особенностью винды
0
Now I Matrix
136 / 133 / 28
Регистрация: 01.03.2010
Сообщений: 223
06.02.2011, 19:29 6
Windows не даёт удалять файл если он используется.
Так как idFTP скорей всего пишет в файл методом Write(x,y); то тогда скачиваемый файл либо блокируется (TFileStream, TMemoryStream имеют такие возможности) либо win'da не даёт его удалить так как он используется (мне кажется 1 вариант вернее.) При прибивании потока MemStream или FlStream (не знаю что он используют) не закрывают файл, он остаётся в памяти программы и windows видит его как открытый. Попробуйте как нибудь более тривиальнее завершать закачку.
0
Evg
Эксперт CАвтор FAQ
21160 / 8176 / 628
Регистрация: 30.03.2009
Сообщений: 22,475
Записей в блоге: 30
06.02.2011, 20:33  [ТС] 7
А блокировку как-то можно снять? Тривиальных способов не видно. Если компонента ушла скачивать, то пока очередную порцию не скачает - до него не достучаться
0
LK
Заблокирован
06.02.2011, 22:14 8
ProcessMessage ?
0
Эксперт С++
3942 / 1797 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
07.02.2011, 20:37 9
Цитата Сообщение от Evg Посмотреть сообщение
Если поток, в котором идёт запуск TIdFTP прибить, то после этого файл из программы не удаляется.
Это говорит о том, что не уничтожен файловый поток, который держит открытый файл.
То есть, не хватает:
C++
1
delete FileStream;
К тому же, у класса TThread есть событие OnTerminate - в нём-то и можно выполнить необходимые действия.
C++
1
TThread::OnTerminate /* __property TNotifyEvent OnTerminate = {read=FOnTerminate, write=FOnTerminate}; */
Вид заглушки:
C++
1
typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);
Цитата Сообщение от LK Посмотреть сообщение
ProcessMessage ?
Не поможет. Блокировку потока компонентами Indy лучше уменьшать с помощью TidAntiFreeze.
1
Evg
Эксперт CАвтор FAQ
21160 / 8176 / 628
Регистрация: 30.03.2009
Сообщений: 22,475
Записей в блоге: 30
07.02.2011, 20:44  [ТС] 10
Цитата Сообщение от MikeSoft Посмотреть сообщение
Это говорит о том, что не уничтожен файловый поток, который держит открытый файл.
То есть, не хватает:
C++
1
delete FileStream;
А где этот FileStream взять? Компонента же из себя представляет "чёрный ящик". Я ей отдаю имя файла, а где там у неё открытый дескриптор, FileStream или что там у неё есть -хз

Цитата Сообщение от MikeSoft Посмотреть сообщение
К тому же, у класса TThread есть событие OnTerminate - в нём-то и можно выполнить необходимые действия.
У меня проблема не в том, чтобы выполнить действия, а в том, что я не понимаю, что выполнять-то надо

Цитата Сообщение от MikeSoft Посмотреть сообщение
TidAntiFreeze.
Насколько я понял, это лишь некий бубен для работы с компонентами Indy в главном процессе. У меня работа идёт в потоке (а в теории будет много потоков), и, думаю, нужно искать решение проблемы в первую очередь в этом месте. А если уж совсем всё будет плохо - то через этот антифриз
0
Эксперт С++
3942 / 1797 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
07.02.2011, 21:12 11
Цитата Сообщение от Evg Посмотреть сообщение
А где этот FileStream взять? Компонента же из себя представляет "чёрный ящик".
Почему же чёрный ящик? Методу Get можно передать необходимый поток:
C++
1
2
3
TFileStream *FileStream = new TFileStream("D:\\SomeFile",fmCreate);
IdFTP1->Get("Path_To_FTP_File",FileStream,false);
//...
Цитата Сообщение от Evg Посмотреть сообщение
Насколько я понял, это лишь некий бубен для работы с компонентами Indy в главном процессе.
Да, верно. Но это был ответ на предложение уважаемого товарища LK.
1
Evg
Эксперт CАвтор FAQ
21160 / 8176 / 628
Регистрация: 30.03.2009
Сообщений: 22,475
Записей в блоге: 30
07.02.2011, 21:45  [ТС] 12
Цитата Сообщение от MikeSoft Посмотреть сообщение
Почему же чёрный ящик? Методу Get можно передать необходимый поток:
Блин, никак не привыкну к тому, что в Си++ можно переопределять функции. Почитал документацию и даже не обратил внимания, что есть другой метод Get с другими параметрами. Похоже, именно это мне и надо.

Теперь вопрос: если FileStream создан в главном процессе, то можно ли его удалять в потоке (и наоборот)? Т.е. является ли эта штука потокобезопасной? По логике, как мне видится, является, но мало ли
0
Эксперт С++
3942 / 1797 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
07.02.2011, 22:02 13
Цитата Сообщение от Evg Посмотреть сообщение
Теперь вопрос: если FileStream создан в главном процессе, то можно ли его удалять в потоке
Да, можно. Только необходимо либо убедится что действие с файловым потоком уже завершилось, либо организовать проверку, что указатель указывает на корректную область.
0
Evg
Эксперт CАвтор FAQ
21160 / 8176 / 628
Регистрация: 30.03.2009
Сообщений: 22,475
Записей в блоге: 30
07.02.2011, 23:13  [ТС] 14
Цитата Сообщение от MikeSoft Посмотреть сообщение
Только необходимо либо убедится что действие с файловым потоком уже завершилось
Если поток прибили, то оно завершилось? Или могут быть какие-то тонкости?

Цитата Сообщение от MikeSoft Посмотреть сообщение
либо организовать проверку, что указатель указывает на корректную область
Указатель на TFileStream?
0
Эксперт С++
3942 / 1797 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
08.02.2011, 09:40 15
Цитата Сообщение от Evg Посмотреть сообщение
Если поток прибили, то оно завершилось?
Да.
Цитата Сообщение от Evg Посмотреть сообщение
Указатель на TFileStream?
Да.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2011, 09:40

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Помогите с удалением из файла
Возникла такая проблема: Создана структура, запоняю ее, когда делаю запись в файл (каждая запись по...

Перемещение файла с удалением
Привет! Есть папка с музыкой. Хочу сделать сортировку по папкам. Накопал инфу по shutil.move, но...

Проблема с удалением файла
Set Fs=Server.CreateObject("Scripting.FileSystemObject") Fs.DeleteFile...

File Dialog продолжение работы после выбора файла
В ходе работы программы часто вызывается QFileDialog: configFilePath =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.