Laden...

Mehrere Dateien uploaden

Erstellt von userid3554 vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.109 Views
U
userid3554 Themenstarter:in
38 Beiträge seit 2006
vor 14 Jahren
Mehrere Dateien uploaden

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();
        }
U
105 Beiträge seit 2004
vor 14 Jahren

Hallo,

ich bin mir jetzt nicht sicher, aber du machst einen WebRequest für jedes File. Müssen die nicht auch wieder geschlossen werden?

1.820 Beiträge seit 2005
vor 14 Jahren

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 🙁

35 Beiträge seit 2008
vor 14 Jahren

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