Avatar billede dollas Nybegynder
02. august 2004 - 20:27 Der er 33 kommentarer og
1 løsning

ftp forbindelse.

Det må da være muligt på en let og elegant måde at lave en ftp forbindelse med sin app
Avatar billede arne_v Ekspert
02. august 2004 - 20:36 #1
Avatar billede arne_v Ekspert
02. august 2004 - 20:36 #2
ekstra kode
Avatar billede dollas Nybegynder
02. august 2004 - 20:38 #3
http://www.thecodeproject.com/csharp/C__FTP_client.asp
Jeg har lige kompilet denne til en dll, og det fungere men når jeg skal kalde den fra vb så fejler den...
Det her fungere ikke:



        FTPFactory(ff = New FTPFactory)
        ff.setDebug(True)
        ff.setRemoteHost("192.168.0.30")
        ff.setRemoteUser("jaimon")
        ff.setRemotePass("mathew")
        ff.login()
        ff.chdir("incoming")

        fileNames = ff.getFileList("*.*")
           

           
        ff.close()


????
Avatar billede arne_v Ekspert
02. august 2004 - 20:42 #4
Kan du uddybe "så fejler den" ?
Avatar billede arne_v Ekspert
02. august 2004 - 20:43 #5
Det lykkedes mig iø'vrigt også at google en VB.NET'er op:
  http://www.freevbcode.com/ShowCode.asp?ID=4655
Avatar billede dollas Nybegynder
02. august 2004 - 20:43 #6
jeps.
Den siger "FTPFactory' is a type and cannot be used as an expression."

Det er denne her der tilter: "FTPFactory(ff = New FTPFactory)"
Avatar billede dollas Nybegynder
02. august 2004 - 20:44 #7
Den har jeg prøvet og den er ikke til at gennemskue...
Avatar billede arne_v Ekspert
02. august 2004 - 20:51 #8
I VB.NET skal det vel også være:

Dim ff As FTPFactory = New FTPFactory
Avatar billede dollas Nybegynder
02. august 2004 - 20:55 #9
Ja, men den siger Declaration expected. på alle mine ff
Avatar billede arne_v Ekspert
02. august 2004 - 20:59 #10
Må vi en bid kode igen som den ser ud nu ?
Avatar billede dollas Nybegynder
02. august 2004 - 21:07 #11
Dim ff As FTPFactory = New FTPFactory
        ff.setDebug(True)
        ff.setRemoteHost("192.168.0.30")
        ff.setRemoteUser("jaimon")
        ff.setRemotePass("mathew")
        ff.login()
        ff.chdir("incoming")

        fileNames = ff.getFileList("*.*")
Avatar billede arne_v Ekspert
02. august 2004 - 21:13 #12
Og du har tilføjet en reference til assembly'en ?

(fileNames skal naturligvis erklæres med jeg forstår at fejlen kommer inden)
Avatar billede dollas Nybegynder
02. august 2004 - 21:16 #13
ja, altså lavet en referance til min dll fil...

Den siger "Declaration expected" på mine ff'er men de burde jo være dekleret med "Dim ff As FTPFactory = New FTPFactory"

Det kan være at jeg har compilet dll'en forkert?

Det er denne her:
/*
FTPFactory.cs
Better view with tab space=4

Written by Jaimon Mathew (jaimonmathew@rediffmail.com)
Rolander,Dan (Dan.Rolander@marriott.com) has modified the
download
method to cope with file name with path information. He also
provided
the XML comments so that the library provides Intellisense
descriptions.

use the following line to compile
csc /target:library /out:FTPLib.dll /r:System.DLL FTPFactory.cs
*/

using System;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;

namespace FtpLib
{

    public class FTPFactory
    {

        private string
            remoteHost,remotePath,remoteUser,remotePass,mes;
        private int remotePort,bytes;
        private Socket clientSocket;

        private int retValue;
        private Boolean debug;
        private Boolean logined;
        private string reply;

        private static int BLOCK_SIZE = 512;

