Копирование файлов на хост

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Копирование файлов на хост

Сообщение Shurrik » 23.08.2012 (Чт) 18:42

Несколько дней убил, пытаясь написать программу копирования файлов на свой бесплатный хост.
Дело в том, что у меня есть программа, которой пользуются два человека, но в разных городах. Один создает базу данных, а другой ей только пользуется. Раньше они пересылали данные по Skype, но в идеале хотелось бы через сервер. Вариант сервер-клиент отпадает, так как ни у кого нет постоянного IP-адреса, да и машины включаются не всегда одновременно.
Перебрал кучу разных вариантов, пока не остановился на API (уже и не помню, где нашел, копировал с разных мест, потом смотрел). Это смешно, но остальные получаются гораздо сложнее, хоть на VB6 или на VB.NET (VS2003). Программка весит всего 7KB и работает! Можно оформить ее в виде DLL и подключать.
Код: Выделить всё
Module Mod_API
    '
    ' Наверное самая короткая программа для копирования файлов на хост.
    '
    ' Вызываем программу с параметром:
    ' Имя хоста|Логин|Пароль|Полное имя файла(fa)|Имя файла на сервере(sfa)
    '
    ' Не знаю как на других хостах, а у меня корневая папка "htdocs", не хотел в параметрах повторять одно и тоже.
    ' Имя файла на сервере содержит и папку: например DOCUMENT/doc1.doc
    ' Если хост не пропускает некоторые расширения, то измените EXE на TMP и т.д.
    ' а при обратном копировании наоборот

    Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Integer, ByVal ProxyName As String, ByVal ProxyBypass As String, ByVal Flags As Integer) As Integer
    Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hOpen As Integer, ByVal ServerName As String, ByVal ServerPort As Short, ByVal UserName As String, ByVal Password As String, ByVal Service As Integer, ByVal Flags As Integer, ByVal Context As Integer) As Integer
    Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hConnect As Integer, ByVal LocalFile As String, ByVal ServerFile As String, ByVal Flags As Integer, ByVal Context As Integer) As Boolean
    Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Integer) As Short

    Sub Main()
        Dim hOpen, hConnect, kf As Integer, m_ser, m_log, m_pas, fa, sfa As String : kf = &H8000000
        Dim tt() As String = Microsoft.VisualBasic.Command.Split("|")
        hOpen = InternetOpen("API-Guide sample program", 0, Nothing, Nothing, 0)
        m_ser = tt(0) : m_log = tt(1) : m_pas = tt(2) : fa = tt(3) : sfa = tt(4)
        hConnect = InternetConnect(hOpen, m_ser, 21, m_log, m_pas, 1, kf, 0)
        FtpPutFile(hConnect, fa, "/htdocs/" & sfa, 0, 0)
        InternetCloseHandle(hConnect)
        InternetCloseHandle(hOpen)
    End Sub
End Module
Колесо: Хочешь жить? Умей вертеться.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Копирование файлов на хост

Сообщение FireFenix » 23.08.2012 (Чт) 18:54

System.Net.FtpWebRequest не, не слышал Изображение
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: Копирование файлов на хост

Сообщение Shurrik » 24.08.2012 (Пт) 6:47

Хорошая ссылка, но имеет несколько недостатков:
1. Нет примера на VB. Только C# и С++ (Хотя перевести не проблема)
2. Размер примера три с лишним листа!!! (Разбираться и разбираться как оно работает)
3. Не работает с Framework v1.1 (Значит у клиента надо ставить еще и эту библу)

Давая свой пример я делал упор на простоту и компактность, а не последнии навороты VS.
Кстати на VB6 текста кода тоже немного (используется компонент Microsoft Internet Transfer Control 6.0), но надо таскать еще и библу MSINET.OCX, которую в Windows 7 еще и регистрировать надо.
Колесо: Хочешь жить? Умей вертеться.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Копирование файлов на хост

Сообщение FireFenix » 24.08.2012 (Пт) 14:59

Shurrik писал(а):1. Нет примера на VB. Только C# и С++ (Хотя перевести не проблема)

http://www.developerfusion.com/tools/co ... arp-to-vb/
и в интернетах 3 миллиона примеров

Shurrik писал(а):2. Размер примера три с лишним листа!!! (Разбираться и разбираться как оно работает)

Изображение
Ага, с winnet.dll Ctrl+C Ctrl+V это явно выход не зная как и что оно делает
Более того на .NET пример который дан с чтением файла - более компактнее и логически понятнее, чем твоё месиво

Shurrik писал(а):3. Не работает с Framework v1.1 (Значит у клиента надо ставить еще и эту библу)

Если учесть что изначально в WinXP нету .NET фреймворка вообще, то да, это сильно решает, а так же что 1.1 морально и физически устарел и коряв. Более того у большинства народа стоит 3.5, т.к. он требуется для относительно многих приложений

Так же ты не учитываешь, что
4) Используется библиотека неуправляемого кода с управляемым кодом .NET что сказывается на производительности
5) При использовании нативных библиотек, нужно использовать маршалинг или правильное приведение типов и понимать механизм, но если нет этих знаний, то при полноценном использовании будут появляться проблемы и ошибки
6) Ты используешь пространство имён Microsoft.VisualBasic, которое создали только для совместимости перехода с VB6 и оно является не самым производительным

Shurrik писал(а):Давая свой пример я делал упор на простоту и компактность, а не последнии навороты VS.

Изображение
System.Net.FtpWebRequest существует с версии 2.0

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

Shurrik писал(а):Кстати на VB6 текста кода тоже немного (используется компонент Microsoft Internet Transfer Control 6.0), но надо таскать еще и библу MSINET.OCX, которую в Windows 7 еще и регистрировать надо.

VB6 то тут каким местом?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList