39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
1

Отправка/получение файлов на FTP с прогресс баром

17.01.2015, 18:56. Показов 5039. Ответов 39
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день всем!
перерыл кучу ресурсов (в том числе) и этот. Но ничего (рабоающего) не нашел.
Самое свежее здесь..Разместить файл на папку в FTP сервере

Единственный рабоающий пример с получением файлов найден на данном ресурсе http://www.planet-source-code.... deId=64914

Однако работа в одну торону, а именно только на загрузку. Может кто-то помочь доработать данный код, предложить другой?
Миниатюры
Отправка/получение файлов на FTP с прогресс баром  
Вложения
Тип файла: zip A_URLDownl2181335182010.zip (21.0 Кб, 32 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2015, 18:56
Ответы с готовыми решениями:

Ребят подскажите с прогресс баром
Мне нужно чтобы при полном запонении прогресс бара вылетало сообщение и прогресс бар обнулялся. И...

Не работает отправка файлов на ftp
Подскажите в чем ошибка, пробую залить файл на народ, но выходит ошибка и указывает вот на эту...

Скачивание файлов по очереди с прогресс баром
У меня возникла такая задача: есть listView где хранятся имена файлов и ссылки для скачивания. Но...

WebClient скачивание нескольких файлов с общим прогресс баром
Ребят, использую WebClient, нужно реализовать скачивание двух-трёх файлов и сделать вывод процесса...

39
Модератор
9722 / 3683 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
17.01.2015, 22:52 2
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Цитата Сообщение от kreotodr Посмотреть сообщение
Единственный рабоающий пример с получением файлов найден на данном ресурсе http://www.planet-source-code.... deId=64914
https://www.cyberforum.ru/blog... g2774.html
Посмотри:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
Option Explicit
 
Private Declare Function InternetCloseHandle Lib "wininet" (ByVal hInternet As Long) As Boolean
Private Declare Function InternetOpen Lib "wininet" Alias "InternetOpenW" (ByVal lpszAgent As Long, ByVal dwAccessType As Long, ByVal lpszProxy As Long, ByVal lpszProxyBypass As Long, ByVal dwFlags As Long) As Long
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectW" (ByVal hInternetSession As Long, ByVal sServerName As Long, ByVal nServerPort As Integer, ByVal sUserName As Long, ByVal sPassword As Long, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function FtpOpenFile Lib "wininet.dll" Alias "FtpOpenFileW" (ByVal hFtpSession As Long, ByVal sBuff As Long, ByVal Access As Long, ByVal Flags As Long, ByVal Context As Long) As Long
Private Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" (lpdwError As Long, ByVal lpszBuffer As String, lpdwBufferLength As Long) As Long
Private Declare Function InternetWriteFile Lib "wininet" (ByVal hFile As Long, lpBuffer As Any, ByVal dwNumberOfBytesToWrite As Long, ByRef lpdwNumberOfBytesWritten As Long) As Long
Private Declare Function PathFindFileName Lib "shlwapi" Alias "PathFindFileNameW" (ByVal pPath As Long) As Long
 
Private Const INTERNET_OPEN_TYPE_PRECONFIG  As Long = 0
Private Const INTERNET_DEFAULT_FTP_PORT     As Long = 21
Private Const INTERNET_SERVICE_FTP          As Long = 1
Private Const INTERNET_FLAG_RELOAD          As Long = &H80000000
Private Const INTERNET_FLAG_PASSIVE         As Long = &H8000000
Private Const GENERIC_WRITE                 As Long = &H40000000
Private Const FTP_TRANSFER_TYPE_BINARY      As Long = &H2
Private Const USERNAME                      As String = ""    ' Èìÿ ïîëüçîâàòåëÿ
Private Const PASSWORD                      As String = ""   ' Ïàðîëü
Private Const GRANULARITY                   As Long = &H10000
 
Private Sub cmdUpload_Click()
    Dim fileTitle   As String
    Dim offset      As Long
    Dim fileName    As String
    
    fileName = txtSourceFile.Text
    
    If Len(fileName) Then
        fileTitle = Mid$(fileName, (PathFindFileName(StrPtr(fileName)) - StrPtr(fileName)) \ 2 + 1)
        UploadFile fileName, fileTitle, txtServerName
    End If
    
End Sub
 
' // Çàãðóçèòü ôàéë
Private Function UploadFile(srcFile As String, dstPath As String, serverName As String) As Long
    Dim hInet   As Long
    Dim hFtp    As Long
    Dim hFile   As Long
    
    ' Èíèöèàëèçèðóåì WinInet
    hInet = InternetOpen(StrPtr(App.ProductName), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0)
    
    If hInet Then
        ' Îòêðûâàåì FTP ñåññèþ
        hFtp = InternetConnect(hInet, StrPtr(serverName), INTERNET_DEFAULT_FTP_PORT, _
                          StrPtr(USERNAME), StrPtr(PASSWORD), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)
        If hFtp Then
            ' Ñîçäàåì ôàéë
            hFile = FtpOpenFile(hFtp, StrPtr(dstPath), GENERIC_WRITE, FTP_TRANSFER_TYPE_BINARY Or INTERNET_FLAG_RELOAD, 0)
    
            If hFile Then
                Dim fNum    As Integer
                Dim size    As Long
                Dim length  As Long
                Dim buf()   As Byte
                Dim numByt  As Long
                Dim totWrt  As Long
                Dim retval  As Long
                ' Îòêðûâàåì ôàéë
                ' Ïðîñòîé ñïîñîá (äëÿ ïðèìåðà), íî ïðàâèëüíî äåëàòü ÷åðåç GetFileSizeEx, CreateFileW, ReadFile
                fNum = FreeFile
                Open srcFile For Binary As fNum
                size = LOF(fNum):   length = size
                ReDim buf(GRANULARITY - 1)
                picProgress.Cls:    picProgress.Scale (0, 0)-(1, 1)
                
                Do
                    ' Ñ÷èòûâàåì ïîðöèþ äàííûõ èç ôàéëà
                    Get fNum, , buf()
                    If size - GRANULARITY > 0 Then numByt = GRANULARITY Else numByt = size
                    ' Çàïèñûâàåì â ôàéë
                    retval = InternetWriteFile(hFile, buf(0), numByt, totWrt)
                    ' Ïðîâåðÿåì ñòàòóñ
                    If retval = 0 Or numByt <> totWrt Then
                        MsgBox "Error writing into file"
                        Exit Do
                    End If
                    
                    size = size - GRANULARITY
                    picProgress.Line (0, 0)-((length - size) / length, 1), vbRed, BF
                    DoEvents
                    
                Loop While size > 0
                
                Close fNum
                
                InternetCloseHandle hFile
                ' Óñïåõ
                UploadFile = 1
                
            Else
                MsgBox "Error creating file"
            End If
            
            InternetCloseHandle hFtp
        Else
            MsgBox "Error connection"
        End If
        
        InternetCloseHandle hInet
    Else
        MsgBox "Initialize error"
    End If
 
End Function
 
Private Sub Form_Load()
 
End Sub
Вложения
Тип файла: rar FTP.rar (7.0 Кб, 46 просмотров)
4
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
18.01.2015, 09:14  [ТС] 3
Спасибо!
Мне очень понравилась Ваша реализация (примерно 5% от того когда, что я нашел). И главное все работает..
Но, в тоже время...сделав все по инструкции....

Потратил часа два танцев с бубном.
А именно программа упорно не хочет лезьть на:

1.мой личный FTP созданный с помощью Роутерной фичи + ASUS.COM
ftp.oleksandrnosar.asuscomm.com
oleksandrnosar
e686dc4fd033

2.фри хостинг FTP №1
ftp.node0.net2ftp.ru
oleksandr.nosar@gmail.com
e686dc4fd033

И успешно только на:
3.фри хостинг FTP №2
ftp.oleksandrnosar.e3w.ru
u864387846
v54l94LiCS

1. Не подскажете в чем загвоздка (проект во вложении.)
2. Не затруднит выложить (в рамках Вашего проекта) такой же код на Download? (уж больно компакная у вас программа)..
Вложения
Тип файла: rar FTP2.rar (3.5 Кб, 20 просмотров)
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
18.01.2015, 09:33  [ТС] 4
3. Как корректно подправить код, чтобы была возможность писать не в корень FTP а в указанную папку на FTP. (т.к. редактирование переменной serverName с указанием полного пути приводит к Error connection....)

Добавлено через 9 минут
Кроме того: инструментарий объявленных функций позволяет:
1. получить ответ от сервера об успешном завершении копирования на FTP сервер?
2. получить список фалов на FTP сервере?
3. создать/удалить файл/папку на FTP сервере?

Извините что нагружаю. Оч. сильно хочется довести до конца начатое...

Заранее спасибо за помощь и ответы!!!!!!!
0
Модератор
9722 / 3683 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
18.01.2015, 09:56 5
Цитата Сообщение от kreotodr Посмотреть сообщение
А именно программа упорно не хочет лезьть на:
Ошибка - ERROR_INTERNET_NAME_NOT_RESOLVED, разбирайся в настройках.
Цитата Сообщение от kreotodr Посмотреть сообщение
Не затруднит выложить (в рамках Вашего проекта) такой же код на Download? (уж больно компакная у вас программа)
Почти тоже самое, только вместо InternetWriteFile - InternetReadFile + небольшие мелочи, ссылку я первым постом дал на свой блог, там это реализовано уже.
Цитата Сообщение от kreotodr Посмотреть сообщение
Как корректно подправить код, чтобы была возможность писать не в корень FTP а в указанную папку на FTP. (т.к. редактирование переменной serverName с указанием полного пути приводит к Error connection....)
FtpSetCurrentDirectory

Цитата Сообщение от kreotodr Посмотреть сообщение
получить ответ от сервера об успешном завершении копирования на FTP сервер?
InternetGetLastResponseInfo
Цитата Сообщение от kreotodr Посмотреть сообщение
получить список фалов на FTP сервере?
FtpFindFirstFile, InternetFindNextFile, InternetCloseHandle.
Цитата Сообщение от kreotodr Посмотреть сообщение
создать/удалить файл/папку на FTP сервере?
Как создать файл я написал в 1-м посте, FtpCreateDirectory, FtpDeleteFile, FtpRemoveDirectory.
А вообще смотри тут все что тебе надо с подробным описанием.
1
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
18.01.2015, 11:55  [ТС] 6
ок. спасибо!!!!!!!!

Добавлено через 16 минут
Посмотрел ссылки.. на MSDN там все сложно (С++), а у вас (в первом примере) реализация загрузки только с http.
В этой связи можно все таки Вас просить...

Не затруднит выложить (в рамках Вашего проекта) такой же код на Download? (уж больно компакная у вас программа)

Добавлено через 21 минуту
Кстати как выполучили ERROR_INTERNET_NAME_NOT_RESOLVE???
0
Модератор
9722 / 3683 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
18.01.2015, 12:44 7
Цитата Сообщение от kreotodr Посмотреть сообщение
Кстати как выполучили ERROR_INTERNET_NAME_NOT_RESOLVE???
Err.LastDllError
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
24.02.2015, 08:27  [ТС] 8
Цитата Сообщение от The trick Посмотреть сообщение
Сообщение от kreotodr
Кстати как выполучили ERROR_INTERNET_NAME_NOT_RESOLVE???
Err.LastDllError
Да но Err.LastDllError выдает только код. Как получить описание?

Пробовал Error(Err.LastDllError) - не работает..
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
24.02.2015, 10:29 9
kreotodr, System Error Codes
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
24.02.2015, 11:40  [ТС] 10
Цитата Сообщение от Dragokas Посмотреть сообщение
kreotodr, System Error Codes
Спасибо!
И совсем дурацкий вопрос, не готового "блока Select CASE" под все это?
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
24.02.2015, 15:47 11
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Option Explicit
 
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) As Long
 