        Byte[] buffer = new Byte[BLOCK_SIZE];
        Encoding ASCII = Encoding.ASCII;

        public FTPFactory()
        {

            remoteHost  = "localhost";
            remotePath  = ".";
            remoteUser  = "anonymous";
            remotePass  = "jaimon@school2000.co.uk";
            remotePort  = 21;
            debug    = false;
            logined    = false;

        }

        ///
        /// Set the name of the FTP server to connect to.
        ///
        /// Server name
        public void setRemoteHost(string remoteHost)
        {
            this.remoteHost = remoteHost;
        }

        ///
        /// Return the name of the current FTP server.
        ///
        /// Server name
        public string getRemoteHost()
        {
            return remoteHost;
        }

        ///
        /// Set the port number to use for FTP.
        ///
        /// Port number
        public void setRemotePort(int remotePort)
        {
            this.remotePort = remotePort;
        }

        ///
        /// Return the current port number.
        ///
        /// Current port number
        public int getRemotePort()
        {
            return remotePort;
        }

        ///
        /// Set the remote directory path.
        ///
        /// The remote directory path
        public void setRemotePath(string remotePath)
        {
            this.remotePath = remotePath;
        }

        ///
        /// Return the current remote directory path.
        ///
        /// The current remote directory path.
        public string getRemotePath()
        {
            return remotePath;
        }

        ///
        /// Set the user name to use for logging into the remote server.
            ///
            /// Username
            public void setRemoteUser(string remoteUser)
            {
                this.remoteUser = remoteUser;
            }

        ///
        /// Set the password to user for logging into the remote server.
            ///
            /// Password
            public void setRemotePass(string remotePass)
            {
                this.remotePass = remotePass;
            }

        ///
        /// Return a string array containing the remote directory's file list.
            ///
            ///
            ///
            public string[] getFileList(string mask)
            {

                if(!logined)
                {
                    login();
                }

                Socket cSocket = createDataSocket();

                sendCommand("NLST " + mask);

                if(!(retValue == 150 || retValue == 125))
                {
                    throw new IOException(reply.Substring(4));
                }

                mes = "";

                while(true)
                {

                    int bytes = cSocket.Receive(buffer, buffer.Length, 0);
                    mes += ASCII.GetString(buffer, 0, bytes);

                    if(bytes < buffer.Length)
                    {
                        break;
                    }
                }

                char[] seperator = {'\n'};
                string[] mess = mes.Split(seperator);

                cSocket.Close();

                readReply();

                if(retValue != 226)
                {
                    throw new IOException(reply.Substring(4));
                }
                return mess;

            }

        ///
        /// Return the size of a file.
        ///
        ///
        ///
        public long getFileSize(string fileName)
        {

            if(!logined)
            {
                login();
            }

            sendCommand("SIZE " + fileName);
            long size=0;

            if(retValue == 213)
            {
                size = Int64.Parse(reply.Substring(4));
            }
            else
            {
                throw new IOException(reply.Substring(4));
            }

            return size;

        }

        ///
        /// Login to the remote server.
        ///
        public void login()
        {

            clientSocket = new
                Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            IPEndPoint ep = new
                IPEndPoint(Dns.Resolve(remoteHost).AddressList[0], remotePort);

            try
            {
                clientSocket.Connect(ep);
            }
            catch(Exception)
            {
                throw new IOException("Couldn't connect to remote server");
                          }

            readReply();
            if(retValue != 220)
            {
                close();
                throw new IOException(reply.Substring(4));
            }
            if(debug)
                Console.WriteLine("USER "+remoteUser);

            sendCommand("USER "+remoteUser);

            if( !(retValue == 331 || retValue == 230) )
            {
                cleanup();
                throw new IOException(reply.Substring(4));
            }

            if( retValue != 230 )
            {
                if(debug)
                    Console.WriteLine("PASS xxx");

                sendCommand("PASS "+remotePass);
                if( !(retValue == 230 || retValue == 202) )
                {
                    cleanup();
                    throw new IOException(reply.Substring(4));
                }
            }

            logined = true;
            Console.WriteLine("Connected to "+remoteHost);

            chdir(remotePath);

        }

