Bemerkung: Aufgrund der Spam-Abwehr war ich gezwungen, den Anfang des Uris von ftp: // auf ftp zu ersetzen.
Ich habe folgendes Problem. Ich muss Datei mit C # ftp-Methode hochladen und anschließend umbenennen. Einfach richtig? :)
Ok, sagen wir, mein FTP-Host ist so:
ftp.contoso.com
und nach dem Einloggen wird das aktuelle Verzeichnis auf:
gesetztBenutzer / Name
Also versuche ich mich anzumelden, lade die Datei als Datei.ext.tmp in das aktuelle Verzeichnis hoch und benenne die Datei nach dem Upload in Datei.ext
umDie ganze Schwierigkeit ist, wie ich denke, die Anfrage Uri für FtpWebRequest richtig zu setzen.
MSDN besagt:
Der URI kann relativ oder absolut sein. Wenn der URI das Format " ftp://contoso.com/%2fpath " hat (% 2f ist ein Escapezeichen '/') , dann ist der URI absolut, und das aktuelle Verzeichnis ist / path. Wenn der URI jedoch die Form " ftp://contoso.com/path " aufweist, meldet sich das .NET Framework zuerst in der FTP-Server (unter Verwendung des Benutzernamens und des Kennworts, die von der Credentials-Eigenschaft festgelegt wurden), wird das aktuelle Verzeichnis auf UserLoginDirectory / path festgelegt.
Ok, also lade ich die Datei mit folgendem URI hoch:
ftp.contoso.com/file.ext.tmp
Großartig, die Datei landet wo ich wollte: im Verzeichnis "users / name"
Nun möchte ich die Datei umbenennen, also erstelle ich eine Webanfrage mit folgendem Uri:
ftp.contoso.com/file.ext.tmp
und benennen Sie den Parameter wie folgt um:
file.ext
und das gibt mir 550 Fehler: Datei nicht gefunden, keine Berechtigungen, etc.
Ich habe dies in Microsoft Network Monitor verfolgt und es gab mir:
Befehl: RNFR, Umbenennen von
CommandParameter: /file.ext.tmp
Ftp: Antwort auf Port 53724, '550 File /file.ext.tmp not found'
als ob es nach der Datei im Wurzelverzeichnis suchen würde - nicht im aktuellen Verzeichnis.
Ich habe die Datei manuell mit Total Commander umbenannt und der einzige Unterschied war, dass CommandParameter ohne den ersten Schrägstrich war:
CommandParameter: Datei.ext.tmp
Ich bin in der Lage, die Datei erfolgreich umzubenennen, indem ich folgenden absoluten URI zur Verfügung stelle:
ftp.contoso.com/%2fusers/%2fname/file.ext.tmp
aber ich mag diesen Ansatz nicht, da ich den Namen des aktuellen Benutzerverzeichnisses kennen müsste. Dies kann wahrscheinlich mithilfe von WebRequestMethods.Ftp.PrintWorkingDirectory erfolgen, aber es führt zu zusätzlicher Komplexität (durch Aufrufen dieser Methode zum Abrufen des Verzeichnisnamens und anschließendes Kombinieren der Pfade zum richtigen URI).
Was ich nicht verstehe ist, warum die URI ftp.contoso.com/file.ext.tmp für das Hochladen und nicht für das Umbenennen gut ist? Fehle ich hier etwas?
Das Projekt wird auf .NET 4.0 festgelegt, das in Visual Studio 2010 codiert ist.
Bearbeiten
Ok, ich platziere Code-Snippet.
Bitte beachten Sie, dass FTP-Host, Benutzername und Passwort ausgefüllt werden sollten. Damit dieses Beispiel funktioniert - also einen Fehler erzeugt - muss sich das Benutzerverzeichnis von root unterscheiden ("pwd" -Kommando sollte etwas anderes als "/" zurückgeben)
%Vor%Ich habe ein ähnliches Problem festgestellt. Das Problem ist, dass FtpWebRequest (falsch) prepends '/' zum Umbenennen von Anfragen, wie aus diesem Protokoll (Upload & amp; Umbenennung) zu sehen:
%Vor% Beachten Sie, dass dieses Problem nur auftritt, wenn Sie in das Stammverzeichnis hochladen. Wenn Sie die URL in http://127.0.0.1/path/Test.txt
geändert haben, würde alles funktionieren.
Meine Lösung für dieses Problem ist die Verwendung von% 2E (Punkt) als Pfad:
%Vor%Sie müssen den Punkt url-encodieren, andernfalls würde FtpWebRequest den Pfad "/./" zu "/".
vereinfachenC #
%Vor%Benennen Sie den Dateinamen auf der FTP-Server-Funktion
C #
%Vor%Tags und Links c# rename ftp ftpwebrequest