Как показать что файл уже копируется?

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

Как показать что файл уже копируется?

Сообщение AntonGV » 16.07.2006 (Вс) 18:56

При копированиии большого файла с помощью FileCopy программа на некоторое время зависает. Как мне показать прогресс копирования файла и как сделать чтобы в это время программа работала?

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 16.07.2006 (Вс) 19:09

SHFileOperation
Моду создают модоки, а распространяют модозвоны.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.07.2006 (Вс) 19:10

Варианты:
А) Копировать самому и по кускам
Б) SHFileOperation
В) Запустить MoveFile в отдельном потоке

Добавлено:
hCORe
Опередил!
Изображение

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 16.07.2006 (Вс) 19:13

А можно поподробнее про SHFileOperation

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.07.2006 (Вс) 19:15

Изображение

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 16.07.2006 (Вс) 19:18

А по-русски ничего нет?

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 16.07.2006 (Вс) 19:20

А английский выучить слабо?
Моду создают модоки, а распространяют модозвоны.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.07.2006 (Вс) 19:20

В RSDN: http://www.rsdn.ru/article/qna/baseserv/fileop.xml

Но почти вся документация на английском... Его надо знать
Изображение

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 16.07.2006 (Вс) 19:27

Английский выучить слабо. В RSDN нашел но там все на каком-то незнакомом мне языке программирования

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.07.2006 (Вс) 19:29

Там на сях. Почти вся документация для них, посему надо хотя бы понимать определения типов...
Так тебе по русски или на VB?
Изображение

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 16.07.2006 (Вс) 19:34

И то и другое. Лучше на VB

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.07.2006 (Вс) 19:35

Код: Выделить всё
'This program needs a Dialog box, named CDBox1
'  (To add the Common Dialog Box to your tools menu, go to Project->Components (or press CTRL-T)
'   and select Microsoft Common Dialog control)
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
Private Type SHFILEOPSTRUCT
    hWnd As Long
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAborted As Boolean
    hNameMaps As Long
    sProgress As String
End Type
Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const FO_DELETE = &H3
Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, lpSecurityAttributes As Long) As Long
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
Private Declare Function GetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
Private Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Declare Function FileTimeToLocalFileTime Lib "kernel32" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long
Private Sub Form_Load()
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim lngHandle As Long, SHDirOp As SHFILEOPSTRUCT, lngLong As Long
    Dim Ft1 As FILETIME, Ft2 As FILETIME, SysTime As SYSTEMTIME
    'Set the dialog's title
    CDBox.DialogTitle = "Choose a file ..."
    'Raise an error when the user pressed cancel
    CDBox.CancelError = True
    'Show the 'Open File'-dialog
    CDBox.ShowOpen
    'Create a new directory
    CreateDirectory "C:\KPD-Team", ByVal &H0
    'Copy the selected file to our new directory
    CopyFile CDBox.filename, "C:\KPD-Team\" + CDBox.FileTitle, 0
    'Rename the file
    MoveFile "C:\KPD-Team\" + CDBox.FileTitle, "C:\KPD-Team\test.kpd"
    'Open the file
    lngHandle = CreateFile("C:\KPD-Team\test.kpd", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)
    'Get the file's size
    MsgBox "The size of the selected file is" + Str$(GetFileSize(lngHandle, lngLong)) + " bytes."
    'Get the fil's time
    GetFileTime lngHandle, Ft1, Ft1, Ft2
    'Convert the file time to the local file time
    FileTimeToLocalFileTime Ft2, Ft1
    'Convert the file time to system file time
    FileTimeToSystemTime Ft1, SysTime
    MsgBox "The selected file was created on" + Str$(SysTime.wMonth) + "/" + LTrim(Str$(SysTime.wDay)) + "/" + LTrim(Str$(SysTime.wYear))
    'Close the file
    CloseHandle lngHandle
    'Delete the file
    DeleteFile "C:\KPD-Team\test.kpd"
    With SHDirOp
        .wFunc = FO_DELETE
        .pFrom = "C:\KPD-Team"
    End With
    'Delete the directory
    SHFileOperation SHDirOp
    End