        ///
        /// If the value of mode is true, set binary mode for         downloads.
            /// Else, set Ascii mode.
            ///
            ///
            public void setBinaryMode(Boolean mode)
            {

                if(mode)
                {
                    sendCommand("TYPE I");
                }
                else
                {
                    sendCommand("TYPE A");
                }
                if (retValue != 200)
                {
                    throw new IOException(reply.Substring(4));
                }
            }

        ///
        /// Download a file to the Assembly's local directory,
        /// keeping the same file name.
        ///
        ///
        public void download(string remFileName)
        {
            download(remFileName,"",false);
        }

        ///
        /// Download a remote file to the Assembly's local     directory,
        /// keeping the same file name, and set the resume flag.
        ///
        ///
        ///
        public void download(string remFileName,Boolean resume)
        {
            download(remFileName,"",resume);
        }

        ///
        /// Download a remote file to a local file name which can         include
            /// a path. The local file name will be created or         overwritten,
            /// but the path must exist.
            ///
            ///
            ///
            public void download(string remFileName,string locFileName)
            {
                download(remFileName,locFileName,false);
            }

        ///
        /// Download a remote file to a local file name which can         include
            /// a path, and set the resume flag. The local file name will             be
            /// created or overwritten, but the path must exist.
            ///
            ///
            ///
            ///
            public void download(string remFileName,string
                locFileName,Boolean resume)
            {
                if(!logined)
                {
                    login();
                }

                setBinaryMode(true);

                Console.WriteLine("Downloading file "+remFileName+" from "+remoteHost + "/"+remotePath);

                        if (locFileName.Equals(""))
                        {
                            locFileName = remFileName;
                        }

                if(!File.Exists(locFileName))
                {
                    Stream st = File.Create(locFileName);
                    st.Close();
                }

                FileStream output = new
                    FileStream(locFileName,FileMode.Open);

                Socket cSocket = createDataSocket();

                long offset = 0;

                if(resume)
                {

                    offset = output.Length;

                    if(offset > 0 )
                    {
                        sendCommand("REST "+offset);
                        if(retValue != 350)
                        {
                            //throw new IOException(reply.Substring(4));
                            //Some servers may not support resuming.
                            offset = 0;
                        }
                    }

                    if(offset > 0)
                    {
                        if(debug)
                        {
                            Console.WriteLine("seeking to " + offset);
                        }
                        long npos = output.Seek(offset,SeekOrigin.Begin);
                        Console.WriteLine("new pos="+npos);
                    }
                }

                sendCommand("RETR " + remFileName);

                if(!(retValue == 150 || retValue == 125))
                {
                    throw new IOException(reply.Substring(4));
                }

                while(true)
                {

                    bytes = cSocket.Receive(buffer, buffer.Length, 0);
                    output.Write(buffer,0,bytes);

                    if(bytes <= 0)
                    {
                        break;
                    }
                }

                output.Close();
                if (cSocket.Connected)
                {
                    cSocket.Close();
                }

                Console.WriteLine("");

                readReply();

                if( !(retValue == 226 || retValue == 250) )
                {
                    throw new IOException(reply.Substring(4));
                }

            }

        ///
        /// Upload a file.
        ///
        ///
        public void upload(string fileName)
        {
            upload(fileName,false);
        }

