[VB .net] FTP connection

Pagina: 1
Acties:
  • 216 views sinds 30-01-2008
  • Reageer

  • monnick
  • Registratie: December 2005
  • Niet online
Ik ben pas begonnen met VB .net 2005, nu wil ik als oefening iets met een FTP server doen. Ik ben begonnen aan het eerste: verbinding maken met de FTP server.

Ik dacht er is vast heeeel veel te vinden over een ftp connection in VB. Maar dat viel me vies tegen, als ik bijvoorbeeld google op "ftp connection vb .net" vind hij veel resultaten maar niet echt een duidelijke uitleg die ik zoek. Ik vind wel bijvoorbeeld dit. Dat lijkt me wel een goede tutorial alleen is dit de goede manier om het te leren? Daarvoor dacht ik te gaan zoeken op MSDN, alleen daar word ik eerlijk gezegt niet zo vrolijk van. Errors op pagina, lange laadtijden en onduidelijk. (Ik zet bijv de filter op VB only, en nog allemaal C++ & C# er door heen, mja dat zal wel aan mij liggen 8)7)

Mijn vraag aan jullie is of jullie nog goede handleidingen / referenties over FTP connections in VB .net weten / hebben?

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 22:01
google eens op FtpWebRequest

  • user109731
  • Registratie: Maart 2004
  • Niet online
Met versie 2 van het .net framework is ftp toegang echt makkelijk geworden :) Ik zou dan ook niet die link gebruiken die je zelf had gevonden, maar kijken naar de webclient class.

Een voorbeeldje (zonder errorhandling ed) van het uploaden van een bestand in C#, zoals ik het laatst ongeveer heb gedaan:
C#:
1
2
3
WebClient client = new WebClient();
client.Credentials = new NetworkCredential(username, password);
client.UploadFile(ftpServer + new FileInfo(filename).Name, "STOR", filename);

Misschien ook handig om niet enkel te zoeken naar vb.net tutorials/voorbeelden. Vaak zijn C# voorbeelden makkelijk te herschrijven naar vb.net. :)

Die bovenstaande word dan zoiets:
Visual Basic .NET:
1
2
3
Dim client As WebClient = new WebClient()
client.Credentials = new NetworkCredential(username, password)
client.UploadFile(ftpServer + new FileInfo(filename).Name, "STOR", filename)

Enkel System.Net (voor webclient) en System.IO (voor fileinfo) 'importeren' (in vb.net met Imports)

  • monnick
  • Registratie: December 2005
  • Niet online
Dank voor jullie reacties, ik ga er mee aan de gang. Als ik er dan nog niet uitkom zal ik hier wel weer eens posten.

  • monnick
  • Registratie: December 2005
  • Niet online
Als ik daarop zoek kom ik uiteindelijk uit op deze pagina. Dat gaat de WebClient Class. In het voorbeeld staat een class die verbinding maakt met een FTP of URI [By default, the .NET Framework supports URIs that begin with http:, https:, ftp:, and file: scheme identifiers.. Alleen ik ben helaas niet zo goed met klassen. Ik zie in dit voorbeeld script zeg maar nergens waar een host wordt opgegeven.

Class:
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
Imports System
Imports System.Net
Imports System.IO



Public Class Test
    
    Public Shared Sub Main(args() As String)
        If args Is Nothing OrElse args.Length = 0 Then
            Throw New ApplicationException("Specify the URI of the resource to retrieve.")
        End If
        Dim client As New WebClient()
        
        ' Add a user agent header in case the 
        ' requested URI contains a query.
        client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)")
        
        Dim data As Stream = client.OpenRead(args(0))
        Dim reader As New StreamReader(data)
        Dim s As String = reader.ReadToEnd()
        Console.WriteLine(s)
        data.Close()
        reader.Close()
    End Sub 'Main
End Class 'Test


Of is args de URI waar verbonden mee moet worden?

Als iemand mij een beetje kan helpen -> alvast bedankt :)

EDIT: Na nog even rond te zoeken vind ik deze tutorial. Hier wordt met de FTP verbonden ook dmv de FTPwebRequest class. Deze code ziet er in mijn ogen veel duidelijker uit. Kan ik deze tutorial lezen?

Dank.

[ Voor 8% gewijzigd door monnick op 20-09-2006 16:50 ]


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
args() zijn commandline parameters. Je zult de URL dus aan de commandline moeten opgeven, bijvoorbeeld.
program.exe http://www.google.nl