Const MAX_PATH As Long = 260&
 
Private Sub Form_Load()
    Dim HRESULT     As String
    Dim ErrNumber   As Long
    
    'например. Код 5 - отаказ в доступе
    ErrNumber = 5
    HRESULT = MessageText(ErrNumber)
    Debug.Print HRESULT
End Sub
 
Private Function MessageText(lCode As Long) As String
    On Error Resume Next
    Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000&
    
    Dim sRtrnCode   As String
    Dim lRet        As Long
 
    sRtrnCode = Space$(MAX_PATH)
    lRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, lCode, ByVal 0&, sRtrnCode, MAX_PATH, ByVal 0&)
    If lRet > 0 Then
        MessageText = Left$(sRtrnCode, lRet)
        MessageText = Replace$(MessageText, vbNewLine, vbNullString)
    End If
End Function
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
24.02.2015, 23:02  [ТС] 12
Спасибо!

Экспериментальным путем установлено, что не обрабатывается блок

ERROR_INTERNET_*
12000 - 12175 (0x2EE0)
See Internet Error Codes and WinInet.h.


Почему не в курсе???
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
24.02.2015, 23:34 13
Цитата Сообщение от kreotodr Посмотреть сообщение
Экспериментальным путем установлено, что не обрабатывается блок
Можно было и не проверять. Это указано на странице по ссылке, которую я давал: https://msdn.microsoft.com/en-... s.85).aspx

Цитата Сообщение от kreotodr Посмотреть сообщение
Почему не в курсе???
Потому, что они находятся в другой библиотеке: wininet.dll
Вам необходимо передать хендл модуля этой библиотеки в источник (lpSource) функции FormatMessage, указав флаг FORMAT_MESSAGE_FROM_HMODULE, как показано в этом примере: https://msdn.microsoft.com/en-... s.85).aspx
1
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
25.02.2015, 08:53  [ТС] 14
Цитата Сообщение от Dragokas Посмотреть сообщение
Вам необходимо передать хендл модуля этой библиотеки в источник (lpSource) функции FormatMessage, указав флаг FORMAT_MESSAGE_FROM_HMODULE, как показано в этом примере: https://msdn.microsoft.com/en-... s.85).aspx
Ой тяжко...(
Можно Вас попросить дописать код???
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
25.02.2015, 12:57 15
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Option Explicit
 
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
 
Const MAX_PATH As Long = 260&
 
Private Sub Form_Load()
    Dim HRESULT     As String
    Dim ErrNumber   As Long
 
    ErrNumber = 12002
    HRESULT = MessageText(ErrNumber)
    Debug.Print HRESULT
End Sub
 
Private Function MessageText(lCode As Long) As String
    On Error Resume Next
    Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000&
    Const FORMAT_MESSAGE_FROM_HMODULE As Long = &H800&
    
    Dim sRtrnMsg   As String
    Dim lRet        As Long
 
    sRtrnMsg = Space$(MAX_PATH)
    
    If lCode >= 12000 And lCode <= 12175 Then
        lRet = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, ByVal GetModuleHandle("wininet.dll"), lCode, ByVal 0&, sRtrnMsg, MAX_PATH, ByVal 0&)
    Else
        lRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, lCode, ByVal 0&, sRtrnMsg, MAX_PATH, ByVal 0&)
    End If
    If lRet > 0 Then
        MessageText = Left$(sRtrnMsg, lRet)
        MessageText = Replace$(MessageText, vbNewLine, vbNullString)
    End If
