Seite 1 von 1

RenameFTPFile() liefert bei SFTP immer '0' zurück, egal ob erfolgreich oder nicht

Verfasst: 24.04.2025 18:16
von RalfP
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.

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

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

Re: RenameFTPFile() liefert bei SFTP immer '0' zurück, egal ob erfolgreich oder nicht

Verfasst: 28.04.2025 08:27
von RalfP
Wie ich jetzt gesehen habe, ist das wohl auch schon in Arbeit:
https://www.purebasic.fr/english/viewto ... TP#p632235
Ich weiss nur nicht, ob man dort davon ausgeht, dass es nur bei Linux auftritt.

Ralf