Hallo,
ich möchte einen Zugriff auf einen
FTP Server programmieren. Ich habe leider
keine Erfahrung mit den neuen Klassen FtpWebRequest
und FtpWebResponse. Folgenden Code(ein Ausschnitt) habe
ich mir bereits zusammengeschrieben:
private string error = string.Empty;
private FtpWebRequest request;
private const string NO_ERROR = "No Error Message Available";
/*
* Constructor
*
* Non accessable Contructor.
* Use Ftp(string pUri) instead.
*/
private Ftp()
{
}
/*
* Constructor
*
* pUri: The URI for the destinated FTP Server.
* Example: "ftp://domain.de/folder"
*/
public Ftp(string pUri)
{
this.request = (FtpWebRequest) WebRequest.Create(pUri);
this.error = NO_ERROR;
}
/*
* Opens the connection to the destination.
*
* pUser: Username
* pPass: Password
*
* If connection was successfull, the return value is true.
*/
public bool open(string pUser, string pPass)
{
request.Credentials = new NetworkCredential(pUser, pPass);
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
try
{
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
MessageBox.Show("OK");
return true;
}
catch (Exception ex)
{
this.error = ex.Message;
MessageBox.Show(this.error);
return false;
}
}
Jetzt möchte den Zugriff auf den Ftp Servre testen..
Ftp ftp = new Ftp("ftp://111.222.333.444/");
ftp.open("User","pass");
Und erhalte folgende Fehlermeldung:
"Der Remoteserver hat einen Fehler zurückgegeben: (403) Unzulässig"
Was mache ich falsch. Ich habe mich an Beipielen aus den Inet gehalten,
die es eben so machen. Der Zugriff über den IE klappt mit den Zugangsdaten einwandfrei.
Ich danke für alle Hinweise die gegeben werden können.
Gruß
Ok, das habe ich nun selbst herausfinden können:
request.Proxy = null
führt wohl dazu, dass kein Proxy verwendet wird.
Und dann klappt es auch mit dem Nachbarn 😉
Eine andere Frage dazu habe ich auch noch:
Ist es möglich mit den .NET 2.0 Klassen Dateiattribute zu ändern?
Danke
ja z.B.
DateTime ct = File.GetCreationTime(dllFileName);
DateTime at = File.GetLastAccessTime(dllFileName);
DateTime wt = File.GetLastWriteTime(dllFileName);
oder
File.SetCreationTime(dllFileName, ct);
File.SetLastAccessTime(dllFileName, at);
File.SetLastWriteTime(dllFileName, wt);
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
Danke für die Antwort.
Ist die von dir beschriebene Vorgenhensweise denn auf die
Dateien auf dem FTP Server anwednbar? Wenn ja: Wie macht man das?
Danke
Bin wieder etwas schlauer geworden:
Man kann anstatt
this.request.Method = WebRequestMethods.Ftp.ListDirectoryDetails
auch
this.request.Method = "LIST";
verwenden.
Scheinbar ist es möglich selbst FTP-Befehle als String zu definieren.
Leider klappt auch da nicht wie erwartet und in den wenigsten Fällen.
Beispielsweise klappt der Verzeichniswechsel..
"CWD Verzeichnis"
in ein Unterverzeichnis nicht. Das verstehe ich allerdings nicht.
Welche Befehle werden denn in welche Sysntax unterstüzt?
Bin wieder etwas schlauer geworden:
Man kann anstatt
this.request.Method = WebRequestMethods.Ftp.ListDirectoryDetails
auch
this.request.Method = "LIST";
verwenden.
Scheinbar ist es möglich selbst FTP-Befehle als String zu definieren.
Leider klappt auch da nicht wie erwartet und in den wenigsten Fällen.
Beispielsweise klappt der Verzeichniswechsel..
"CWD Verzeichnis"
in ein Unterverzeichnis nicht. Das verstehe ich allerdings nicht.
Welche Befehle werden denn in welche Syntax unterstüzt?
Zitat MSDN-Lib zu FtpWebRequest.Method:
You can set Method to any command recognized by the server and use the FtpWebRequest object to send the command. This works as expected only if the command does not require you to send data and the server does not send data in response to the request.
Das Problem bei dieser Klasse ist, dass sie nicht zum Arbeiten auf einem FTP-Server gedacht ist, sondern nur zum schnellen Hoch- und Runterladen von Dateien.
Wenn du mehr Komfort möchtest, musst du das FTP selbst implementieren.
Oje, das wird ja immer schlimmer bibber
Ich hab zudem auch noch ein anderes Problem.
Wenn ich das Directory auslese, dann bekomme ich aj nur
einen Stream aus dem ich wieder die Strings erzeugen kann..
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = string.Empty;
do
{
line = reader.ReadLine();
System.Diagnostics.Debug.WriteLine(line);
}
while (line != null);
Für jede Datei und hejdes Verzeichnis habe ich also nun einen String,
der bei mir eine solche Struktur hat:
-rw-rw-rw- 1 user group 38793472 Mar 5 13:09 Backup_050307.zip
Den muss ich ja jetzt zerlegen um an die Einzelnen Informationen zu kommen.
Hat da jemand einen link oder Codesnippet für mich?
Ist das wirklich die einzige, zudem sehr unkomfortable, Vorgehensweise die Datei und Verzeichnisstruktur auszulesen?
Und kann ich mich auf diese eine Strukur verlassen oder ist das auch wieder von Server zu Server unterschiedlich?
Danke nochmals
Ich geh mal davon aus, das hier niemand eine Antwort kennt,
es also keine besseren Möglichkeiten seitens .NET 20 gibt 😦
Das Problem bei dieser Klasse ist, dass sie nicht zum Arbeiten auf einem FTP-Server gedacht ist, sondern nur zum schnellen Hoch- und Runterladen von Dateien.
Wenn du mehr Komfort möchtest, musst du das FTP selbst implementieren.
oder dich nach einer alternativen Klasse umschauen.
Hi,
ich hätte auch zwei kleine Fragen zu dieser Klasse, wollte aber nicht extra ein neues Thema dafür aufmachen.
Danke 😁