Hallo Leute,
ich habe hier ein Problem, und schaffe es einfach nicht.
Ich möchte mehrere Dateien auf einen FTP Server laden.
Leider werden nicht immer alle Dateien auf den SErver geladen.
Weis hier jemand eine lösung?
Bitte CSHARP-Codetags zum Formatieren von C# verwenden, siehe [Hinweis] Wie poste ich richtig? Punkt 6, danke.
private void uploadFile()
{
if (fehler == 0)
{
try
{
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("url + datafile");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(user, pw);
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = false;
//Load the file
FileStream stream = File.OpenRead(pathtocopy);
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Close();
//Upload file
Stream reqStream = request.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();
FtpWebRequest request1 = (FtpWebRequest)FtpWebRequest.Create("url + dataxls");
request1.Method = WebRequestMethods.Ftp.UploadFile;
request1.Credentials = new NetworkCredential(user, pw);
request1.UsePassive = true;
request1.UseBinary = true;
request1.KeepAlive = false;
//Load the file
FileStream stream1 = File.OpenRead(pathtofile);
byte[] buffer1 = new byte[stream1.Length];
stream1.Read(buffer1, 0, buffer1.Length);
stream1.Close();
//Upload file
Stream reqStream1 = request1.GetRequestStream();
reqStream1.Write(buffer1, 0, buffer1.Length);
reqStream1.Close();
foreach (string fi in Directory.GetFiles(System.Windows.Forms.Application.UserAppDataPath + "\\Upload-Dateien"))
{
UploadFiles(fi.ToString(), urltoftpdirectory + fi.Replace(System.Windows.Forms.Application.UserAppDataPath + "\\Upload-Dateien\\","").ToString());
}
}
catch
{
fehler++;
}
}
}
static FtpWebRequest connection ;
private static void Connect(string name)
{
try
{
FtpWebRequest FtpClient = (FtpWebRequest)FtpWebRequest.Create(new Uri(name));
FtpClient.Credentials = new NetworkCredential(user, pw);
FtpClient.KeepAlive = false;
if ((FtpWebRequest)FtpClient != null)
{
connection = FtpClient;
}
}
catch (Exception e)
{
throw new Exception("Fehler beim Verbindungsaufbau!\r\n" + e.InnerException.Message);
}
}
public void UploadFiles(string FileFrom, string FileTo)
{
if (string.IsNullOrEmpty(FileFrom))
throw new Exception("Parameter darf nicht Null or Empty sein");
if (string.IsNullOrEmpty(FileTo))
throw new Exception("Parameter darf nicht Null or Empty sein");
Connect(FileTo);
connection.UseBinary = false;
connection.Method = WebRequestMethods.Ftp.UploadFile;
byte[] fileContents = File.ReadAllBytes(FileFrom);
connection.ContentLength = fileContents.Length;
Stream requestStream = connection.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)connection.GetResponse();
response.Close();
}
Hallo,
ich bin mir jetzt nicht sicher, aber du machst einen WebRequest für jedes File. Müssen die nicht auch wieder geschlossen werden?
Hallo!
@suam111:
FTP ist manchmal etwas bockig. Am besten extrahierst du erstmal die Methode zum hochladen einer Datei und verwendest in dieser eine Schleife, welche das Hochladen im Fehlerfall wiederholt. Meistens reicht eine Wiederholung, aber idealerweise kannst du die Schleife so bauen, das du einen dynamischen Wert vorgeben kannst, der bei Bedarf angepasst werden kann.
Nobody is perfect. I'm sad, i'm not nobody 🙁
Hallo,
ich arbeite auch grade an meinem eigenen FTP-client.
(mal am rande: ich verstehe auch nicht warum MS nicht in VS2008 mal einen fertigen basis-client mitliefern kann..)
dein problem beim hochladen ist das man für jede einzelne datei einen WebRequest erstellen muss a la
(FtpWebRequest)FtpWebRequest.Create(new Uri(MyFile));
daher funktioniert das hochladen von mehreren dateien in deinem code nicht.
unabhängig davon ist der code sehr sehr komisch strukturiert (was hat uploadFile() mit dem rest des codes zu tun?) und ich bin mir auch nicht sicher ob Create() einen string mit "+" darin entgegenenimmt. ich nehme mal an das sollte
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("url" + "datafile");
sein oder halt ohne " je nach typ.
setzt man für jeden request die eigenschaft "KeepAlive" auf true, so wird die aufgebaute verbindung nach schließen des requests im connection-pool (hat was mit dem ServicePointManager zu tun) behalten.
erzeugt man dann einen neuen request, wird die bestehende verbindung weiterbenutzt.
falls ich mit letzterer aussage total falsch liege, korrigiert mich bitte. ich versuche selbst noch dahinter zu kommen wie man diese WebRequest klassen vernünftig in einen FTP-Client einbauen kann der am anfang EINMAL eine Connect() methode hat und dort die verbindung aufbaut..