In Visual Studio kun je voor Debug sessies je eigen commandline variabelen instellen. Maar dit had je natuurlijk zelf ook wel in de help kunnen vinden.

It’s nice to be important but it’s more important to be nice


  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 13-02 13:59

CodeIT

Code IT

In arg staan de argumenten (het is een stringarray). Meestal komen deze vanaf de commandline zo binnen in je app.
als je deze executable dus aanroept met: text.exe "ftp://eenwebsite.nl" verbindt test.exe dus met de ftp server op eenwebsite.nl.

De link die je aangeeft is niet echt een tutorial. Het is een knakker die een klasse heeft geschreven waarmee je makkelijk met je FTP server kan praten. Die kun je dus ook gebruiken (je hoeft dan zelf niet "STOR" etc te gebruiken)
edit:
Crap, net te laat....

[ Voor 36% gewijzigd door CodeIT op 20-09-2006 16:56 ]


  • monnick
  • Registratie: December 2005
  • Niet online
Die tutorial na mijn edit is toch wel echt een tutorial, ik zie in dat hele script daar geen classe staan. Maar nu ik weet wat args() is / zijn. Kan ik wel verder met dat script.

Nogmaals bedankt! :>

  • monnick
  • Registratie: December 2005
  • Niet online
Na even aankloten en weer rondlezen heb ik gevonden hoe ik verbinding maak met de server. Alleen nu het probleem, hoe inloggen op de server. Ik heb gevonden dat ik daar voor credentials moet gebruiken. Met hulp van google en MSDN maakt ik het volgende:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Imports System
Imports System.Net
Imports System.IO

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strHost As String = "192.168.1.2"
        Dim intPort As Integer = 50000
        Dim strUsername As String = "monnick"
        Dim strPassword As String = "******"

        Dim ftp As System.Net.FtpWebRequest = CType(FtpWebRequest.Create("ftp://" & strHost & ":" & intPort), FtpWebRequest)

        ' In loggen op server werkt niet
        Dim value As ICredentials
        value = ftp.Credentials(strUsername, strPassword)
        ' einde inloggen


    End Sub
End Class


Alleen dit werkt helaas niet omdat ik de volgende error krijg bij het uitvoeren:

Error 1 Interface 'System.Net.ICredentials' cannot be indexed because it has no default property.

Iemand een uitleg / code of linkje waarmee ik er wel uit kom hoe ik kan inloggen op de server?

bvd. :)

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 22:01
google heeft altijd het antwoord:
http://www.google.nl/sear...tp+.net&btnG=Zoeken&meta=
En dan de codeproject link

  • monnick
  • Registratie: December 2005
  • Niet online
Haha, die link gaf ik zelf eerder dit topic ook al. Erg stom van me, maar in ieder geval bedankt!
Met help van de link die je gaf heb ik hem werkend, een bestand wordt gedownload. Ik snap alleen het laatste stuk code binnen de usings nog niet helemaal, maar dat ga ik nu proberen te begrijpen.

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
Imports System
Imports System.Net
Imports System.IO

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' Declare variables
        Dim strHost As String = "ftp://192.168.1.2:50000/"
        Dim strUsername As String = "monnick"
        Dim strPassword As String = "****"
        Dim strFile As String = "IO.SYS"
        Dim strLocalfile As String = "C:\BLAAT.SYS"

        ' Define full URI string
        Dim URI As String = strHost & strFile

        ' Establish FTP connection
        Dim ftp As System.Net.FtpWebRequest = CType(FtpWebRequest.Create(URI), FtpWebRequest)
        ' Login to FTP server
        ftp.Credentials = New System.Net.NetworkCredential(strUsername, strPassword)

        ' Set some settings
        ftp.KeepAlive = True
        ftp.UseBinary = True
        ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile

        ' Download the file to local computer
        Using response As System.Net.FtpWebResponse = CType(ftp.GetResponse, System.Net.FtpWebResponse)
            Using responseStream As IO.Stream = response.GetResponseStream
                Using fs As New IO.FileStream(strLocalfile, IO.FileMode.Create)

                    Dim buffer(2047) As Byte
                    Dim read As Integer = 0
                    Do
                        read = responseStream.Read(buffer, 0, buffer.Length)
                        fs.Write(buffer, 0, read)
                    Loop Until read = 0
                    responseStream.Close()
                    fs.Flush()
                    fs.Close()
                End Using
                responseStream.Close()
            End Using
            response.Close()
        End Using

    End Sub
