RenameFTPFile() liefert bei SFTP immer '0' zurück, egal ob erfolgreich oder nicht
Verfasst: 24.04.2025 18:16
Hallo,
Ich habe gerade einige Befehle ausgetestet:
Bei SFTP sind noch einige Unstimmigkeiten vorhanden und (ich vermute) es ist ein kleiner Bug bei RenameFTPFile() enthalten.
Das folgende betrifft ausschließlich SFTP:
1.)
Aus der Hilfe geht nicht deutlich hervor, dass bei DeleteFTPDirectory(), DeleteFTPFile(), RenameFTPFile() und CreateFTPDirectory() der Pfad, in dem man sich gerade befindet, mit den beiden Filenamen zusammen angegeben werden muss, sonst funktioniert es nur in der root. Zitat: "Es ist nicht möglich, einen Pfad bzw. Unterverzeichnis im 'Dateiname$' anzugeben." Das bezieht sich wohl nur auf FTP, oder ich muss es wohl falsch verstanden haben.
2.)
Wenn bei RenameFTPFile(), beim neuen Filenamen der Pfad fehlt, wird die Datei unter dem neuen Namen in die root verschoben.
Wenn bei RenameFTPFile(), beim neuen Filenamen der vollständige Pfad in ein existierendes Unterverzeichnis angegeben wurde, wird die Datei unter dem neuen Namen in dieses Verzeichnis verschoben.
Wenn bei RenameFTPFile(), beim alten Filenamen der Pfad fehlt, findet er die Datei nicht (außer in der root).
3.)
Bei RenameFTPFile() kommt immer '0' zurück, egal ob erfolgreich oder nicht. Auch wenn RenameFTPFile() in der root (ohne Pfadzusatz) eine Datei erfolgreich umbenannt hat.
Die Verbindungsnummer für RenameFTPFile() wurde zuvor mit OpenFTP(#PB_Any, ... generiert.
Alles getestet mit Servern von Hetzner und Ionos, aber andere werden sich vermutlich auch so verhalten. Sorry, aber ich möchte hier keinen Online-Speicher mit Schreibrechten öffentlich dafür zur Verfügung stellen und ich hoffe nun, ihr habt selbst einen SFTP-Server wenn ihr den Demo-Code mal testen wollt.
Meine Konfiguration:
; PB-Version: PureBasic 6.20 (Windows - x64)
; OS: Windows 8.1 64 Bit
; Compilereinstellungen:
; [ ] Unicode-Executable erstellen
; [ ] Thread-sicheres Executable erstellen
; [ ] OnError-Unterstützung einschalten
; [x] Moderne Themen-Unterstützung aktivieren (für Windows XP und höher)
; [ ] Administrator-Modus für Windows Vista und höher anfordern
; [ ] User-Modus für Windows Vista und höher anfordern (keine Virtualisierung)
; Library Subsystem: -
Grüße
Ralf
Ich habe gerade einige Befehle ausgetestet:
Bei SFTP sind noch einige Unstimmigkeiten vorhanden und (ich vermute) es ist ein kleiner Bug bei RenameFTPFile() enthalten.
Das folgende betrifft ausschließlich SFTP:
1.)
Aus der Hilfe geht nicht deutlich hervor, dass bei DeleteFTPDirectory(), DeleteFTPFile(), RenameFTPFile() und CreateFTPDirectory() der Pfad, in dem man sich gerade befindet, mit den beiden Filenamen zusammen angegeben werden muss, sonst funktioniert es nur in der root. Zitat: "Es ist nicht möglich, einen Pfad bzw. Unterverzeichnis im 'Dateiname$' anzugeben." Das bezieht sich wohl nur auf FTP, oder ich muss es wohl falsch verstanden haben.
2.)
Wenn bei RenameFTPFile(), beim neuen Filenamen der Pfad fehlt, wird die Datei unter dem neuen Namen in die root verschoben.
Wenn bei RenameFTPFile(), beim neuen Filenamen der vollständige Pfad in ein existierendes Unterverzeichnis angegeben wurde, wird die Datei unter dem neuen Namen in dieses Verzeichnis verschoben.
Wenn bei RenameFTPFile(), beim alten Filenamen der Pfad fehlt, findet er die Datei nicht (außer in der root).
3.)
Bei RenameFTPFile() kommt immer '0' zurück, egal ob erfolgreich oder nicht. Auch wenn RenameFTPFile() in der root (ohne Pfadzusatz) eine Datei erfolgreich umbenannt hat.
Die Verbindungsnummer für RenameFTPFile() wurde zuvor mit OpenFTP(#PB_Any, ... generiert.
Alles getestet mit Servern von Hetzner und Ionos, aber andere werden sich vermutlich auch so verhalten. Sorry, aber ich möchte hier keinen Online-Speicher mit Schreibrechten öffentlich dafür zur Verfügung stellen und ich hoffe nun, ihr habt selbst einen SFTP-Server wenn ihr den Demo-Code mal testen wollt.
Code: Alles auswählen
EnableExplicit
Enumeration
#FtpNbr
EndEnumeration
Define FTP_Server$ = ""
Define FTP_UserName$ = ""
Define FTP_Password$ = ""
Define Port = 22
Define Passiv = #False
Define Pattern$ = "Alle Dateien (*.*)|*.*"
Define PfadUndDateiname$ = OpenFileRequester("Chose File", "", Pattern$, 0)
If PfadUndDateiname$ = "" : End : EndIf
Define Dateiname$ = GetFilePart(PfadUndDateiname$)
Procedure showEntrys(nbr)
If ExamineFTPDirectory(#FtpNbr)
While NextFTPDirectoryEntry(#FtpNbr)
If nbr : Debug Str(nbr) + ": Im Verzeichnis 'test1' ist: " + FTPDirectoryEntryName(#FtpNbr) : EndIf
Wend
FinishFTPDirectory(#FtpNbr)
Else
Debug Str(nbr) + ": Kann das FTP-Verzeichnis nicht auflisten"
EndIf
EndProcedure
If OpenFTP(#FtpNbr, FTP_Server$, FTP_UserName$, FTP_Password$, Passiv, Port)
Debug "Verbindung hergestellt"
;showEntrys(5)
If CreateFTPDirectory(#FtpNbr, "test1")
Debug "Verzeichnis 'test1' hergestellt"
If SetFTPDirectory(#FtpNbr, "test1")
Debug "Bin in's Verzeichnis 'test1' gewechselt"
If SendFTPFile(#FtpNbr, PfadUndDateiname$, Dateiname$)
Debug "Die Datei wurde hochgeladen"
showEntrys(1)
; Debug "Umbenennung 1 = " + Str(RenameFTPFile(#FtpNbr, Dateiname$, "xxx" + Dateiname$)) ; funktioniert nicht
Debug "Umbenennung 1 = " + Str(RenameFTPFile(#FtpNbr, "/test1/" + Dateiname$, "/test1/" + "xxx" + Dateiname$)) ; gibt immer '0' zurück
showEntrys(2)
; Debug "Umbenennung 2 = " + Str(RenameFTPFile(#FtpNbr, "xxx" + Dateiname$, Dateiname$)) ; funktioniert nicht
Debug "Umbenennung 2 = " + Str(RenameFTPFile(#FtpNbr, "/test1/" + "xxx" + Dateiname$, "/test1/" + Dateiname$)) ; gibt immer '0' zurück
showEntrys(3)
; If DeleteFTPFile(#FtpNbr, Dateiname$) ; funktioniert nicht
If DeleteFTPFile(#FtpNbr, "/test1/" + Dateiname$)
Debug "Die Datei wurde wieder gelöscht"
Else
Debug "Konnte die Datei nicht löschen"
EndIf
Else
Debug "Konnte die Datei nicht hochladen"
EndIf
If SetFTPDirectory(#FtpNbr, "..")
Debug "Bin wieder in der root"
Else
Debug "Konnte nicht wieder zurück in die root"
EndIf
Else
Debug "Konnte nicht in's Verzeichnis 'test1' wechseln"
EndIf
; If DeleteFTPDirectory(#FtpNbr, "test1") ; funktioniert nicht
If DeleteFTPDirectory(#FtpNbr, "/test1")
Debug "Verzeichnis 'test1' wieder gelöscht"
Else
Debug "Konnte Verzeichnis 'test1' nicht wieder löschen"
EndIf
Else
Debug "Konnte Verzeichnis 'test1' nicht herstellen"
EndIf
CloseFTP(#FtpNbr)
Else
Debug "Verbindung konnte nicht aufgebaut werden"
EndIf
; PB-Version: PureBasic 6.20 (Windows - x64)
; OS: Windows 8.1 64 Bit
; Compilereinstellungen:
; [ ] Unicode-Executable erstellen
; [ ] Thread-sicheres Executable erstellen
; [ ] OnError-Unterstützung einschalten
; [x] Moderne Themen-Unterstützung aktivieren (für Windows XP und höher)
; [ ] Administrator-Modus für Windows Vista und höher anfordern
; [ ] User-Modus für Windows Vista und höher anfordern (keine Virtualisierung)
; Library Subsystem: -
Grüße
Ralf