Har jeg fået lavet et lille program som kan overfører nogle filer til en FTP server. Jeg bruger det til at tage backup af mine filer, men nogle af mine filer fylder meget, og bliver sjældent ændret, så det ville være rart hvis man kunne lave noget diffrential backup, så den kun tager de filer som er ændret i forhold til dem som ligger på serveren.
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
Public Class FtpClient Private ctrl As TcpClient Private ctrlstm As NetworkStream Private data As TcpClient Private datastm As NetworkStream
Private Shared Sub Send(ByVal stm As NetworkStream, ByVal line As String) Dim b As Byte() = Encoding.Default.GetBytes(line) stm.Write(b, 0, b.Length) End Sub
Private Shared Function Receive(ByVal stm As NetworkStream) As String Dim b(100000 - 1) As Byte Dim ix As Integer = 0 Dim n As Integer While stm.DataAvailable n = stm.Read(b, ix, b.Length - ix) ix += n End While Return Encoding.Default.GetString(b, 0, ix) End Function
Public Shared Function Command(ByVal stm As NetworkStream, ByVal cmd As String) As String Send(stm, cmd + Convert.ToChar(13) + Convert.ToChar(10)) Thread.Sleep(250) Return Receive(stm) End Function
Private Sub SetupData() Dim dataaddr As String = Command(ctrlstm, "PASV") Dim addrparts As String() = dataaddr.Split("()".ToCharArray)(1).Split(",".ToCharArray) Dim datahost As String = addrparts(0) + "." + addrparts(1) + "." + addrparts(2) + "." + addrparts(3) Dim dataport As Integer = Integer.Parse(addrparts(4)) * 256 + Integer.Parse(addrparts(5)) data = New TcpClient (datahost, dataport) datastm = data.GetStream End Sub
Public Sub New(ByVal host As String, ByVal username As String, ByVal password As String) ctrl = New TcpClient (host, 21) ctrlstm = ctrl.GetStream Command(ctrlstm, "USER " + username) Command(ctrlstm, "PASS " + password) End Sub
Public Function Dir() As String SetupData Command(ctrlstm, "LIST") Dim res As String = Receive(datastm) Receive(ctrlstm) datastm.Close data.Close Return res End Function
Public Function ShortDir() As String SetupData Command(ctrlstm, "NLST") Dim res As String = Receive(datastm) Receive(ctrlstm) datastm.Close data.Close Return res End Function
Public Sub MkDir(ByVal dir As String) Command(ctrlstm, "MKD " + dir) End Sub
Public Sub RmDir(ByVal dir As String) Command(ctrlstm, "RMD " + dir) End Sub
Public Sub ChDir(ByVal dir As String) Command(ctrlstm, "CWD " + dir) End Sub
Public Sub UpLoad(ByVal filename As String, ByVal binary As Boolean) If binary Then Command(ctrlstm, "TYPE I") Else Command(ctrlstm, "TYPE A") End If SetupData Command(ctrlstm, "STOR " + filename) Receive(ctrlstm) Dim f As FileStream = New FileStream (filename, FileMode.Open) Dim b(100000 - 1) As Byte Dim ix As Integer = 0 Dim n As Integer While ix < f.Length n = f.Read(b, 0, b.Length) datastm.Write(b, 0, n) Thread.Sleep(100) ix += n End While f.Close datastm.Close data.Close End Sub
Public Sub DownLoad(ByVal filename As String, ByVal binary As Boolean) If binary Then Command(ctrlstm, "TYPE I") Else Command(ctrlstm, "TYPE A") End If SetupData Command(ctrlstm, "RETR " + filename) Receive(ctrlstm) Dim f As FileStream = New FileStream (filename, FileMode.Create) Dim b(100000 - 1) As Byte Dim n As Integer While datastm.DataAvailable n = datastm.Read(b, 0, b.Length) f.Write(b, 0, n) Thread.Sleep(100) End While f.Close datastm.Close data.Close End Sub
Public Function Dir(ByVal filename As String) As String SetupData Command(ctrlstm, "LIST " + filename) Dim res As String = Receive(datastm) Receive(ctrlstm) datastm.Close data.Close Return res End Function
Public Shared Function Eater(ByVal line As String, ByVal ix As Integer, ByVal n As Integer) As String Dim res As String = "" Dim line2() As Char = line.ToCharArray Dim ws As Integer = 0 Dim i As Integer For i = 1 To (line2.Length - 1) If line2(i) = " " And line2(i-1) <> " " Then ws = ws + 1 End If If ws >= ix And ws < (ix + n) Then res = res & line2(i) End If Next Eater = res.Trim End Function
Public Shared Function ParseTime(ByVal line As String) As String ParseTime = Eater(line, 5, 3) End Function
Public Function FileTime(ByVal filename As String) As DateTime Dim fmt() As String = { "MMM dd HH:mm", "MMM dd yyyy" } FileTime = DateTime.ParseExact(ParseTime(Dir(filename)), fmt, Nothing, DateTimeStyles.AllowWhiteSpaces) End Function
Public Sub Logout() Command(ctrlstm, "QUIT") ctrlstm.Close ctrl.Close End Sub End Class
Class TestClass Public Shared Sub Main(ByVal args As String()) Dim cli As FtpClient = New FtpClient ("localhost", "anonymous", "arne@") Console.WriteLine(cli.FileTime("makefile")) Console.WriteLine(cli.FileTime("mouse.c")) cli.Logout End Sub End Class
230 Anonymous user logged in. ftp> dir 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. 01-13-05 11:47AM 6 test1.txt 01-13-05 11:47AM 6 test2.txt 226 Transfer complete. ftp: 100 byte modtaget på 0.00 sekunder 100000.00 ved Kbyte/sek. ftp>
Hvordan vil du så sætte det op? Jeg synes ikke helt jeg kan se det..
Nu har jeg lige skiftet den over til BulletProof FTP Server, og nu ser formatet således ud, men det virker stadig ikke:
230 User jk logged in. ftp> dir 200 Port command successful. 150 Opening data connection for directory list. -rw-r--r-- 1 ftp ftp 6 Jan 13 11:47 test1.txt -rw-r--r-- 1 ftp ftp 6 Jan 13 11:47 test2.txt 226 Transfer ok ftp: 132 byte modtaget på 0.00 sekunder 132000.00 ved Kbyte/sek. ftp>
Hvis jeg gerne vil have at vinduet bliver oppe indtil jeg trykker på en f.eks "enter", hvordan gør jeg så lige? Nu lukker mit console vindue jo med det samme..
Men ja, jeg tror vist jeg har fået det til at fungere.
Du må meget undskylde den sene respons.
Men her er din velfortjente points.
Tusinde tak for hjælpen
Mvh
Jens K
Synes godt om
Ny brugerNybegynder
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.