        ///
        /// Upload a file and set the resume flag.
        ///
        ///
        ///
        public void upload(string fileName,Boolean resume)
        {

            if(!logined)
            {
                login();
            }

            Socket cSocket = createDataSocket();
            long offset=0;

            if(resume)
            {

                try
                {

                    setBinaryMode(true);
                    offset = getFileSize(fileName);

                }
                catch(Exception)
                {
                    offset = 0;
                }
            }

            if(offset > 0 )
            {
                sendCommand("REST " + offset);
                if(retValue != 350)
                {
                    //throw new IOException(reply.Substring(4));
                    //Remote server may not support resuming.
                    offset = 0;
                }
            }

            sendCommand("STOR "+Path.GetFileName(fileName));

            if( !(retValue == 125 || retValue == 150) )
            {
                throw new IOException(reply.Substring(4));
            }

            // open input stream to read source file
            FileStream input = new
                FileStream(fileName,FileMode.Open);

            if(offset != 0)
            {

                if(debug)
                {
                    Console.WriteLine("seeking to " + offset);
                }
                input.Seek(offset,SeekOrigin.Begin);
            }

            Console.WriteLine("Uploading file "+fileName+" to "+remotePath);

                while ((bytes = input.Read(buffer,0,buffer.Length)) > 0)
                {

                    cSocket.Send(buffer, bytes, 0);

                }
            input.Close();

            Console.WriteLine("");

            if (cSocket.Connected)
            {
                cSocket.Close();
            }

            readReply();
            if( !(retValue == 226 || retValue == 250) )
            {
                throw new IOException(reply.Substring(4));
            }
        }

        ///
        /// Delete a file from the remote FTP server.
        ///
        ///
        public void deleteRemoteFile(string fileName)
        {

            if(!logined)
            {
                login();
            }

            sendCommand("DELE "+fileName);

            if(retValue != 250)
            {
                throw new IOException(reply.Substring(4));
            }

        }

        ///
        /// Rename a file on the remote FTP server.
        ///
        ///
        ///
        public void renameRemoteFile(string oldFileName,string
            newFileName)
        {

            if(!logined)
            {
                login();
            }

            sendCommand("RNFR "+oldFileName);

            if(retValue != 350)
            {
                throw new IOException(reply.Substring(4));
            }

            //  known problem
            //  rnto will not take care of existing file.
            //  i.e. It will overwrite if newFileName exist
            sendCommand("RNTO "+newFileName);
            if(retValue != 250)
            {
                throw new IOException(reply.Substring(4));
            }

        }

        ///
        /// Create a directory on the remote FTP server.
        ///
        ///
        public void mkdir(string dirName)
        {

            if(!logined)
            {
                login();
            }

            sendCommand("MKD "+dirName);

            if(retValue != 250)
            {
                throw new IOException(reply.Substring(4));
            }

        }

        ///
        /// Delete a directory on the remote FTP server.
        ///
        ///
        public void rmdir(string dirName)
        {

            if(!logined)
            {
                login();
            }

            sendCommand("RMD "+dirName);

            if(retValue != 250)
            {
                throw new IOException(reply.Substring(4));
            }

        }

        ///
        /// Change the current working directory on the remote FTP     server.
            ///
            ///
            public void chdir(string dirName)
            {

                if(dirName.Equals("."))
                {
                    return;
                }

                if(!logined)
                {
                    login();
                }

                sendCommand("CWD "+dirName);

                if(retValue != 250)
                {
                    throw new IOException(reply.Substring(4));
                }

                this.remotePath = dirName;

                Console.WriteLine("Current directory is "+remotePath);

            }

        ///
        /// Close the FTP connection.
        ///
        public void close()
        {

            if( clientSocket != null )
            {
                sendCommand("QUIT");
            }

            cleanup();
            Console.WriteLine("Closing...");
        }

        ///
        /// Set debug mode.
        ///
        ///
        public void setDebug(Boolean debug)
        {
            this.debug = debug;
        }

        private void readReply()
        {
            mes = "";
            reply = readLine();
            retValue = Int32.Parse(reply.Substring(0,3));
        }

        private void cleanup()
        {
            if(clientSocket!=null)
            {
                clientSocket.Close();
                clientSocket = null;
            }
            logined = false;
        }

