ProgressBar и копирование

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dzhon
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 236
Зарегистрирован: 09.12.2003 (Вт) 13:30
Откуда: Россия, Омск

ProgressBar и копирование

Сообщение Dzhon » 14.03.2004 (Вс) 11:05

Добрый день или ночь, у кого что!
Подскажите пожайлуста как привязать ProgressBar к копированию директории! Копирование произвожу с помощью FSO!
Помню что встречал подобный вопрос на топике, а сейчас найти немогу!
Заранее СПАСИБО!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.03.2004 (Вс) 11:52

"ВЫРЕЗАНО ЦЕНЗУРОЙ"
Последний раз редактировалось Amed 14.03.2004 (Вс) 15:47, всего редактировалось 1 раз.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 14.03.2004 (Вс) 13:50

Amed писал(а):Попробуй так: через FSO смотри размер исходной директории и начинай копировать... Потом по таймеру смотри размер новой директории и высчитывай процент прогресса операции: Progress = CurrentSize/OldSize * 100 'В процентах


Очень жаль, что человек с такой подписью, пишет такие вещи.
Заведомо НЕПРАВИЛЬНЫЙ ПУТЬ! Даже не пытайтесь так делать!

Есть два варианта:
1. Копировать файл по блокам байтов(медленно и теряются аттрибуты)
2. Использовать АПИ с обработкой обратного вызова
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.03.2004 (Вс) 15:46

Уже понял всю глупость своего ответа, но инета не было => не успел затереть :)

Конечно же, такой путь неприемлем, а Sebas прав...

А почему теряются атрибуты? Выход:
1) запоминаем атрибуты старого файла в переменной
2) копируем старый файл в новый
3) делаем атрибуты нового файла, как старого...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 14.03.2004 (Вс) 15:57

Я имел ввиду NTFS аттрибуты
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.03.2004 (Вс) 16:01

Ах, NTFS... Сейчас в APIGuide пороюсь, может, найду что-нибудь...

Dzhon
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 236
Зарегистрирован: 09.12.2003 (Вт) 13:30
Откуда: Россия, Омск

Сообщение Dzhon » 15.03.2004 (Пн) 6:14

Неплохой диалог! Но может быть кто-то даст совет отличный от "С ТОЧКИ ЗРЕНИЯ БАНАЛЬНОЙ ЭРУДИЦИИ......"?! :wink:

Tauron
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 187
Зарегистрирован: 14.07.2002 (Вс) 17:43
Откуда: Kazakhstan

Сообщение Tauron » 15.03.2004 (Пн) 6:31

Поясяню ответы предыдущих ораторов:
1. Либо копируй вручную (открываешь старый файл для чтения, новый для записи, читаешь байты из старого пишешт в новый). Минусы: относительно медленно, теряются NTFS-аттрибуты.
2. Используй CopyFileEx. Минусы: понятия не имею, как это использовать в бейсике. Если это вообще возможно. По идее возможно.
Трезвая голова, холодный ум и ледяное сердце.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.03.2004 (Пн) 9:50

Код: Выделить всё
'API-Guide examples
'in a form (Form1)
Private Sub Form_Load()
    'KPD-Team 2001
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim Ret As Long
    'set the graphics mode to persistent
    Me.AutoRedraw = True
    'print some text
    Me.Print "Click the form to abort the filecopy"
    'show the form
    Me.Show
    'start copying
    Ret = CopyFileEx("c:\verybigfile.ext", "c:\copy.ext", AddressOf CopyProgressRoutine, ByVal 0&, bCancel, COPY_FILE_RESTARTABLE)
    'show some text
    Me.Print "Filecopy completed " + IIf(Ret = 0, "(ERROR/ABORTED)", "successfully")
End Sub
Private Sub Form_Click()
    'cancel filecopy
    bCancel = 1
End Sub
'in a module
Public Const PROGRESS_CANCEL = 1
Public Const PROGRESS_CONTINUE = 0
Public Const PROGRESS_QUIET = 3
Public Const PROGRESS_STOP = 2
Public Const COPY_FILE_FAIL_IF_EXISTS = &H1
Public Const COPY_FILE_RESTARTABLE = &H2
Public Declare Function CopyFileEx Lib "kernel32.dll" Alias "CopyFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal lpProgressRoutine As Long, lpData As Any, ByRef pbCancel As Long, ByVal dwCopyFlags As Long) As Long
Public bCancel As Long
Public Function CopyProgressRoutine(ByVal TotalFileSize As Currency, ByVal TotalBytesTransferred As Currency, ByVal StreamSize As Currency, ByVal StreamBytesTransferred As Currency, ByVal dwStreamNumber As Long, ByVal dwCallbackReason As Long, ByVal hSourceFile As Long, ByVal hDestinationFile As Long, ByVal lpData As Long) As Long
    'adjust the caption
    Form1.Caption = CStr(Int((TotalBytesTransferred * 10000) / (TotalFileSize * 10000) * 100)) + "% complete..."
    'allow user input
    DoEvents
    'continue filecopy
    CopyProgressRoutine = PROGRESS_CONTINUE
End Function
Lasciate ogni speranza, voi ch'entrate.

Dzhon
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 236
Зарегистрирован: 09.12.2003 (Вт) 13:30
Откуда: Россия, Омск

Сообщение Dzhon » 15.03.2004 (Пн) 10:11

Большой РАХМАТ Alibek! :wink:

Dzhon
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 236
Зарегистрирован: 09.12.2003 (Вт) 13:30
Откуда: Россия, Омск

Сообщение Dzhon » 15.03.2004 (Пн) 14:37

Alibek! С файлом все прекрасно получается! А есть что-то подобное для Folder должно-же быть!? Если не трудно скинь пример!
В любом случае спасибо!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 15.03.2004 (Пн) 20:00

Alibek: в точку, я тот же пример нашёл, но инета не было... Выложить не вышло...

Dzhon: а с folder'ом надо сделать функцию, рекурсивно перебирающую заданную папку и копирующую каждый отдельный файл... Поищи примерчик поиска файлов в заданной директории... Разберись с алгоритмом поиска, а потом копируй каждый файл из найденных по маске "*.*" в свою папку...

Надеюсь, объяснил доходчиво? :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.03.2004 (Вт) 15:15

Amed уже ответил, но поясню своими словами.
Перед копированием всей папки тебе надо вначале посчитать ее размер и запомнить в переменную (например, TotalDirSize). А еще нужно завести одну переменную, в которой будет отслеживаться уже выполненный прогресс (сколько байт скопированно), к примеру ProcessedDirSize. И, наконец, подправить процедуру CopyProgressRoutine, заменить на такую строчку:
Код: Выделить всё
Dim P As Single
P = ((ProcessedDirSize + TotalBytesTransferred*10000) / TotalDirSize)*100
Form1.Caption = Format$(P,"0.00") & "% complete...")
Lasciate ogni speranza, voi ch'entrate.

Dzhon
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 236
Зарегистрирован: 09.12.2003 (Вт) 13:30
Откуда: Россия, Омск

Сообщение Dzhon » 17.03.2004 (Ср) 5:45

Всем большое СПАСИБО!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 7

    TopList