End Class


dank allemaal! O+

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 22:01
Using heeft te maken dat je bepaalde resources van je classes weer vrijgeeft op het moment dat je buiten je using-scope gaat. Stukje netheid qua geheugengebruik zeg maar.
The using statement obtains one or more resources, executes a statement, and then disposes of the resource.
http://msdn.microsoft.com.../vclrfcsharpspec_8_13.asp

Wederom gevonden op google ;)

  • monnick
  • Registratie: December 2005
  • Niet online
DrClearbottom schreef op woensdag 20 september 2006 @ 21:44:
Using heeft te maken dat je bepaalde resources van je classes weer vrijgeeft op het moment dat je buiten je using-scope gaat. Stukje netheid qua geheugengebruik zeg maar.


[...]

http://msdn.microsoft.com.../vclrfcsharpspec_8_13.asp

Wederom gevonden op google ;)
Dank ik zal je linkje even bekijken. En wat jij allemaal niet vind op Google ;)

  • monnick
  • Registratie: December 2005
  • Niet online
Na weer even aankloten ben ik wat verder met mijn FTP connectie scriptje. Ik probeer verbinding te maken en in te loggen en een beetje op status / errors te checken. Misschien dat jullie mij wat tips / commentaar over mijn code kunnen geven. (btw. het host adres wordt nog niet genoeg gechecked)


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
Imports System
Imports System.Net
Imports System.IO

Public Class ftpConnect

    Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
        ' Declare variables
        Dim strHost As String = txtAddress.Text
        Dim strPort As String = txtPort.Text
        Dim strUsername As String = txtUsername.Text
        Dim strPassword As String = txtPassword.Text
        Dim URI As String
        Dim intPort As Integer

        ' Check if host address is valid
        If strHost.Length > 10 Then
            If strHost.Substring(0, 5) <> "ftp://" Then
                strHost = "ftp://" & strHost
            End If
        Else
            MsgBox("You entered an invalid host address!")
            Me.Close()
        End If

        ' Check the Port
        If IsNumeric(strPort) Then
            intPort = CInt(strPort)

            If intPort <= 0 Or intPort > 65000 Then
                MsgBox("You entered an incorrect port! 2")
                Me.Close()
            End If
        Else
            MsgBox("You entered an incorrect port! 1")
            Me.Close()
        End If

        ' Create the full ftp address
        URI = strHost & ":" & intPort

        If URI.EndsWith("/") Then
        Else
            URI = URI & "/"
        End If

        ' Start try statement
        Try
            ' Establish FTP connection
            Dim ftp As System.Net.FtpWebRequest = CType(FtpWebRequest.Create(URI), FtpWebRequest)
            ' Login to FTP server
            If strUsername.Length <> 0 Or strPassword.Length <> 0 Then
                ftp.Credentials = New System.Net.NetworkCredential(strUsername, strPassword)
            End If

            ' Set some settings
            ftp.KeepAlive = True
            ftp.UseBinary = True
            ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile

            ' Check for response
            Using Response As System.Net.FtpWebResponse = CType(ftp.GetResponse, System.Net.FtpWebResponse)
                ' Create response string
                Using ResponseStream As IO.Stream = Response.GetResponseStream
                    ' Logged in -> Do action
                End Using
            End Using

        Catch ex As WebException
            MsgBox(ex.Message)
        End Try

    End Sub
End Class


PS. Hiermee bezig zijn is trouwens super leerzaam :)

En voor ik het vergeet, ik zat nog met een simpel vraagje. Ik doe nu dit:

Visual Basic:
1
2
3
4
If URI.EndsWith("/") Then
        Else
            URI = URI & "/"
        End If


Dit is dus super onhandig, hoe kan ik maken iets van als de URI niet eindigt met / dan: doe dit.

In PHP zou je er dan gewoon een ! voor kunnen zetten.

weer bvd. :>

  • Keess
  • Registratie: Augustus 2006
  • Laatst online: 10-02 13:05
Ik heb Visual Studio hier niet bij de hand, maar is dat niet gewoon:
Visual Basic:
1
If NOT URI.EndsWith("/") Then

  • user109731
  • Registratie: Maart 2004
  • Niet online
Wat je nu gebruikt is eigenlijk hetzelfde als URI.EndsWith("/") = True, hier kun je dus = False voor gebruiken of NOT, zoals Keess al zegt.