        private string readLine()
        {

            while(true)
            {
                bytes = clientSocket.Receive(buffer, buffer.Length, 0);
                mes += ASCII.GetString(buffer, 0, bytes);
                if(bytes < buffer.Length)
                {
                    break;
                }
            }

            char[] seperator = {'\n'};
            string[] mess = mes.Split(seperator);

            if(mes.Length > 2)
            {
                mes = mess[mess.Length-2];
            }
            else
            {
                mes = mess[0];
            }

            if(!mes.Substring(3,1).Equals(" "))
            {
                return readLine();
            }

            if(debug)
            {
                for(int k=0;k < mess.Length-1;k++)
                {
                    Console.WriteLine(mess[k]);
                }
            }
            return mes;
        }

        private void sendCommand(String command)
        {

            Byte[] cmdBytes =
                Encoding.ASCII.GetBytes((command+"\r\n").ToCharArray());
            clientSocket.Send(cmdBytes, cmdBytes.Length, 0);
            readReply();
        }

        private Socket createDataSocket()
        {

            sendCommand("PASV");

            if(retValue != 227)
            {
                throw new IOException(reply.Substring(4));
            }

            int index1 = reply.IndexOf('(');
            int index2 = reply.IndexOf(')');
            string ipData =
                reply.Substring(index1+1,index2-index1-1);
            int[] parts = new int[6];

            int len = ipData.Length;
            int partCount = 0;
            string buf="";

            for (int i = 0; i < len && partCount <= 6; i++)
            {

                char ch = Char.Parse(ipData.Substring(i,1));
                if (Char.IsDigit(ch))
                    buf+=ch;
                else if (ch != ',')
                {
                    throw new IOException("Malformed PASV reply: " +
                        reply);
                }

                if (ch == ',' || i+1 == len)
                {

                    try
                    {
                        parts[partCount++] = Int32.Parse(buf);
                        buf="";
                    }
                    catch (Exception)
                    {
                        throw new IOException("Malformed PASV reply: " +
                            reply);
                    }
                }
            }

            string ipAddress = parts[0] + "."+ parts[1]+ "." +
                parts[2] + "." + parts[3];

            int port = (parts[4] << 8) + parts[5];

            Socket s = new
                Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            IPEndPoint ep = new
                IPEndPoint(Dns.Resolve(ipAddress).AddressList[0], port);

            try
            {
                s.Connect(ep);
            }
            catch(Exception)
            {
                throw new IOException("Can't connect to remote server");
                          }

            return s;
        }

    }
}
Avatar billede arne_v Ekspert
02. august 2004 - 21:24 #14
Tror jeg.

Jeg buildede FTPLib.dll som angivet i toppen:

csc /target:library /out:FTPLib.dll /r:System.DLL FTPFactory.cs

Tilføjede reference til FTPLib.dll og så compilede dette:

Imports System

Imports FtpLib

Module Main
    Sub Main()
        Dim ff As FTPFactory = New FTPFactory
        ff.setDebug(True)
        ff.setRemoteHost("192.168.0.30")
        ff.setRemoteUser("jaimon")
        ff.setRemotePass("mathew")
        ff.login()
        ff.chdir("incoming")
        Dim fileNames() As String = ff.getFileList("*.*")    End Sub
End Module
Avatar billede dollas Nybegynder
02. august 2004 - 21:53 #15
og det virkede eller ???

Du må meget gerne sende den kolpilede dll fil til mig david@dollas.dk
Avatar billede arne_v Ekspert
02. august 2004 - 21:57 #16
Det compilede. Det kører næppe (IP adresse, brugernavn og password
passer jo ikke på noget).
Avatar billede dollas Nybegynder
02. august 2004 - 21:57 #17
nej, men selv når jeg prøver på min ftp server, så tilter den...
Avatar billede arne_v Ekspert
02. august 2004 - 21:59 #18
Nu bliver jeg lidt forvirret.

Kan du ikke få den til at compile ? (ff etc.)

Eller compiler den fint men du får problemer når du forsøger at køre
programmet ?
Avatar billede dollas Nybegynder
02. august 2004 - 21:59 #19
Det vil ikke virke her...
Avatar billede arne_v Ekspert
02. august 2004 - 22:00 #20
Der er ingen grund til at email DLL.