End Sub
Изображение

AntonGV
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 24.05.2006 (Ср) 12:10
Откуда: г. Пермь

Сообщение AntonGV » 16.07.2006 (Вс) 19:38

Спасибо. Буду разбираться

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 06.09.2007 (Чт) 10:21

А можно ли как-то прогрессбар встроить в форму? Мне не хочется, чтобы вызывался диалог копирования файлов отдельно от формы программы.

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

Сообщение alibek » 06.09.2007 (Чт) 10:41

Зацени API CopyFileEx и колбэк lpProgressRoutine.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 06.09.2007 (Чт) 11:00

В этом примере как раз используется CopyFileEx, а прогресс в стандартном виндовском окне...
Вложения
PROGDLG.ZIP
(17.1 Кб) Скачиваний: 49
Лучший способ понять что-то самому — объяснить это другому.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 06.09.2007 (Чт) 11:12

alibek
ничего дельного из примеров не находится....
может есть что-то на примете для изучения?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 06.09.2007 (Чт) 11:32

kibernetics писал(а):ничего дельного из примеров не находится....
может есть что-то на примете для изучения?


Да уж ладно. Запускаешь API-Guide, ищешь в нем пример для функции CopyFileEx (которую здесь уже называли). И все - дело минуты...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 06.09.2007 (Чт) 11:43

я нашёл пример http://bbs.vbstreets.ru/viewtopic.php?p=97913#97913
но мне непоянтно, как прогресс с капшион формы переместить в стандартный контрол ProgressBar?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 06.09.2007 (Чт) 11:52

kibernetics писал(а):я нашёл пример http://bbs.vbstreets.ru/viewtopic.php?p=97913#97913
но мне непоянтно, как прогресс с капшион формы переместить в стандартный контрол ProgressBar?


Просто выводить их в стандартный контрол ProgressBar.

P.S Нет, я, конечно, понимаю, что думать совсем не охота...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 06.09.2007 (Чт) 12:16

Andrey Fedorov
не заметил...

на всякий пожарный, хочу выложить еще код который мне удалось найти:
Код: Выделить всё
Dim objShell  As Shell   
Dim objFolder As Folder       
Set objShell = New Shell   
Set objFolder = objShell.NameSpace("D:\Test")     
If (Not objFolder Is Nothing) Then       
objFolder.CopyHere ("D:\MyFiles\*.txt")   
End If     
Set objFolder = Nothing   
Set objShell = Nothing


ссыла на Microsoft Shell Controls And Automation
..\system32\shell32.dll

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

Сообщение alibek » 06.09.2007 (Чт) 12:42

kibernetics, в том примере есть строчка:
Код: Выделить всё
Form1.Caption = CStr(Int((TotalBytesTransferred * 10000) / (TotalFileSize * 10000) * 100)) + "% complete..."

Помедитируй над ней.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 06.09.2007 (Чт) 13:02

alibek писал(а):Помедитируй над ней.


Ш-ш-ш... Не выдавай военную тайну... :wink:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 06.09.2007 (Чт) 14:11

alibek
Помедицировал. Успешно.... :)

Скажите, а вот в примере, который я привёл с shell32.dll, как там удалить всю фолдер со всеми файлами?

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 10.09.2007 (Пн) 18:02

я тут копался копался со всеми этими апишными копированиями и насобирал несколько вопросов:

1. Насколько я понимаю, целиком папку с помощью CopyFileEx скопировать нельзя. Или можно?
2. Если ответ на первый вопрос положительный, то я допустим перечисляю все пути файлов из источника и копирую их в указываемое место, опять же, какой функцией копировать пустые папки? Или нужно создавать самому новую папку?

Правильно ли я думаю, если мне нужно скопировать с помощью CopyFileEx всю папку со вложенными подпапками, среди которых есть и пустые папки:
1. Перечислить все папки в директории-источнике (FindFirstFile, FindNextFile)
2. Создать папки в таком же порядке на destination (пока делаю через Shell32)
3. Перечислить все пути файлов из источника (FindFirstFile, FindNextFile)
4. Копировать их на destination (SHLFileOperation)


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 88

    TopList