Ik probeer zelf altijd zo weinig mogelijk IF's te nesten, dat houd het wat leesbaarder:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
' Check if host address is valid
If strHost.Length > 10 Then
  If strHost.Substring(0, 5) <> "ftp://" Then
    strHost = "ftp://" & strHost
  End If
Else
  MsgBox("You entered an invalid host address!")
  Me.Close()
End If 

Zou ik zelf zo doen:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
' Check if host address is valid
If strHost.Length < 10 Then
  MsgBox("You entered an invalid host address!")
  Me.Close()
End If

If strHost.Substring(0, 5) <> "ftp://" Then
  strHost = "ftp://" & strHost
End If

En Google ook eens op de Uri en Uribuilder classes, die kunnen wel wat werk besparen denk ik. Al is het erg leerzaam om het zelf te doen natuurlijk :)

edit: en door Imports System.Net bovenaan in je code te zetten hoef je niet meer telkens System.Net voor FtpWebResponse ed te zetten.

[ Voor 8% gewijzigd door user109731 op 21-09-2006 20:39 ]


  • monnick
  • Registratie: December 2005
  • Niet online
dank jullie wel voor de reacties. Ik ga weer aan de slag om het te verbeteren en verder te maken.

Ik wil een soort van notepad maken waarbij als je het bestand opslaat hij het automatisch versleuteld op een ftp server zet. Nog veel werk te gaan dus, maar ik ga me best doen want het is tevens een erg goede oefening.

  • monnick
  • Registratie: December 2005
  • Niet online
Ik ben nu bezig met het gedeelte om een bestand up te loaden.

Ik wil aan de gang met deze download code, alleen ik weet niet zo goed hoe ik dit moet laten omvormen tot upload code. Iemand die mij op weg kan helpen?

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
ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile

'4. If we were using a method that uploads data e.g. UploadFile
'   we would open the ftp.GetRequestStream here an send the data

'5. Get the response to the Ftp request and the associated stream
Using response As System.Net.FtpWebResponse = _
      CType(ftp.GetResponse, System.Net.FtpWebResponse)
  Using responseStream As IO.Stream = response.GetResponseStream
    'loop to read & write to file
    Using fs As New IO.FileStream(localFile, IO.FileMode.Create)
      Dim buffer(2047) As Byte
      Dim read As Integer = 0
      Do
        read = responseStream.Read(buffer, 0, buffer.Length)
        fs.Write(buffer, 0, read)
      Loop Until read = 0 'see Note(1)
      responseStream.Close()
      fs.Flush()
      fs.Close()
    End Using
    responseStream.Close()
  End Using
  response.Close()
End Using


Ik gebruik trouwens nu WebRequest(), ik lees ook veel over WebClient(). Qua gebruik ziet WebClient() er makkelijker uit. Is dat het ook, en kan ik dit zomaar gebruiken, of is het gebruik van WebRequest meet aan te raden? :P

  • user109731
  • Registratie: Maart 2004
  • Niet online
Ik weet ook niet goed wanneer je welke het beste kunt gebruiken, maar hierboven heb ik wat code gepost om in 3 regels met webclient een bestand up te loaden :P

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Beste monnick,
Alles allemaal leuk en aardig, maar pas je een beetje op dat het niet een "hou je mij even aan mijn handje"-topic gaat worden? Je leest vanalles zie ik, maar ik zie niet in waarom je iets niet zélf zou uitvogelen of gewoon domweg proberen. Neem wat documentatie bij de hand en leef je uit.
Programmeren is zélf denken, zélf doen, zélf debuggen en dus zélf corrigeren. Begrijp me niet verkeerd, als alles zo simpel was had heel [PRG] geen recht van bestaan. Maar ik vind je topic nu toch wel aardig verzanden in een "effe vlug wat vraagjes"-topic. Ik verzoek je dan ook vriendelijk wat meer moeite te doen en je wat meer te verdiepen in de dingen waar je mee bezig bent.

Buiten dat alles zie ik dat je code 1 op 1 van een site komt. Dat is niet erg, maar die code staat er met een doel: jou bijschaven in hoe je iets zou kunnen doen. Er is geen "dé" code om iets te doen. Iets uploaden, iets downloaden, een 3D game engine en zelfs "hello world" kun je op een ontelbaar aantal manieren in elkaar zetten. Programmeren is dus niet het 'uit je kop leren' van 'de codes' zoals je dat bij Duits deed (dem, der, die, das und noch sowas :+ ) maar een kwestie van logisch denken en redeneren zoals je dat bijvoorbeeld bij wiskunde zou doen: 1+1 = 2, 1+2 = 3, hoeveel zou 1+3 dan zijn? En 1+19? Die "combinaties" heb je niet allemaal uit je hoofd gestampt maar je krijgt het inzicht. Daar dient die code die je overal vindt, maar vooral in de documentatie en helpfiles, voor. Niet om 1 : 1 over te nemen ;) En al helemaal niet om ons dan dat stuk code om te laten bouwen ;)

[ Voor 41% gewijzigd door RobIII op 21-09-2006 22:14 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • monnick
  • Registratie: December 2005
  • Niet online
RobIII schreef op donderdag 21 september 2006 @ 22:08:
Beste monnick,
Alles allemaal leuk en aardig, maar pas je een beetje op dat het niet een "hou je mij even aan mijn handje"-topic gaat worden? Je leest vanalles zie ik, maar ik zie niet in waarom je iets niet zélf zou uitvogelen of gewoon domweg proberen. Neem wat documentatie bij de hand en leef je uit.
Programmeren is zélf denken, zélf doen, zélf debuggen en dus zélf corrigeren. Begrijp me niet verkeerd, als alles zo simpel was had heel [PRG] geen recht van bestaan. Maar ik vind je topic nu toch wel aardig verzanden in een "effe vlug wat vraagjes"-topic. Ik verzoek je dan ook vriendelijk wat meer moeite te doen en je wat meer te verdiepen in de dingen waar je mee bezig bent.
Ik besteed er echt wel tijd aan om dingen op te zoeken en uittevogelen. Zo heb ik ten eerste zelf uitgevogeld hoe ik aan een error check kan doen. (Met Try, Catch & WebException). Daarna ging ik op zoek voor upload. Daar vind ik helaas alleen maar upload scripts / regels die gebruik maken dmv WebClient(), en helaas daar heb ik niks aan want ik werk met WebRequest(). Verder heb ik aangekloot om het zelf te veranderen, alleen ik snap bijzonder weinig van wat die buffer doet.

Ik hoor ook wel iedereen over MSDN, een geweldige documentatie van MS. Nou ik vind dus van niet. De helft van de tijd werkt die hele site niet, of de laadtijden zijn zo'n 30 seconden om een pagina te openen. Verder staat er dan een klein regeltje hoe je die functie of method moet declareren, maar daar houdt het dan ook wel mee op.

Ik vraag trouwens ook helemaal niet of iemand mijn code kan ombouwen maar of iemand mij op weg kan helpen. Maar goed, ik zal nog meer zoeken op het lieve Google.

Ik vind trouwens ook niet dat dit een "even vlug een vraagje" topic. :/

  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 13-02 13:59

CodeIT

Code IT

monnick schreef op vrijdag 22 september 2006 @ 08:19:
[...]


Ik besteed er echt wel tijd aan om dingen op te zoeken en uittevogelen. Zo heb ik ten eerste zelf uitgevogeld hoe ik aan een error check kan doen. (Met Try, Catch & WebException). Daarna ging ik op zoek voor upload. Daar vind ik helaas alleen maar upload scripts / regels die gebruik maken dmv WebClient(), en helaas daar heb ik niks aan want ik werk met WebRequest(). Verder heb ik aangekloot om het zelf te veranderen, alleen ik snap bijzonder weinig van wat die buffer doet.

Ik hoor ook wel iedereen over MSDN, een geweldige documentatie van MS. Nou ik vind dus van niet. De helft van de tijd werkt die hele site niet, of de laadtijden zijn zo'n 30 seconden om een pagina te openen. Verder staat er dan een klein regeltje hoe je die functie of method moet declareren, maar daar houdt het dan ook wel mee op.

Ik vraag trouwens ook helemaal niet of iemand mijn code kan ombouwen maar of iemand mij op weg kan helpen. Maar goed, ik zal nog meer zoeken op het lieve Google.

Ik vind trouwens ook niet dat dit een "even vlug een vraagje" topic. :/
Je hoeft ook niet voor alles naar MSDN te rennen. Er staat al heel veel informatie over de verschillende klasses en hun methods in de offline help (druk maar eens op Ctrl+Alt+F3). Voor de meeste methods is ook een example beschikbaar.
Pagina: 1