åben DOS box
"C:\Program Files\Microsoft.NET\SDK\v1.1\bin\sdkvars"
csc /target:library /out:FTPLib.dll /r:System.DLL FTPFactory.cs

så er den buildet (allerhøjest skal du rette dir for .NET SDK)
Avatar billede dollas Nybegynder
02. august 2004 - 22:00 #21
Når jeg prøver at køre koden :

    Dim ff As FTPFactory = New FTPFactory
        ff.setDebug(True)
        ff.setRemoteHost("192.168.0.30")
        ff.setRemoteUser("jaimon")
        ff.setRemotePass("mathew")
        ff.login()
        ff.chdir("incoming")
        Dim fileNames() As String = ff.getFileList("*.*")


Så siger den fejl
Avatar billede dollas Nybegynder
02. august 2004 - 22:03 #22
Så er det koden den er gal med... Har du prøvet den? altså koden.`?
Avatar billede arne_v Ekspert
02. august 2004 - 22:11 #23
Jeg havde ikke.

Men jeg gjorde lige.

Virker fint.
Avatar billede dollas Nybegynder
02. august 2004 - 22:12 #24
Nu virker den... Man skal bare ikke lave vb code i et c# miljø! :)

tak for hjælpen,,,
Avatar billede dollas Nybegynder
02. august 2004 - 22:13 #25
Lav lige et svar...

JEg skal lige ordne nogle ikke computer ting, men jeg skal nok give dig point
Avatar billede arne_v Ekspert
02. august 2004 - 22:14 #26
svar
Avatar billede dollas Nybegynder
02. august 2004 - 22:19 #27
Mange tak
Avatar billede dollas Nybegynder
04. august 2004 - 09:18 #28
Hej arne...

Jeg har lige brug for hjælp til noget i den der C# fil... Gidder du ?
Avatar billede arne_v Ekspert
04. august 2004 - 10:10 #29
Bare spørg.

Men det kan godt tage nogle timer inden jeg svarer.

Jeg sidder i Warszawa og underviser !
Avatar billede dollas Nybegynder
04. august 2004 - 10:13 #30
Okay... Hvad underviser du i?

Nå, men når den downloader så kan jeg godt sende antal bytes sendt via console.write i cs filen, men jeg ville jo gerne kunne bruge det i min vb som loader dll'en så jeg kunne lave en processbar, eler noget.

Det jeg har brug for er at den sender antal byte når de er skrevet til en variabel jeg så kan bruge... forstår du?
Avatar billede arne_v Ekspert
04. august 2004 - 18:03 #31
Nogle interne systemer.

Det jeg tror at du skal er:
  - lave en variabel i klassen som indeholder antal bytes up eller downloadet
  - lade start på upload/download sætte den til nul
  - tælle den løbende op under upload/download med antal bytes
  - lave en metode/property som returnerer den variabel

Så har du det du skal bruge.

Så skal din VB kode bare starte upload/download og opdatere progress bar
samtidigt. Det kræver nok en ekstra tråd.
Avatar billede dollas Nybegynder
04. august 2004 - 18:04 #32
noget du kan hjælpe med ???
Avatar billede arne_v Ekspert
04. august 2004 - 18:19 #33
Du mener det sidste med en progressbar som kalder den nye metode og opdaterer
mens der uploades/downloades ?

Jeg er ikke specielt skrap til GUI.

Jeg ville i givet fald skulle læse lidt på det først.
Avatar billede dollas Nybegynder
04. august 2004 - 18:25 #34
JEg skal nok smide nogle point efter dig...

Mine problemer står i at jeg gerne vil kunne uploade og downloade til ftp fra min app... andet er det faktisk ikke... Jeg har også lidt problemer med den der ftp cs dll lib ting... Den kan ikke overføre mere end 7-8 filer afgangen så stopper den...

Nu er jeg jo ikke HARDCORE til CS, men det må da også kunne lade sig gøre bare i vb
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester