Страница 1 из 1

Помогите определить размер файла

Добавлено: 15 Декабрь 2011, 18:29
mike_ch
Здравствуйте всем!
Столкнулся со следующей задачей - необходимо загрузить файл по фтп и отобразить процесс загрузки (progress грубо говоря).
Реализация загрузки файла по фтп не составила труда. Берем api-функцию FtpGetFile, аккуратно описываем все параметры и все работает. Отображать процесс загрузки решил следующим образом:
1) определяю размер файла на фтп-сервере - FtpGetFileSize
2) и в процессе закачки решил в новом потоке по таймеру определять размер файла, который постепенно увеличивается
для этого также использую 2 api функции - CreateFile и GetFileSize
И вот здесь проблема - я не могу получить дескриптор файла пока он полностью не закачается. А уже после закачки я получаю конечный размер.
Но ведь в том же Total Commander'е видно как увеличивается размер файла. Значит как-то ж этот размер можно определить во время закачки файла.
Может есть другие варианты и идеи как отобразить этот процесс?

Re: Помогите определить размер файла

Добавлено: 16 Декабрь 2011, 0:13
Admin
Кто мешает считать количество принятых байт руками?

Re: Помогите определить размер файла

Добавлено: 16 Декабрь 2011, 2:09
mike_ch
Admin писал(а):Кто мешает считать количество принятых байт руками?
Наверно не понял о чем вы говорите, но предполагаю, что вместо FtpGetFile() вы советуете использовать FtpOpenFile() и InternetReadFile().
Что ж ... конечно выход. Но с FtpGetFile() настолько удобно и просто!
У меня уже голова пухнет от MSDN'а. Чтоб отследить процесс по FtpGetFile() необходимо использовать InternetSetStatusCallback. И вот теперь эти удобство и простота переходят в страшный геммор, какой удар для разработчика! :)

Re: Помогите определить размер файла

Добавлено: 16 Декабрь 2011, 12:00
Yufil
Стукнитесь ко мне в аську 75924439, подарю класс для... Там эта проблема решена.

Re: Помогите определить размер файла

Добавлено: 16 Декабрь 2011, 12:03
Yufil
Примерный код в классе
Out:FileName Cstring(260),Static
Out File,Driver('DOS'),Pre(Out),Name(Out:FileName),Create
Record Record
S String(1000)
End
End
....
! Копировать файл по байтам
F.Open(FileDir.Name,OpenType:Read)
If F.ErrorCode
Message(F.Error)
Else
FileSize=F.Bytes()
Loop I#=1 to FileSize by Size(Out:S)
F.Read(Out:S,Size(Out:S))
Loc:Progress=I#/FileSize*100
Display(?Loc:Progress)
Add(Out,F.Bytes)
If F.ErrorCode Then Break.
End
F.Close()
Close(Out)