FTP-Programm
FTP-Programm
Hallo!
Ich suche ein möglichst kleines FTP-Programm, das auch gar nicht soviel können muss (z.B. reicht eine Verbindung zu 1 Sever gleichzeitig aus).
Sollte stabil sein, Freeware und eben klein. Drag&Drop würde mich auch sehr freuen.
Wichtig: Es sollte unbedingt direkt vom USB-Stick/Diskette/CD-Laufwerk funktionieren.
LeechFTP und SmartFTP hab ich schon probiert.
Dongeschön!
Simon
Ich suche ein möglichst kleines FTP-Programm, das auch gar nicht soviel können muss (z.B. reicht eine Verbindung zu 1 Sever gleichzeitig aus).
Sollte stabil sein, Freeware und eben klein. Drag&Drop würde mich auch sehr freuen.
Wichtig: Es sollte unbedingt direkt vom USB-Stick/Diskette/CD-Laufwerk funktionieren.
LeechFTP und SmartFTP hab ich schon probiert.
Dongeschön!
Simon
Windows XP Pro SP2 - PB 4.00Ich bin Ausländer - fast überall
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
-
- Beiträge: 6267
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
http://www.bradan.net/downloads/Bradan%20FTP.zip Für Windows und Linux .
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
-
- Beiträge: 6267
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Jo, kann ich machen, allerdings wärs nett wenn ich den source wieder bekomm, damit ich eine neue version online stellen kann.bluejoke hat geschrieben:Hallo!
Dein (DD) Client gefällt mir schon rcht gut, du möchtest nicht zufällig den SourceCode freigeben? Hab nämlich ein paar Anregungen (vielleicht magst auch du die einbauen)
Grüße,
Simon
Source:
Code: Alles auswählen
Enumeration
#STARTGADGET
#MAIN
#FILES
#DOWN
#UP
#DELE
#LOGOUT
#ABOUT
#REFRESH
#RENAME
#CHMOD
#LOG
#Text_0
#Text_1
#Text_2
#Text_3
#SERVER
#PORT
#USER
#PASS
#LOGIN
#PROGRESS_INFO
#PROGRESS
#CMD
#STOPGADGET
#Text_00
#Text_10
#Text_20
#Text_30
#Text_40
#Text_50
#USER_READ
#GROUP_READ
#WORLD_READ
#USER_WRITE
#GROUP_WRITE
#WORLD_WRITE
#USER_RUN
#GROUP_RUN
#WORLD_RUN
#NUMERIC
#WORDS
#OK
EndEnumeration
LoadImage(1, "BIN\file.ico")
LoadImage(2, "BIN\folder.ico")
InitNetwork()
Global EOL.s
EOL.s = Chr(13)+Chr(10)
Procedure.s Open_Chmod(chmod.s)
If OpenWindow(1, 0, 0, 320, 240, #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "CHMOD")
If CreateGadgetList(WindowID())
TextGadget(#Text_00, 10, 40, 80, 20, "Owner:")
TextGadget(#Text_10, 10, 70, 80, 20, "Group:")
TextGadget(#Text_20, 10, 100, 80, 20, "World:")
TextGadget(#Text_30, 120, 10, 50, 20, "Read", #PB_Text_Center)
TextGadget(#Text_40, 190, 10, 50, 20, "Write", #PB_Text_Center)
TextGadget(#Text_50, 260, 10, 50, 20, "Run", #PB_Text_Center)
CheckBoxGadget(#USER_READ, 140, 40, 20, 20, "")
CheckBoxGadget(#GROUP_READ, 140, 70, 20, 20, "")
CheckBoxGadget(#WORLD_READ, 140, 100, 20, 20, "")
CheckBoxGadget(#USER_WRITE, 210, 40, 20, 20, "")
CheckBoxGadget(#GROUP_WRITE, 210, 70, 20, 20, "")
CheckBoxGadget(#WORLD_WRITE, 210, 100, 20, 20, "")
CheckBoxGadget(#USER_RUN, 280, 40, 20, 20, "")
CheckBoxGadget(#GROUP_RUN, 280, 70, 20, 20, "")
CheckBoxGadget(#WORLD_RUN, 280, 100, 20, 20, "")
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
StringGadget(#NUMERIC, 10, 150, 300, 20, "000", #ESB_DISABLE_RIGHT)
If chmod = ""
StringGadget(#WORDS, 10, 180, 300, 20, "----------", #ESB_DISABLE_RIGHT)
Else
StringGadget(#WORDS, 10, 180, 300, 20, chmod, #ESB_DISABLE_RIGHT)
EndIf
CompilerElse
StringGadget(#NUMERIC, 10, 150, 300, 20, "000")
If chmod = ""
StringGadget(#WORDS, 10, 180, 300, 20, "----------")
Else
StringGadget(#WORDS, 10, 180, 300, 20, chmod)
EndIf
CompilerEndIf
ButtonGadget(#OK, 10, 210, 300, 20, "OK")
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
FlatGadgetAll(#Text_00, #OK)
CompilerEndIf
Repeat
Event = WaitWindowEvent()
If EventWindowID() = 1
Select Event
Case #PB_Event_CloseWindow
Q = 1
Case #PB_Event_Gadget
GID = EventGadgetID()
If GID = #OK
chmod = GetGadgetText(#NUMERIC)
Q = 1
ElseIf GID >= #USER_READ And GID <= #WORLD_RUN
User1.s = Str(GetGadgetState(#USER_READ)*4+GetGadgetState(#USER_WRITE)*2+GetGadgetState(#USER_RUN)*1)
Group1.s = Str(GetGadgetState(#GROUP_READ)*4+GetGadgetState(#GROUP_WRITE)*2+GetGadgetState(#GROUP_RUN)*1)
World1.s = Str(GetGadgetState(#WORLD_READ)*4+GetGadgetState(#WORLD_WRITE)*2+GetGadgetState(#WORLD_RUN)*1)
SetGadgetText(#NUMERIC, User1+Group1+World1)
Num.s = GetGadgetText(#NUMERIC)
User2.l = Val(Mid(Num, 1, 1))
Group2.l = Val(Mid(Num, 2, 1))
World2.l = Val(Mid(Num, 3, 1))
Txt.s = GetGadgetText(#WORDS)
If User2 & 4
PokeB(@Txt+1, 'r')
Else
PokeB(@Txt+1, '-')
EndIf
If User2 & 2
PokeB(@Txt+2, 'w')
Else
PokeB(@Txt+2, '-')
EndIf
If User2 & 1
PokeB(@Txt+3, 'x')
Else
PokeB(@Txt+3, '-')
EndIf
If Group2 & 4
PokeB(@Txt+4, 'r')
Else
PokeB(@Txt+4, '-')
EndIf
If Group2 & 2
PokeB(@Txt+5, 'w')
Else
PokeB(@Txt+5, '-')
EndIf
If Group2 & 1
PokeB(@Txt+6, 'x')
Else
PokeB(@Txt+6, '-')
EndIf
If World2 & 4
PokeB(@Txt+7, 'r')
Else
PokeB(@Txt+7, '-')
EndIf
If World2 & 2
PokeB(@Txt+8, 'w')
Else
PokeB(@Txt+8, '-')
EndIf
If World2 & 1
PokeB(@Txt+9, 'x')
Else
PokeB(@Txt+9, '-')
EndIf
SetGadgetText(#WORDS, Txt)
ElseIf GID = #NUMERIC
Num.s = GetGadgetText(#NUMERIC)
User2.l = Val(Mid(Num, 1, 1))
Group2.l = Val(Mid(Num, 2, 1))
World2.l = Val(Mid(Num, 3, 1))
SetGadgetState(#USER_READ , User2 & 4)
SetGadgetState(#USER_WRITE , User2 & 2)
SetGadgetState(#USER_RUN , User2 & 1)
SetGadgetState(#GROUP_READ , Group2 & 4)
SetGadgetState(#GROUP_WRITE, Group2 & 2)
SetGadgetState(#GROUP_RUN , Group2 & 1)
SetGadgetState(#WORLD_READ , World2 & 4)
SetGadgetState(#WORLD_WRITE, World2 & 2)
SetGadgetState(#WORLD_RUN , World2 & 1)
Txt.s = GetGadgetText(#WORDS)
If User2 & 4
PokeB(@Txt+1, 'r')
Else
PokeB(@Txt+1, '-')
EndIf
If User2 & 2
PokeB(@Txt+2, 'w')
Else
PokeB(@Txt+2, '-')
EndIf
If User2 & 1
PokeB(@Txt+3, 'x')
Else
PokeB(@Txt+3, '-')
EndIf
If Group2 & 4
PokeB(@Txt+4, 'r')
Else
PokeB(@Txt+4, '-')
EndIf
If Group2 & 2
PokeB(@Txt+5, 'w')
Else
PokeB(@Txt+5, '-')
EndIf
If Group2 & 1
PokeB(@Txt+6, 'x')
Else
PokeB(@Txt+6, '-')
EndIf
If World2 & 4
PokeB(@Txt+7, 'r')
Else
PokeB(@Txt+7, '-')
EndIf
If World2 & 2
PokeB(@Txt+8, 'w')
Else
PokeB(@Txt+8, '-')
EndIf
If World2 & 1
PokeB(@Txt+9, 'x')
Else
PokeB(@Txt+9, '-')
EndIf
SetGadgetText(#WORDS, Txt)
Else
Word.s = GetGadgetText(#WORDS)
User1.s = Mid(Word, 2, 3)
Group1.s = Mid(Word, 5, 3)
World1.s = Mid(Word, 8, 3)
If Mid(User1, 1, 1) = "r" : SetGadgetState(#USER_READ , 1) : Else : SetGadgetState(#USER_READ , 0) : EndIf
If Mid(User1, 2, 1) = "w" : SetGadgetState(#USER_WRITE , 1) : Else : SetGadgetState(#USER_WRITE , 0) : EndIf
If Mid(User1, 3, 1) = "x" Or Mid(User1, 3, 1) = "s" : SetGadgetState(#USER_RUN , 1) : Else : SetGadgetState(#USER_RUN , 0) : EndIf
If Mid(Group1, 1, 1) = "r" : SetGadgetState(#GROUP_READ , 1) : Else : SetGadgetState(#GROUP_READ , 0) : EndIf
If Mid(Group1, 2, 1) = "w" : SetGadgetState(#GROUP_WRITE , 1) : Else : SetGadgetState(#GROUP_WRITE , 0) : EndIf
If Mid(Group1, 3, 1) = "x" Or Mid(Group1, 3, 1) = "s" : SetGadgetState(#GROUP_RUN , 1) : Else : SetGadgetState(#GROUP_RUN , 0) : EndIf
If Mid(World1, 1, 1) = "r" : SetGadgetState(#WORLD_READ , 1) : Else : SetGadgetState(#WORLD_READ , 0) : EndIf
If Mid(World1, 2, 1) = "w" : SetGadgetState(#WORLD_WRITE , 1) : Else : SetGadgetState(#WORLD_WRITE , 0) : EndIf
If Mid(World1, 3, 1) = "x" Or Mid(World1, 3, 1) = "s" : SetGadgetState(#WORLD_RUN , 1) : Else : SetGadgetState(#WORLD_RUN , 0) : EndIf
EndIf
EndSelect
Else
UseWindow(1)
ActivateWindow()
EndIf
Until Q = 1
CloseWindow(1)
UseWindow(0)
EndIf
EndIf
ProcedureReturn chmod
EndProcedure
Procedure.s PassiveIP(Text.s)
s = FindString(Text, "(", 1)+1
l = FindString(Text, ")", s)-s
Host.s = Mid(Text, s, l)
IP.s = StringField(Host, 1, ",")+"."+StringField(Host, 2, ",")+"."+StringField(Host, 3, ",")+"."+StringField(Host, 4, ",")
ProcedureReturn IP.s
EndProcedure
Procedure.l PassivePort(Text.s)
s = FindString(Text, "(", 1)+1
l = FindString(Text, ")", s)-s
Host.s = Mid(Text, s, l)
Port = Val(StringField(Host, 5, ","))*256+Val(StringField(Host, 6, ","))
ProcedureReturn Port
EndProcedure
Procedure.s Wait(ConnectionID, Timeout)
Delay(10)
*Buffer = AllocateMemory(60000)
t = ElapsedMilliseconds()
While NetworkClientEvent(ConnectionID) <> 2 And ElapsedMilliseconds()-t < Timeout : Delay(1) : Wend
If ElapsedMilliseconds()-t < Timeout
Size = ReceiveNetworkData(ConnectionID, *Buffer, 60000)
Text.s = PeekS(*Buffer)
FreeMemory(*Buffer)
SetGadgetText(#PROGRESS_INFO, Text)
ProcedureReturn Text
EndIf
EndProcedure
Procedure Wait2(ConnectionID, *Buffer, Size, Timeout)
Delay(50)
t = ElapsedMilliseconds()
While NetworkClientEvent(ConnectionID) = 0 And ElapsedMilliseconds()-t < Timeout : Delay(1) : Wend
If ElapsedMilliseconds()-t < Timeout
CurSize = ReceiveNetworkData(ConnectionID, *Buffer, Size)
While CurSize < Size
If NetworkClientEvent(ConnectionID) = 2
CurSize + ReceiveNetworkData(ConnectionID, *Buffer+CurSize, Size-CurSize)
EndIf
Wend
ProcedureReturn CurSize-1
EndIf
EndProcedure
Procedure SendNetworkString2(ConnectionID, String.s)
SetGadgetText(#PROGRESS_INFO, String.s)
SendNetworkString(ConnectionID, String.s)
EndProcedure
Procedure FTP_Connect(Server.s, Port, Name.s, Pass.s)
ConnectionID = OpenNetworkConnection(Server, Port)
If ConnectionID
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "220"
SendNetworkString2(ConnectionID, "USER "+Name.s+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "331"
SendNetworkString2(ConnectionID, "PASS "+Pass.s+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "230"
SendNetworkString2(ConnectionID, "TYPE A"+EOL)
Wait(ConnectionID, 5000)
ProcedureReturn ConnectionID
EndIf
EndIf
EndIf
CloseNetworkConnection(ConnectionID)
EndIf
EndProcedure
Procedure FTP_SetCurrentDirectory(ConnectionID, Path.s)
If ConnectionID
SendNetworkString2(ConnectionID, "CWD "+Path.s+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "250"
SendNetworkString2(ConnectionID, "PWD"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "257"
ProcedureReturn 1
EndIf
EndIf
EndIf
EndProcedure
Procedure.s FTP_List(ConnectionID)
If ConnectionID
SendNetworkString2(ConnectionID, "TYPE A"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "200"
SendNetworkString2(ConnectionID, "PASV"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "227"
Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
If Passive
SendNetworkString2(ConnectionID, "LIST"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "150"
Text.s = Wait(ConnectionID, 5000)
Delay(10)
Result.s = Wait(Passive, 5000)
CloseNetworkConnection(Passive)
Text.s = Wait(ConnectionID, 5000)
ProcedureReturn Result
EndIf
CloseNetworkConnection(Passive)
Else
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure.s FTP_NameList(ConnectionID)
If ConnectionID
SendNetworkString2(ConnectionID, "TYPE A"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "200"
SendNetworkString2(ConnectionID, "PASV"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "227"
Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
If Passive
SendNetworkString2(ConnectionID, "NLST"+EOL)
Delay(100)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "150"
Text.s = Wait(ConnectionID, 5000)
Delay(100)
Result.s = Wait(Passive, 5000)
CloseNetworkConnection(Passive)
Text.s = Wait(ConnectionID, 5000)
ProcedureReturn Result
EndIf
CloseNetworkConnection(Passive)
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure.l FTP_DownloadFile(ConnectionID, SFile.s, DFile.s)
If ConnectionID
SendNetworkString2(ConnectionID, "TYPE I"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "200"
SendNetworkString2(ConnectionID, "PASV"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "227"
Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
If Passive
SendNetworkString2(ConnectionID, "RETR "+SFile+EOL)
Delay(100)
Text.s = Wait(ConnectionID, 5000)
s = FindString(Text, "(", 1)+1
l = FindString(Text, " ", s)-s
Size = Val(Mid(Text, s, l))
If Left(Text, 3) = "150"
*Buffer = AllocateMemory(1024)
Text = ""
s = 0
If CreateFile(0, DFile)
While s < Size
Size2 = ReceiveNetworkData(Passive, *Buffer, 1024)
If Size2 > 0
s + Size2
WriteData(*Buffer, Size2)
SetGadgetState(#PROGRESS, Int((100/Size)*s))
WindowEvent()
EndIf
Wend
CloseFile(0)
EndIf
FreeMemory(*Buffer)
CloseNetworkConnection(Passive)
Text.s = Wait(ConnectionID, 5000)
WindowEvent()
ProcedureReturn 1
EndIf
CloseNetworkConnection(Passive)
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure.l FTP_UploadFile(ConnectionID, SFile.s, DFile.s)
If ConnectionID
SendNetworkString2(ConnectionID, "TYPE I"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "200"
SendNetworkString2(ConnectionID, "PASV"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "227"
Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
If Passive
SendNetworkString2(ConnectionID, "STOR "+DFile+EOL)
Delay(100)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "150"
*Buffer = AllocateMemory(FileSize(SFile))
SetGadgetState(#PROGRESS, 25)
WindowEvent()
If ReadFile(0, SFile)
ReadData(*Buffer, FileSize(SFile))
CloseFile(0)
SetGadgetState(#PROGRESS, 50)
WindowEvent()
EndIf
SendNetworkData(Passive, *Buffer, FileSize(SFile))
SetGadgetState(#PROGRESS, 75)
WindowEvent()
FreeMemory(*Buffer)
CloseNetworkConnection(Passive)
SetGadgetState(#PROGRESS, 100)
WindowEvent()
Text.s = Wait(ConnectionID, 5000)
WindowEvent()
ProcedureReturn 1
EndIf
CloseNetworkConnection(Passive)
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure FTP_DeleteDirectory(ConnectionID, Dir.s)
If ConnectionID
SendNetworkString2(ConnectionID, "RMD "+Dir+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "250"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure FTP_CHMOD(ConnectionID, File.s, Rights.s)
If ConnectionID
SendNetworkString2(ConnectionID, "SITE chmod "+Rights+" "+File+EOL)
Text.s = Wait(ConnectionID, 5000)
EndIf
EndProcedure
Procedure FTP_CMD(ConnectionID, CMD.s)
If ConnectionID
SendNetworkString2(ConnectionID, CMD.s+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "500"
SendNetworkString2(ConnectionID, "SITE "+CMD.s+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "500"
ProcedureReturn 1
EndIf
Else
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure FTP_RenameFile(ConnectionID, FromName.s, ToName.s)
If ConnectionID
SendNetworkString2(ConnectionID, "RNFR "+FromName+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "350"
SendNetworkString2(ConnectionID, "RNTO "+ToName+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "250"
ProcedureReturn 1
EndIf
EndIf
EndIf
EndProcedure
Procedure FTP_DeleteFile(ConnectionID, File.s)
If ConnectionID
SendNetworkString2(ConnectionID, "DELE "+File+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "250"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure FTP_CreateDirectory(ConnectionID, Dir.s)
If ConnectionID
SendNetworkString2(ConnectionID, "MKD "+Dir+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "257"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure FTP_DirectoryUp(ConnectionID)
If ConnectionID
SendNetworkString2(ConnectionID, "CDUP"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "250"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure FTP_NoEvent(ConnectionID)
If ConnectionID
SendNetworkString2(ConnectionID, "NOOP"+EOL)
Text.s = Wait(ConnectionID, 5000)
EndIf
EndProcedure
Procedure FTP_Quit(ConnectionID)
If ConnectionID
SendNetworkString2(ConnectionID, "PASV"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "221"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
;-Program
NewList CurrentDirectory.s()
Global Username.s, Password.s, Server.s, Port.l
Procedure UpdateFiles(ConnectionID)
ClearGadgetItemList(#FILES)
Files.s = RemoveString(FTP_List(ConnectionID), Chr(13))
While FindString(Files, " ", 0) : Files = ReplaceString(Files, " ", " ") : Wend
For k=1 To CountString(Files, Chr(10))
Line.s = StringField(Files, k, Chr(10))
If Trim(Line) <> ""
If Left(StringField(Line, 1, " "), 1) = "d"
AddGadgetItem(#FILES, -1, StringField(Line, 9, " ")+Chr(10)+StrF(Val(StringField(Line, 5, " "))/1024)+Chr(10)+StringField(Line, 1, " "), UseImage(2))
Else
AddGadgetItem(#FILES, -1, StringField(Line, 9, " ")+Chr(10)+StrF(Val(StringField(Line, 5, " "))/1024)+Chr(10)+StringField(Line, 1, " "), UseImage(1))
EndIf
EndIf
Next
EndProcedure
Procedure SetDirectory(ConnectionID, Dir.s)
Select Trim(Dir)
Case "."
ClearList(CurrentDirectory())
FTP_SetCurrentDirectory(ConnectionID, "/")
Case ".."
LastElement(CurrentDirectory())
DeleteElement(CurrentDirectory())
ForEach CurrentDirectory()
CurDir.s + "/" + CurrentDirectory()
Next
If CurDir = "" : CurDir = "/" : EndIf
FTP_SetCurrentDirectory(ConnectionID, CurDir)
Default
LastElement(CurrentDirectory())
AddElement(CurrentDirectory())
CurrentDirectory() = Dir
ForEach CurrentDirectory()
CurDir.s + "/" + CurrentDirectory()
Next
FTP_SetCurrentDirectory(ConnectionID, CurDir)
EndSelect
UpdateFiles(ConnectionID)
EndProcedure
Procedure Decode(*Text, Size)
For k=0 To Size-1
PokeB(*Text+k, PeekB(*Text+k)+k)
Next
EndProcedure
Procedure Encode(*Text, Size)
For k=0 To Size-1
PokeB(*Text+k, PeekB(*Text+k)-k)
Next
EndProcedure
Procedure LoadPreferences()
If OpenPreferences("pref.ini")
PreferenceGroup("CONNECTION")
Username = ReadPreferenceString("USER", "Guest")
Password = ReadPreferenceString("PASS", "Gtcpp")
Server = ReadPreferenceString("SERVER", "ftp.host.com")
Port = ReadPreferenceLong("PORT", 21)
Decode(@Password, Len(Password))
ClosePreferences()
EndIf
EndProcedure
Procedure SavePreferences()
CreatePreferences("pref.ini")
PreferenceGroup("CONNECTION")
Encode(@Password, Len(Password))
WritePreferenceString("USER", Username)
WritePreferenceString("PASS", Password)
WritePreferenceString("SERVER", Server)
WritePreferenceLong("PORT", Port)
Decode(@Password, Len(Password))
ClosePreferences()
EndProcedure
LoadPreferences()
#WindowWidth = 640
#WindowHeight = 480
LoadImage(0, "BIN\Logo.bmp")
OpenWindow(0, 0, 0, 640, 480, #PB_Window_Borderless | #PB_Window_ScreenCentered, "Bradan FTP Client")
CreateGadgetList(WindowID())
ImageGadget(0, 0, 0, 640, 480, ImageID())
t = ElapsedMilliseconds()
Repeat : Delay(10) : WindowEvent() : Until ElapsedMilliseconds()-t > 1500
FreeImage(0)
CloseWindow(0)
If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight+20, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_TitleBar , "Bradan FTP")
If CreateGadgetList(WindowID())
ProgressBarGadget(#PROGRESS, #WindowWidth/2, #WindowHeight, #WindowWidth/2, 20, 0, 100)
TextGadget(#PROGRESS_INFO, 0, #WindowHeight, #WindowWidth/2, 20, "Progressinformation")
;CloseGadgetList()
ContainerGadget(#LOG, 0, 0, 640, 480, #PB_Container_Flat)
TextGadget(#Text_0, (#WindowWidth/2)-200, (#WindowHeight/2)-60, 100, 20, "FTP-Server:")
TextGadget(#Text_1, (#WindowWidth/2)-200, (#WindowHeight/2)-30, 100, 20, "Port:")
TextGadget(#Text_2, (#WindowWidth/2)-200, (#WindowHeight/2) , 100, 20, "Username:")
TextGadget(#Text_3, (#WindowWidth/2)-200, (#WindowHeight/2)+30, 100, 20, "Password:")
StringGadget(#SERVER, (#WindowWidth/2)-100, (#WindowHeight/2)-60, 300, 20, Server, #PB_String_BorderLess)
StringGadget(#PORT, (#WindowWidth/2)-100, (#WindowHeight/2)-30, 300, 20, Str(Port), #PB_String_BorderLess)
StringGadget(#USER, (#WindowWidth/2)-100, (#WindowHeight/2) , 300, 20, Username, #PB_String_BorderLess)
StringGadget(#PASS, (#WindowWidth/2)-100, (#WindowHeight/2)+30, 300, 20, Password, #PB_String_Password | #PB_String_BorderLess)
ButtonGadget(#LOGIN, (#WindowWidth/2)-200, (#WindowHeight/2)+70, 400, 30, "Login", #PB_Button_Default)
CloseGadgetList()
ContainerGadget(#MAIN, 0, 0, 640, 480, #PB_Container_Flat)
ListIconGadget(#FILES, 9, 9, 460, 460, "Name", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#FILES, 2, "Size (kilobytes)", 100)
AddGadgetColumn(#FILES, 3, "Rights", 100)
ButtonGadget(#DOWN, 479, 9, 150, 28, "Download")
ButtonGadget(#UP, 479, 39, 150, 28, "Upload")
ButtonGadget(#DELE, 479, 69, 150, 28, "Delete")
ButtonGadget(#LOGOUT, 479, 439, 150, 28, "Logout")
ButtonGadget(#ABOUT, 479, 409, 150, 28, "About...")
ButtonGadget(#REFRESH, 479, 99, 150, 28, "Refresh")
ButtonGadget(#RENAME, 479, 129, 150, 28, "Rename")
ButtonGadget(#CHMOD, 479, 159, 150, 28, "Change rights")
ButtonGadget(#CMD, 479, 189, 150, 28, "Command")
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
FlatGadgetAll(#STARTGADGET+1, #STOPGADGET-1)
CompilerEndIf
CloseGadgetList()
HideGadget(#MAIN, 1)
Repeat
Event = WindowEvent()
If ConnectionID <> 0
HideGadget(#LOG, 1)
HideGadget(#MAIN, 0)
If ElapsedMilliseconds()-NoEventTime >= 10000
SetGadgetState(#PROGRESS, 0)
FTP_NoEvent(ConnectionID)
NoEventTime = ElapsedMilliseconds()
EndIf
Else
HideGadget(#LOG, 0)
HideGadget(#MAIN, 1)
EndIf
Select Event
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select EventGadgetID()
Case #CMD
command.s = InputRequester("Command", "Run this command:", "")
If command
If FTP_CMD(ConnectionID, command)
UpdateFiles(ConnectionID)
EndIf
EndIf
Case #CHMOD
chmod.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 2)
File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
chmod = Open_Chmod(chmod.s)
FTP_CHMOD(ConnectionID, File, chmod)
UpdateFiles(ConnectionID)
Case #LOGIN
ConnectionID = FTP_Connect(Server, Port, Username.s, Password.s)
If ConnectionID
UpdateFiles(ConnectionID)
NoEventTime = ElapsedMilliseconds()
EndIf
Case #FILES
If EventType() = #PB_EventType_LeftDoubleClick
File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
Rights.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 2)
If Left(Rights, 1) = "d"
SetDirectory(ConnectionID, File)
EndIf
EndIf
Case #DOWN
File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
If File <> ""
FTP_DownloadFile(ConnectionID, File, SaveFileRequester("Download as...", "", "All Files|*.*", 1))
UpdateFiles(ConnectionID)
EndIf
NoEventTime = ElapsedMilliseconds()
Case #UP
File.s = OpenFileRequester("Upload ...", "", "All Files|*.*", 1)
If File <> ""
FTP_UploadFile(ConnectionID, File, GetFilePart(File))
UpdateFiles(ConnectionID)
EndIf
NoEventTime = ElapsedMilliseconds()
Case #DELE
File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
FTP_DeleteFile(ConnectionID, GetFilePart(File))
UpdateFiles(ConnectionID)
NoEventTime = ElapsedMilliseconds()
Case #REFRESH
UpdateFiles(ConnectionID)
NoEventTime = ElapsedMilliseconds()
Case #ABOUT
MessageRequester("About...", "Created by Daniel B."+Chr(10)+"http://www.bradan.net/")
Case #LOGOUT
If ConnectionID : FTP_Quit(ConnectionID) : ConnectionID = 0 : EndIf
Case #RENAME
File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
ToName.s = InputRequester("Rename to...", "Newer filename:", ToName.s)
If File And ToName.s <> File And ToName.s <> ""
FTP_RenameFile(ConnectionID, File.s, ToName.s)
UpdateFiles(ConnectionID)
EndIf
Default
Server = GetGadgetText(#SERVER)
Port = Val(GetGadgetText(#PORT))
Username = GetGadgetText(#USER)
Password = GetGadgetText(#PASS)
EndSelect
Case #PB_Event_Repaint
Default
Delay(10)
EndSelect
Until Quit = 1
EndIf
EndIf
FreeImage(1)
FreeImage(2)
If ConnectionID
FTP_Quit(ConnectionID)
EndIf
SavePreferences()
; IDE Options = PureBasic 3.93 Beta 1 (Linux)
; CursorPosition = 625
; FirstLine = 611
; Folding = ----H
; Executable = /root/Linux/purebasic/Eigene_Programme/Bradan FTP/Bradan FTP
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
-
- Beiträge: 6267
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Ja, den werde ich zu jpeg oder png konvertieren und wieder einbauen, aber den source brauche ich dann halt noch ^^.bluejoke hat geschrieben:Also den SplashScreen werde ich entfernen, da die Grafik allein 700kB verbraucht. Dann möchte ich zum Beispiel beim Dialog zur Attributänderung einen Test einbauen, ob überhaupt etwas geändert wurde und solche Sachen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
-
- Beiträge: 214
- Registriert: 30.03.2014 19:57
- Computerausstattung: Purebasic 5.70
- Wohnort: 18314 Löbnitz
Re: FTP-Programm
wenn jeman mal die Zeil finden würde den Code an PB 5 anzupassen fände ich das Klasse.
Wenn ich es könnte würde ich es selber tun.
Wenn ich es könnte würde ich es selber tun.
Purebasic 5.51
-
- Beiträge: 214
- Registriert: 30.03.2014 19:57
- Computerausstattung: Purebasic 5.70
- Wohnort: 18314 Löbnitz
Re: FTP-Programm
Ich habe mich doch selber drüber hergemachtund mein möglichstes versucht, das Ding wieder zum laufen zu bekommen. Habe den Code für PB 5.21 angepasst. Hier ist er
Schön wäre, wenn er denn auch vollständig funktionieren würde und da brauche ich euer Hilfe. Die Verbindung zu Server passiv funktioniert schonmal, nur listet er nichts auf im Gadget.
Ich habe die Proceduren vefolgt nach dem Login und stellte folgendes fest :
Nach aufruf des Loginbutton ruft er die Procedur Updatefiles auf, geht dann zu Procedur FTP_List und
von da aus zu Procedur wait wo er dann bei der Zeile 293 "
hängen bleibt.
Habe schon das Timeout verlängert und mit größeren Buffer versucht, jedoch ohne Erfolg.
Was kann ich noch tun ?
Zum Code gehören noch 2 Ico´s und eine Grafik , falls einer sie braucht zum testen, dann lade ich sie irgendwo rauf.
Code: Alles auswählen
Enumeration
#STARTGADGET
#MAIN
#FILES
#DOWN
#UP
#DELE
#LOGOUT
#ABOUT
#REFRESH
#RENAME
#CHMOD
#LOG
#Text_0
#Text_1
#Text_2
#Text_3
#SERVER
#PORT
#USER
#PASS
#LOGIN
#PROGRESS_INFO
#PROGRESS
#CMD
#STOPGADGET
#Text_00
#Text_10
#Text_20
#Text_30
#Text_40
#Text_50
#USER_READ
#GROUP_READ
#WORLD_READ
#USER_WRITE
#GROUP_WRITE
#WORLD_WRITE
#USER_RUN
#GROUP_RUN
#WORLD_RUN
#NUMERIC
#WORDS
#OK
EndEnumeration
LoadImage(1, "BIN\file.ico")
LoadImage(2, "BIN\folder.ico")
InitNetwork()
Global EOL.s
EOL.s = Chr(13)+Chr(10)
Procedure.s Open_Chmod(chmod.s)
If OpenWindow(1, 0, 0, 320, 240,"CHMOD", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
TextGadget(#Text_00, 10, 40, 80, 20, "Owner:")
TextGadget(#Text_10, 10, 70, 80, 20, "Group:")
TextGadget(#Text_20, 10, 100, 80, 20, "World:")
TextGadget(#Text_30, 120, 10, 50, 20, "Read", #PB_Text_Center)
TextGadget(#Text_40, 190, 10, 50, 20, "Write", #PB_Text_Center)
TextGadget(#Text_50, 260, 10, 50, 20, "Run", #PB_Text_Center)
CheckBoxGadget(#USER_READ, 140, 40, 20, 20, "")
CheckBoxGadget(#GROUP_READ, 140, 70, 20, 20, "")
CheckBoxGadget(#WORLD_READ, 140, 100, 20, 20, "")
CheckBoxGadget(#USER_WRITE, 210, 40, 20, 20, "")
CheckBoxGadget(#GROUP_WRITE, 210, 70, 20, 20, "")
CheckBoxGadget(#WORLD_WRITE, 210, 100, 20, 20, "")
CheckBoxGadget(#USER_RUN, 280, 40, 20, 20, "")
CheckBoxGadget(#GROUP_RUN, 280, 70, 20, 20, "")
CheckBoxGadget(#WORLD_RUN, 280, 100, 20, 20, "")
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
StringGadget(#NUMERIC, 10, 150, 300, 20, "000", #ESB_DISABLE_RIGHT)
If chmod = ""
StringGadget(#WORDS, 10, 180, 300, 20, "----------", #ESB_DISABLE_RIGHT)
Else
StringGadget(#WORDS, 10, 180, 300, 20, chmod, #ESB_DISABLE_RIGHT)
EndIf
CompilerElse
StringGadget(#NUMERIC, 10, 150, 300, 20, "000")
If chmod = ""
StringGadget(#WORDS, 10, 180, 300, 20, "----------")
Else
StringGadget(#WORDS, 10, 180, 300, 20, chmod)
EndIf
CompilerEndIf
ButtonGadget(#OK, 10, 210, 300, 20, "OK")
Repeat
If WindowID(0)
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Q = 1
Case #PB_Event_Gadget
Case #OK
chmod = GetGadgetText(#NUMERIC)
Q = 1
If GID >= #USER_READ And GID <= #WORLD_RUN
User1.s = Str(GetGadgetState(#USER_READ)*4+GetGadgetState(#USER_WRITE)*2+GetGadgetState(#USER_RUN)*1)
Group1.s = Str(GetGadgetState(#GROUP_READ)*4+GetGadgetState(#GROUP_WRITE)*2+GetGadgetState(#GROUP_RUN)*1)
World1.s = Str(GetGadgetState(#WORLD_READ)*4+GetGadgetState(#WORLD_WRITE)*2+GetGadgetState(#WORLD_RUN)*1)
SetGadgetText(#NUMERIC, User1+Group1+World1)
Num.s = GetGadgetText(#NUMERIC)
User2.l = Val(Mid(Num, 1, 1))
Group2.l = Val(Mid(Num, 2, 1))
World2.l = Val(Mid(Num, 3, 1))
Txt.s = GetGadgetText(#WORDS)
If User2 & 4
PokeB(@Txt+1, 'r')
Else
PokeB(@Txt+1, '-')
EndIf
If User2 & 2
PokeB(@Txt+2, 'w')
Else
PokeB(@Txt+2, '-')
EndIf
If User2 & 1
PokeB(@Txt+3, 'x')
Else
PokeB(@Txt+3, '-')
EndIf
If Group2 & 4
PokeB(@Txt+4, 'r')
Else
PokeB(@Txt+4, '-')
EndIf
If Group2 & 2
PokeB(@Txt+5, 'w')
Else
PokeB(@Txt+5, '-')
EndIf
If Group2 & 1
PokeB(@Txt+6, 'x')
Else
PokeB(@Txt+6, '-')
EndIf
If World2 & 4
PokeB(@Txt+7, 'r')
Else
PokeB(@Txt+7, '-')
EndIf
If World2 & 2
PokeB(@Txt+8, 'w')
Else
PokeB(@Txt+8, '-')
EndIf
If World2 & 1
PokeB(@Txt+9, 'x')
Else
PokeB(@Txt+9, '-')
EndIf
SetGadgetText(#WORDS, Txt)
ElseIf GID = #NUMERIC
Num.s = GetGadgetText(#NUMERIC)
User2.l = Val(Mid(Num, 1, 1))
Group2.l = Val(Mid(Num, 2, 1))
World2.l = Val(Mid(Num, 3, 1))
SetGadgetState(#USER_READ , User2 & 4)
SetGadgetState(#USER_WRITE , User2 & 2)
SetGadgetState(#USER_RUN , User2 & 1)
SetGadgetState(#GROUP_READ , Group2 & 4)
SetGadgetState(#GROUP_WRITE, Group2 & 2)
SetGadgetState(#GROUP_RUN , Group2 & 1)
SetGadgetState(#WORLD_READ , World2 & 4)
SetGadgetState(#WORLD_WRITE, World2 & 2)
SetGadgetState(#WORLD_RUN , World2 & 1)
Txt.s = GetGadgetText(#WORDS)
If User2 & 4
PokeB(@Txt+1, 'r')
Else
PokeB(@Txt+1, '-')
EndIf
If User2 & 2
PokeB(@Txt+2, 'w')
Else
PokeB(@Txt+2, '-')
EndIf
If User2 & 1
PokeB(@Txt+3, 'x')
Else
PokeB(@Txt+3, '-')
EndIf
If Group2 & 4
PokeB(@Txt+4, 'r')
Else
PokeB(@Txt+4, '-')
EndIf
If Group2 & 2
PokeB(@Txt+5, 'w')
Else
PokeB(@Txt+5, '-')
EndIf
If Group2 & 1
PokeB(@Txt+6, 'x')
Else
PokeB(@Txt+6, '-')
EndIf
If World2 & 4
PokeB(@Txt+7, 'r')
Else
PokeB(@Txt+7, '-')
EndIf
If World2 & 2
PokeB(@Txt+8, 'w')
Else
PokeB(@Txt+8, '-')
EndIf
If World2 & 1
PokeB(@Txt+9, 'x')
Else
PokeB(@Txt+9, '-')
EndIf
SetGadgetText(#WORDS, Txt)
Else
Word.s = GetGadgetText(#WORDS)
User1.s = Mid(Word, 2, 3)
Group1.s = Mid(Word, 5, 3)
World1.s = Mid(Word, 8, 3)
If Mid(User1, 1, 1) = "r" : SetGadgetState(#USER_READ , 1) : Else : SetGadgetState(#USER_READ , 0) : EndIf
If Mid(User1, 2, 1) = "w" : SetGadgetState(#USER_WRITE , 1) : Else : SetGadgetState(#USER_WRITE , 0) : EndIf
If Mid(User1, 3, 1) = "x" Or Mid(User1, 3, 1) = "s" : SetGadgetState(#USER_RUN , 1) : Else : SetGadgetState(#USER_RUN , 0) : EndIf
If Mid(Group1, 1, 1) = "r" : SetGadgetState(#GROUP_READ , 1) : Else : SetGadgetState(#GROUP_READ , 0) : EndIf
If Mid(Group1, 2, 1) = "w" : SetGadgetState(#GROUP_WRITE , 1) : Else : SetGadgetState(#GROUP_WRITE , 0) : EndIf
If Mid(Group1, 3, 1) = "x" Or Mid(Group1, 3, 1) = "s" : SetGadgetState(#GROUP_RUN , 1) : Else : SetGadgetState(#GROUP_RUN , 0) : EndIf
If Mid(World1, 1, 1) = "r" : SetGadgetState(#WORLD_READ , 1) : Else : SetGadgetState(#WORLD_READ , 0) : EndIf
If Mid(World1, 2, 1) = "w" : SetGadgetState(#WORLD_WRITE , 1) : Else : SetGadgetState(#WORLD_WRITE , 0) : EndIf
If Mid(World1, 3, 1) = "x" Or Mid(World1, 3, 1) = "s" : SetGadgetState(#WORLD_RUN , 1) : Else : SetGadgetState(#WORLD_RUN , 0) : EndIf
EndIf
EndSelect
Else
SetActiveWindow(1)
HideWindow(0,1)
EndIf
Until Q = 1
CloseWindow(1)
HideWindow(0,0)
EndIf
ProcedureReturn chmod
EndProcedure
Procedure.s PassiveIP(Text.s)
s = FindString(Text, "(", 1)+1
l = FindString(Text, ")", s)-s
Host.s = Mid(Text, s, l)
IP.s = StringField(Host, 1, ",")+"."+StringField(Host, 2, ",")+"."+StringField(Host, 3, ",")+"."+StringField(Host, 4, ",")
ProcedureReturn IP.s
EndProcedure
Procedure.l PassivePort(Text.s)
s = FindString(Text, "(", 1)+1
l = FindString(Text, ")", s)-s
Host.s = Mid(Text, s, l)
Port = Val(StringField(Host, 5, ","))*256+Val(StringField(Host, 6, ","))
ProcedureReturn Port
EndProcedure
Procedure.s Wait(ConnectionID, Timeout)
Delay(50)
*Buffer = AllocateMemory(16000)
t = ElapsedMilliseconds()
While NetworkClientEvent(ConnectionID) <> 2 And ElapsedMilliseconds()-t < Timeout : Delay(10): Wend
If ElapsedMilliseconds()-t < Timeout
Size = ReceiveNetworkData(ConnectionID, *Buffer, 16000)
Text.s = PeekS(*Buffer)
FreeMemory(*Buffer)
SetGadgetText(#PROGRESS_INFO, Text)
ProcedureReturn Text
EndIf
EndProcedure
Procedure Wait2(ConnectionID, *Buffer, Size, Timeout)
Delay(50)
t = ElapsedMilliseconds()
While NetworkClientEvent(ConnectionID) = 0 And ElapsedMilliseconds()-t < Timeout : Delay(1) : Wend
If ElapsedMilliseconds()-t < Timeout
CurSize = ReceiveNetworkData(ConnectionID, *Buffer, Size)
While CurSize < Size
If NetworkClientEvent(ConnectionID) = 2
CurSize + ReceiveNetworkData(ConnectionID, *Buffer+CurSize, Size-CurSize)
EndIf
Wend
ProcedureReturn CurSize-1
EndIf
EndProcedure
Procedure SendNetworkString2(ConnectionID, String.s)
SetGadgetText(#PROGRESS_INFO, String.s)
SendNetworkString(ConnectionID, String.s)
EndProcedure
Procedure FTP_Connect(Server.s, Port, Name.s, Pass.s)
ConnectionID = OpenNetworkConnection(Server, Port)
If ConnectionID
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "220"
SendNetworkString2(ConnectionID, "USER "+Name.s+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "331"
SendNetworkString2(ConnectionID, "PASS "+Pass.s+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "230"
SendNetworkString2(ConnectionID, "TYPE A"+EOL)
Wait(ConnectionID, 5000)
ProcedureReturn ConnectionID
EndIf
EndIf
EndIf
CloseNetworkConnection(ConnectionID)
EndIf
EndProcedure
Procedure FTP_SetCurrentDirectory(ConnectionID, Path.s)
If ConnectionID
SendNetworkString2(ConnectionID, "CWD "+Path.s+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "250"
SendNetworkString2(ConnectionID, "PWD"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "257"
ProcedureReturn 1
EndIf
EndIf
EndIf
EndProcedure
Procedure.s FTP_List(ConnectionID)
If ConnectionID
SendNetworkString2(ConnectionID, "TYPE A"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "200"
SendNetworkString2(ConnectionID, "PASV"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "227"
Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
If Passive
SendNetworkString2(ConnectionID, "LIST"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "150"
Text.s = Wait(ConnectionID, 5000)
Delay(10)
Result.s = Wait(Passive, 5000)
CloseNetworkConnection(Passive)
Text.s = Wait(ConnectionID, 5000)
ProcedureReturn Result
EndIf
CloseNetworkConnection(Passive)
Else
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure.s FTP_NameList(ConnectionID)
If ConnectionID
SendNetworkString2(ConnectionID, "TYPE A"+EOL)
Text.s = Wait(ConnectionID, 8000)
If Left(Text, 3) = "200"
SendNetworkString2(ConnectionID, "PASV"+EOL)
Text.s = Wait(ConnectionID, 8000)
If Left(Text, 3) = "227"
Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
If Passive
SendNetworkString2(ConnectionID, "NLST"+EOL)
Delay(300)
Text.s = Wait(ConnectionID, 8000)
If Left(Text, 3) = "150"
Text.s = Wait(ConnectionID, 8000)
Delay(100)
Result.s = Wait(Passive, 8000)
CloseNetworkConnection(Passive)
Text.s = Wait(ConnectionID, 8000)
ProcedureReturn Result
EndIf
CloseNetworkConnection(Passive)
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure.l FTP_DownloadFile(ConnectionID, SFile.s, DFile.s)
If ConnectionID
SendNetworkString2(ConnectionID, "TYPE I"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "200"
SendNetworkString2(ConnectionID, "PASV"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "227"
Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
If Passive
SendNetworkString2(ConnectionID, "RETR "+SFile+EOL)
Delay(100)
Text.s = Wait(ConnectionID, 5000)
s = FindString(Text, "(", 1)+1
l = FindString(Text, " ", s)-s
Size = Val(Mid(Text, s, l))
If Left(Text, 3) = "150"
*Buffer = AllocateMemory(1024)
Text = ""
s = 0
If CreateFile(0, DFile)
While s < Size
Size2 = ReceiveNetworkData(Passive, *Buffer, 1024)
If Size2 > 0
s + Size2
WriteData(0,*Buffer, Size2)
SetGadgetState(#PROGRESS, Int((100/Size)*s))
WindowEvent()
EndIf
Wend
CloseFile(0)
EndIf
FreeMemory(*Buffer)
CloseNetworkConnection(Passive)
Text.s = Wait(ConnectionID, 5000)
WindowEvent()
ProcedureReturn 1
EndIf
CloseNetworkConnection(Passive)
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure.l FTP_UploadFile(ConnectionID, SFile.s, DFile.s)
If ConnectionID
SendNetworkString2(ConnectionID, "TYPE I"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "200"
SendNetworkString2(ConnectionID, "PASV"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "227"
Passive = OpenNetworkConnection(PassiveIP(Text.s), PassivePort(Text.s))
If Passive
SendNetworkString2(ConnectionID, "STOR "+DFile+EOL)
Delay(100)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "150"
*Buffer = AllocateMemory(FileSize(SFile))
SetGadgetState(#PROGRESS, 25)
WindowEvent()
If ReadFile(0, SFile)
ReadData(0,*Buffer, FileSize(SFile))
CloseFile(0)
SetGadgetState(#PROGRESS, 50)
WindowEvent()
EndIf
SendNetworkData(Passive, *Buffer, FileSize(SFile))
SetGadgetState(#PROGRESS, 75)
WindowEvent()
FreeMemory(*Buffer)
CloseNetworkConnection(Passive)
SetGadgetState(#PROGRESS, 100)
WindowEvent()
Text.s = Wait(ConnectionID, 5000)
WindowEvent()
ProcedureReturn 1
EndIf
CloseNetworkConnection(Passive)
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure FTP_DeleteDirectory(ConnectionID, Dir.s)
If ConnectionID
SendNetworkString2(ConnectionID, "RMD "+Dir+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "250"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure FTP_CHMOD(ConnectionID, File.s, Rights.s)
If ConnectionID
SendNetworkString2(ConnectionID, "SITE chmod "+Rights+" "+File+EOL)
Text.s = Wait(ConnectionID, 5000)
EndIf
EndProcedure
Procedure FTP_CMD(ConnectionID, CMD.s)
If ConnectionID
SendNetworkString2(ConnectionID, CMD.s+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "500"
SendNetworkString2(ConnectionID, "SITE "+CMD.s+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "500"
ProcedureReturn 1
EndIf
Else
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure FTP_Rename(ConnectionID, FromName.s, ToName.s)
If ConnectionID
SendNetworkString2(ConnectionID, "RNFR "+FromName+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "350"
SendNetworkString2(ConnectionID, "RNTO "+ToName+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "250"
ProcedureReturn 1
EndIf
EndIf
EndIf
EndProcedure
Procedure FTP_Delete_File(ConnectionID, File.s)
If ConnectionID
SendNetworkString2(ConnectionID, "DELE "+File+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "250"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure FTP_CreateDirectory(ConnectionID, Dir.s)
If ConnectionID
SendNetworkString2(ConnectionID, "MKD "+Dir+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "257"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure FTP_DirectoryUp(ConnectionID)
If ConnectionID
SendNetworkString2(ConnectionID, "CDUP"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "250"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure FTP_NoEvent(ConnectionID)
If ConnectionID
SendNetworkString2(ConnectionID, "NOOP"+EOL)
Text.s = Wait(ConnectionID, 5000)
EndIf
EndProcedure
Procedure FTP_Quit(ConnectionID)
If ConnectionID
SendNetworkString2(ConnectionID, "PASV"+EOL)
Text.s = Wait(ConnectionID, 5000)
If Left(Text, 3) = "221"
ProcedureReturn 1
EndIf
EndIf
EndProcedure
;-Program
NewList CurrentDirectory.s()
Global Username.s, Password.s, Server.s, Port.l
Procedure UpdateFiles(ConnectionID)
ClearGadgetItems(#FILES)
Files.s = RemoveString(FTP_List(ConnectionID), Chr(13))
Debug Files.s
While FindString(Files, " ", 0) : Files = ReplaceString(Files, " ", " ") : Wend
For k=1 To CountString(Files, Chr(10))
Line.s = StringField(Files, k, Chr(10))
If Trim(Line) <> ""
If Left(StringField(Line, 1, " "), 1) = "d"
AddGadgetItem(#FILES, -1, StringField(Line, 9, " ")+Chr(10)+StrF(Val(StringField(Line, 5, " "))/1024)+Chr(10)+StringField(Line, 1, " "), ImageID(2))
Else
AddGadgetItem(#FILES, -1, StringField(Line, 9, " ")+Chr(10)+StrF(Val(StringField(Line, 5, " "))/1024)+Chr(10)+StringField(Line, 1, " "), ImageID(1))
EndIf
EndIf
Next
EndProcedure
Procedure SetDirectory(ConnectionID, Dir.s)
NewList CurrentDirectory.s()
Select Trim(Dir)
Case "."
ClearList(CurrentDirectory())
FTP_SetCurrentDirectory(ConnectionID, "/")
Case ".."
LastElement(CurrentDirectory())
DeleteElement(CurrentDirectory())
ForEach CurrentDirectory()
CurDir.s + "/" + CurrentDirectory()
Next
If CurDir = "" : CurDir = "/" : EndIf
FTP_SetCurrentDirectory(ConnectionID, CurDir)
Default
LastElement(CurrentDirectory())
AddElement(CurrentDirectory())
CurrentDirectory() = Dir
ForEach CurrentDirectory()
CurDir.s + "/" + CurrentDirectory()
Next
FTP_SetCurrentDirectory(ConnectionID, CurDir)
EndSelect
UpdateFiles(ConnectionID)
EndProcedure
Procedure Decode(*Text, Size)
For k=0 To Size-1
PokeB(*Text+k, PeekB(*Text+k)+k)
Next
EndProcedure
Procedure Encode(*Text, Size)
For k=0 To Size-1
PokeB(*Text+k, PeekB(*Text+k)-k)
Next
EndProcedure
Procedure LoadPreferences()
If OpenPreferences("pref.ini")
PreferenceGroup("CONNECTION")
Username = ReadPreferenceString("USER", "Guest")
Password = ReadPreferenceString("PASS", "Gtcpp")
Server = ReadPreferenceString("SERVER", "ftp.host.com")
Port = ReadPreferenceLong("PORT", 21)
Decode(@Password, Len(Password))
ClosePreferences()
EndIf
EndProcedure
Procedure SavePreferences()
CreatePreferences("pref.ini")
PreferenceGroup("CONNECTION")
Encode(@Password, Len(Password))
WritePreferenceString("USER", Username)
WritePreferenceString("PASS", Password)
WritePreferenceString("SERVER", Server)
WritePreferenceLong("PORT", Port)
Decode(@Password, Len(Password))
ClosePreferences()
EndProcedure
LoadPreferences()
#WindowWidth = 640
#WindowHeight = 480
UseJPEGImageDecoder()
LoadImage(0, "BIN\Logo.jpg")
OpenWindow(0, 0, 0, 640, 480, "Bradan FTP Client",#PB_Window_BorderLess | #PB_Window_ScreenCentered )
ImageGadget(0, 0, 0, 640, 480, ImageID(0))
t = ElapsedMilliseconds()
Repeat : Delay(10) : WindowEvent() : Until ElapsedMilliseconds()-t > 1500
FreeImage(0)
CloseWindow(0)
If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight+40,"Bradan FTP", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_TitleBar )
ProgressBarGadget(#PROGRESS, #WindowWidth/2, #WindowHeight, #WindowWidth/2, 20, 0, 100)
TextGadget(#PROGRESS_INFO, 0, #WindowHeight, #WindowWidth/2, 40, "Progressinformation")
;CloseGadgetList()
ContainerGadget(#LOG, 0, 0, 640, 480, #PB_Container_Flat)
TextGadget(#Text_0, (#WindowWidth/2)-200, (#WindowHeight/2)-60, 100, 20, "FTP-Server:")
TextGadget(#Text_1, (#WindowWidth/2)-200, (#WindowHeight/2)-30, 100, 20, "Port:")
TextGadget(#Text_2, (#WindowWidth/2)-200, (#WindowHeight/2) , 100, 20, "Username:")
TextGadget(#Text_3, (#WindowWidth/2)-200, (#WindowHeight/2)+30, 100, 20, "Password:")
StringGadget(#SERVER, (#WindowWidth/2)-100, (#WindowHeight/2)-60, 300, 20, Server, #PB_String_BorderLess)
StringGadget(#PORT, (#WindowWidth/2)-100, (#WindowHeight/2)-30, 300, 20, Str(Port), #PB_String_BorderLess)
StringGadget(#USER, (#WindowWidth/2)-100, (#WindowHeight/2) , 300, 20, Username, #PB_String_BorderLess)
StringGadget(#PASS, (#WindowWidth/2)-100, (#WindowHeight/2)+30, 300, 20, Password, #PB_String_Password | #PB_String_BorderLess)
ButtonGadget(#LOGIN, (#WindowWidth/2)-200, (#WindowHeight/2)+70, 400, 30, "Login", #PB_Button_Default)
CloseGadgetList()
ContainerGadget(#MAIN, 0, 0, 640, 480, #PB_Container_Flat)
ListIconGadget(#FILES, 9, 9, 460, 460, "Name", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#FILES, 2, "Size (kilobytes)", 100)
AddGadgetColumn(#FILES, 3, "Rights", 100)
ButtonGadget(#DOWN, 479, 9, 150, 28, "Download")
ButtonGadget(#UP, 479, 39, 150, 28, "Upload")
ButtonGadget(#DELE, 479, 69, 150, 28, "Delete")
ButtonGadget(#LOGOUT, 479, 439, 150, 28, "Logout")
ButtonGadget(#ABOUT, 479, 409, 150, 28, "About...")
ButtonGadget(#REFRESH, 479, 99, 150, 28, "Refresh")
ButtonGadget(#RENAME, 479, 129, 150, 28, "Rename")
ButtonGadget(#CHMOD, 479, 159, 150, 28, "Change rights")
ButtonGadget(#CMD, 479, 189, 150, 28, "Command")
CloseGadgetList()
HideGadget(#MAIN, 1)
Repeat
Event = WindowEvent()
If ConnectionID <> 0
HideGadget(#LOG, 1)
HideGadget(#MAIN, 0)
If ElapsedMilliseconds()-NoEventTime >= 8000
SetGadgetState(#PROGRESS, 0)
FTP_NoEvent(ConnectionID)
NoEventTime = ElapsedMilliseconds()
EndIf
Else
HideGadget(#LOG, 0)
HideGadget(#MAIN, 1)
EndIf
Select Event
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case #CMD
command.s = InputRequester("Command", "Run this command:", "")
If command
If FTP_CMD(ConnectionID, command)
UpdateFiles(ConnectionID)
EndIf
EndIf
Case #CHMOD
chmod.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 2)
File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
chmod = Open_Chmod(chmod.s)
FTP_CHMOD(ConnectionID, File, chmod)
UpdateFiles(ConnectionID)
Case #LOGIN
ConnectionID = FTP_Connect(Server, Port, Username.s, Password.s)
If ConnectionID
Debug ConnectionID
UpdateFiles(ConnectionID)
NoEventTime = ElapsedMilliseconds()
EndIf
Case #FILES
If EventType() = #PB_EventType_LeftDoubleClick
File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
Rights.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 2)
If Left(Rights, 1) = "d"
SetDirectory(ConnectionID, File)
EndIf
EndIf
Case #DOWN
File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
If File <> ""
FTP_DownloadFile(ConnectionID, File, SaveFileRequester("Download as...", "", "All Files|*.*", 1))
UpdateFiles(ConnectionID)
EndIf
NoEventTime = ElapsedMilliseconds()
Case #UP
File.s = OpenFileRequester("Upload ...", "", "All Files|*.*", 1)
If File <> ""
FTP_UploadFile(ConnectionID, File, GetFilePart(File))
UpdateFiles(ConnectionID)
EndIf
NoEventTime = ElapsedMilliseconds()
Case #DELE
File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
FTP_Delete_File(ConnectionID, GetFilePart(File))
UpdateFiles(ConnectionID)
NoEventTime = ElapsedMilliseconds()
Case #REFRESH
UpdateFiles(ConnectionID)
NoEventTime = ElapsedMilliseconds()
Case #ABOUT
MessageRequester("About...", "Created by Daniel B."+Chr(10)+"http://www.bradan.net/")
Case #LOGOUT
If ConnectionID : FTP_Quit(ConnectionID) : ConnectionID = 0 : EndIf
Case #RENAME
File.s = GetGadgetItemText(#FILES, GetGadgetState(#FILES), 0)
ToName.s = InputRequester("Rename to...", "New filename:", ToName.s)
If File And ToName.s <> File And ToName.s <> ""
FTP_Rename(ConnectionID, File.s, ToName.s)
UpdateFiles(ConnectionID)
EndIf
Default
Server = GetGadgetText(#SERVER)
Port = Val(GetGadgetText(#PORT))
Username = GetGadgetText(#USER)
Password = GetGadgetText(#PASS)
EndSelect
Case #PB_Event_Repaint
Default
Delay(10)
EndSelect
Until Quit = 1
EndIf
FreeImage(1)
FreeImage(2)
If ConnectionID
FTP_Quit(ConnectionID)
EndIf
SavePreferences()
; IDE Options = PureBasic 3.93 Beta 1 (Linux)
; CursorPosition = 625
; FirstLine = 611
; Folding = ----H
; Executable = /root/Linux/purebasic/Eigene_Programme/Bradan FTP/Bradan FTP
Schön wäre, wenn er denn auch vollständig funktionieren würde und da brauche ich euer Hilfe. Die Verbindung zu Server passiv funktioniert schonmal, nur listet er nichts auf im Gadget.
Ich habe die Proceduren vefolgt nach dem Login und stellte folgendes fest :
Nach aufruf des Loginbutton ruft er die Procedur Updatefiles auf, geht dann zu Procedur FTP_List und
von da aus zu Procedur wait wo er dann bei der Zeile 293 "
Code: Alles auswählen
While NetworkClientEvent(ConnectionID) <> 2 And ElapsedMilliseconds()-t < Timeout : Delay(10): Wend
Habe schon das Timeout verlängert und mit größeren Buffer versucht, jedoch ohne Erfolg.
Was kann ich noch tun ?
Zum Code gehören noch 2 Ico´s und eine Grafik , falls einer sie braucht zum testen, dann lade ich sie irgendwo rauf.
Purebasic 5.51