End Function
1
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
25.02.2015, 15:41  [ТС] 16
Цитата Сообщение от Dragokas Посмотреть сообщение
Код Visual Basic
СПАСИБО!!!!!!
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
01.03.2015, 13:42  [ТС] 17
Добрый день всем!
Скажите как решить следующий вопрос..
В ряде случаев (например при отсутствие интернета) проект пытается коннектится с сервером... Соединение длится секунд 30-50 и в это время форма, как бы, висит. Создается впечатление что проект завис. Начинается паника среди пользователей...
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
01.03.2015, 14:37 18
Использовать асинхронное подключение или вынести код подключения в отдельный поток/процесс.
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
01.03.2015, 15:32  [ТС] 19
а как вынести в отдельный поток?
где то уже видел пример, но не нашел через поиск....
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
04.03.2015, 08:28  [ТС] 20
Visual Basic
1
2
3
4
5
6
7
8
9
Dim retVal As Long, pID As Long, pHandle, msWait As Long
  msWait = 1000000000#
   
  Call Update(strPath_to_VER, strPath_to_LST, strUPDEngineORgame)
  
  pHandle = OpenProcess(&H100000, True, pID)
  Do While WaitForSingleObject(pHandle, 500&) = &H102
    DoEvents
  Loop
Что не правильно в этом коде?
Форма по прежнему "висит" ?
0
04.03.2015, 08:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2015, 08:28
Помогаю со студенческими работами здесь

Скачивание файлов из интернета с прогресс-баром при использовании indy
Доброго времени суток, участники и гости форума. В моей программе мне нужно реализовать скачивание...

Проблемы со прогресс баром
Нашел в интернете вот такой скрипт прогресс бар. При нажатие на кнопку появляется вверху бар...

Долгое нажатие на кнопку с прогресс-баром
Как сделать, чтобы при нажатию на кнопку появился на экране прогресс бар, который двигался от 100%...

Java / Авторизация через БД / + / Скачка файолов с прогресс баром
Как это сделать , у кого есть коды?


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru