Avatar billede peter_svendsen Nybegynder
18. maj 2006 - 16:48 Der er 9 kommentarer og
1 løsning

ftp up/download

Jeg fundet en løsning, men bryder mig ikke så meget om den, så jeg håber i har en bedre løsning. Nedenfor er vist den løsning jeg har fundet ud af hvor man benytter ftp.exe og en tekstfil til at indeholde ftp informationerne. Jeg synes ikke den er så sikkerhedsmæssigt stabil, så jeg håbede der var en bedre måde.


Jeg har fundet ud af hvordan jeg kan logge på ftp vha. 'DOS' vinduet.
Har rodet en del rundt i koden siden, men det var noget i den her retning.

ProcessStartInfo p = new ProcessStartInfo(ftp.exe);
p.Arguments = @" -s:c:\ftpTest\send.txt";
Process.Start(p);

send.txt indeholder så ftp kommandoerne som f.eks.

open ftp.site.dk
login1
pass1
cd uploadFolder
LCD C:\uploadFolder
send fil.xml
bye



Jeg arbejder i .net 2003
Avatar billede Spotgun Seniormester
18. maj 2006 - 16:53 #1
Prøv evt. at kigge på denne .Net FTP Client komponent:
http://www.enterprisedt.com/products/edtftpnet/overview.html
Avatar billede arne_v Ekspert
18. maj 2006 - 16:58 #2
.NET 2.0 : har indbygget support for FTP protokol og du kan bruge en normal
WebRequest (jeg har noget kode til upload liggende hvis det har interesse)

for .NET 1.x skal du have fat paa noget kode som implementerer FTP
protokollen - der er en del kode ude paa nettet - og jeg har ogsaa en
nogle ghjemmestrikkede kode eksempler liggende
Avatar billede peter_svendsen Nybegynder
18. maj 2006 - 20:12 #3
Jeg har ikke været særlig heldig med de andre komponenter jeg selv faldt over, men jeg kigger lige lidt på det link du har givet Shotgun.

Arne, projektet er desværre et .NET 1.1 projekt, så jeg kan desværre ikke udnytte de nye ftp løsninger.
Det er ikke et emne jeg ved så meget om, så et link, nogle gode søgeord eller eller et udpluk fra det du har lavet ville være en stor hjælp.

/Peter
Avatar billede arne_v Ekspert
18. maj 2006 - 20:16 #4
jeg lavede det her engang i september 2004 til et andet spoergsmaal:

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

