Die Datei kann nicht mit FTP-Methoden umbenannt werden, wenn sich das aktuelle Benutzerverzeichnis von Root unterscheidet

8

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:

gesetzt
  

Benutzer / 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

um

Die 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%     
Agata 14.06.2010, 07:32
quelle

2 Antworten

7

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 "/".

vereinfachen     
Miroslav Bajtoš 21.02.2012 10:19
quelle
4

C #

%Vor%

Benennen Sie den Dateinamen auf der FTP-Server-Funktion

C #

%Vor%     
user756672 21.05.2011 07:32
quelle

Tags und Links