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.dklogin1
pass1
cd uploadFolder
LCD C:\uploadFolder
send fil.xml
bye
Jeg arbejder i .net 2003
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
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();
}
}
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.