public class FtpClient
{
    private TcpClient ctrl;
    private NetworkStream ctrlstm;
    private TcpClient data;
    private NetworkStream datastm;
    private static void Send(NetworkStream stm, string line)
    {
        byte[] b = Encoding.Default.GetBytes(line);
        stm.Write(b, 0, b.Length);
    }
    private static string Receive(NetworkStream stm)
    {
        byte[] b = new byte[100000];
        int ix = 0;
        int n;
        while(stm.DataAvailable)
        {
            n = stm.Read(b, ix, b.Length - ix);
            ix += n;
        }
        return Encoding.Default.GetString(b, 0, ix);
    }
    public static string Command(NetworkStream stm, string cmd)
    {
        Send(stm, cmd + "\r\n");
        Thread.Sleep(50);
        return Receive(stm);
    }
    private void SetupData()
    {
        string dataaddr = Command(ctrlstm, "PASV");
        string[] addrparts = dataaddr.Split("()".ToCharArray())[1].Split(",".ToCharArray());
        string datahost = addrparts[0] + "." + addrparts[1] + "." + addrparts[2] + "." + addrparts[3];
        int dataport = int.Parse(addrparts[4]) * 256 + int.Parse(addrparts[5]);
        data = new TcpClient(datahost, dataport);
        datastm = data.GetStream();
    }
    public FtpClient(string host, string username, string password)
    {
        ctrl = new TcpClient(host, 21); 
        ctrlstm = ctrl.GetStream();
        Command(ctrlstm, "USER " + username);
        Command(ctrlstm, "PASS " + password);
    }
    public string Dir()
    {
        SetupData();
        Command(ctrlstm, "LIST");
        string res = Receive(datastm);
        Receive(ctrlstm);
        datastm.Close();
        data.Close();
        return res;
    }
    public string ShortDir()
    {
        SetupData();
        Command(ctrlstm, "NLST");
        string res = Receive(datastm);
        Receive(ctrlstm);
        datastm.Close();
        data.Close();
        return res;
    }
    public void MkDir(string dir)
    {
        Command(ctrlstm, "MKD " + dir);
    }
    public void RmDir(string dir)
    {
        Command(ctrlstm, "RMD " + dir);
    }
    public void ChDir(string dir)
    {
        Command(ctrlstm, "CWD " + dir);
    }
    public void UpLoad(string filename, bool binary)
    {
        if(binary)
        {
            Command(ctrlstm, "TYPE I");
        }
        else
        {
            Command(ctrlstm, "TYPE A");
        }
        SetupData();
        Command(ctrlstm, "STOR " + filename);
        Receive(ctrlstm);
        FileStream f = new FileStream(filename, FileMode.Open);
        byte[] b = new byte[100000];
        int ix = 0;
        int n;
        while(ix < f.Length)
        {
            n = f.Read(b, 0, b.Length);
            datastm.Write(b, 0, n);
            Thread.Sleep(100);
            ix += n;
        }
        f.Close();
        datastm.Close();
        data.Close();
    }
    public void DownLoad(string filename, bool binary)
    {
        if(binary)
        {
            Command(ctrlstm, "TYPE I");
        }
        else
        {
            Command(ctrlstm, "TYPE A");
        }
        SetupData();
        Command(ctrlstm, "RETR " + filename);
        Receive(ctrlstm);
        FileStream f = new FileStream(filename, FileMode.Create);
        byte[] b = new byte[100000];
        int n;
        while(datastm.DataAvailable)
        {
            n = datastm.Read(b, 0, b.Length);
            f.Write(b, 0, n);
            Thread.Sleep(100);
        }
        f.Close();
        datastm.Close();
        data.Close();
    }
    public void Logout()
    {
        Command(ctrlstm, "QUIT");
        ctrlstm.Close();
        ctrl.Close();
    }
}

class TestClass
{
    public static void Main(string[] args)
    {
        FtpClient cli = new FtpClient("localhost", "anonymous", "arne@");
        Console.WriteLine(cli.ShortDir());
        Console.WriteLine(cli.Dir());
        Directory.SetCurrentDirectory("C:\\");
        cli.DownLoad("z.zip", true);
        cli.MkDir("subdir");
        cli.ChDir("subdir");
        cli.UpLoad("z.zip", true);
        cli.Logout();
    }
}
Avatar billede arne_v Ekspert
18. maj 2006 - 20:17 #5
koden er ikke production quality bl.a. mangler der ordentligt
haandtering af fejl situationer

men interfacet er simpelt

og koden er overskelig

du kan prove
Avatar billede peter_svendsen Nybegynder
18. maj 2006 - 20:29 #6
Mange tak.

Fejlhåndtering og tilsvarende skal jeg nok selv rode med. Så længe kærneproblemet bliver løst.

Jeg kigger på tingene og vender tilbage hertil når det er testet.
Avatar billede peter_svendsen Nybegynder
22. maj 2006 - 12:25 #7
Hmm, mistede lige min kommentar, så prøver lige igen

Det virker, så smid et svar, så du kan få dine fuldt fortjente point.

Det er desværre ikke hver gang at det virker 100%, så det kan være du kan give mig et hint om hvad det kan være der går galt.
Jeg bruger shortdir til at hente en filliste, som jeg looper igennem for at hente alle filerne vha. download funktionen. Det virker i 80% af forsøgene, men nogen gange bliver en eller flere filer ikke hentet rigtigt og får en size på 0, hvor normalen er 3-400Kb.
Avatar billede arne_v Ekspert
22. maj 2006 - 12:58 #8
svar

kig på status koden der returneres på RETR kommandoen
Avatar billede arne_v Ekspert
22. maj 2006 - 12:58 #9
jeg tror iøvrigt at jeg har noget dir output parsning skode liggende et eller
andet sted også
Avatar billede peter_svendsen Nybegynder
22. maj 2006 - 15:36 #10
Jeg har fortsat tråden her: http://www.eksperten.dk/spm/711068

Synes det var bedre stil, da du jo' har svaret på det oprindelige spørgsmål.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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