Laden...

FTP-Upload erstellt leere Dateien

Erstellt von KevinHappy vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.480 Views
K
KevinHappy Themenstarter:in
41 Beiträge seit 2015
vor 8 Jahren
FTP-Upload erstellt leere Dateien

Hallo,

ich möchte gerne eine Datei per FTP hochladen. Das Programm ließt den Ordner aus und lädt dann die Dateien hoch. Nur leider sind diese immer leer. Der Server ist ein lokaler Testserver, ich denke damit wird es aber wenig zu tun haben.


ftp ftpClient = new ftp(@"ftp://192.168.1.11", "testftp", "123456");
        public void readDir()
        {
            string path = "C:\\Testordner";
            System.IO.DirectoryInfo ParentDirectory = new System.IO.DirectoryInfo(path);

            foreach (System.IO.FileInfo f in ParentDirectory.GetFiles())
            {
                //changeData(path + "\\" + f.Name);
                ftpClient.upload("/var/www/" + f.Name, path + "\\" + f.Name);
                //File.Delete(path + "\\" + f.Name);
            }
        }


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace UploadAndConvertProductsXml
{
    class ftp
    {
        private string host = null;
        private string user = null;
        private string pass = null;
        private FtpWebRequest ftpRequest = null;
        private FtpWebResponse ftpResponse = null;
        private Stream ftpStream = null;
        private int bufferSize = 20000000;

        /* Construct Object */
        public ftp(string hostIP, string userName, string password) 
        { 
            host = hostIP; 
            user = userName; 
            pass = password; 
        }

        /* Upload File */
        public void upload(string remoteFile, string localFile)
        {
            try
            {
                /* Create an FTP Request */
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile);
                /* Log in to the FTP Server with the User Name and Password Provided */
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                /* When in doubt, use these options */
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                /* Specify the Type of FTP Request */
                ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
                /* Establish Return Communication with the FTP Server */
                ftpStream = ftpRequest.GetRequestStream();
                /* Open a File Stream to Read the File for Upload */
                FileStream localFileStream = new FileStream(localFile, FileMode.Create);
                /* Buffer for the Downloaded Data */
                byte[] byteBuffer = new byte[bufferSize];
                //byte[] byteBuffer = new byte[localFileStream.Length];
                int bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);
                /* Upload the File by Sending the Buffered Data Until the Transfer is Complete */
                try
                {
                    while (bytesSent != 0)
                    {
                        ftpStream.Write(byteBuffer, 0, bytesSent);
                        bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);
                    }
                }
                catch (Exception ex) { Console.WriteLine(ex.ToString()); }
                /* Resource Cleanup */
                localFileStream.Close();
                ftpStream.Close();
                ftpRequest = null;
            }
            catch (Exception ex) { Console.WriteLine(ex.ToString()); }
            return;
        }
    }


}

Wo ist der Fehler, dass die Dateien auf dem Server leer sind?

--
Vielen Dank

LG
Kevin

W
872 Beiträge seit 2005
vor 8 Jahren

Es sieht auf jeden Fall zu kompliziert aus, was Du machst,
Ich würde WebClient.UploadFile stattdessen benutzen. Die Ftp Login Daten setzt Du in das Credential Property und die URI und BaseAdress müssen zu Deinem Ftp-Server passen - im Zweifel einen WebBrowser für die Uri benutzen.

2.298 Beiträge seit 2010
vor 8 Jahren

Hallo,

bin mir jetzt nicht sicher ob es das Problem schon löst, aber du solltest Streams auch schließen, wenn keine Exception geworfen wird. Hast du nach dem Stream.Write auch mal ein Stream.Flush probiert?

Für das Schließen der Streams empfehle ich dir den Finally-Block.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

K
KevinHappy Themenstarter:in
41 Beiträge seit 2015
vor 8 Jahren

Hi,

die Streams werden doch ganz unten geschlossen. Habe auch schon Stream.Flush() probiert. man merkt keinen Unterschied.
Mir ist eben aufgefallen, dass die lokale auch leer ist nach dem upload.

Werde mal den Tipp von weismat probieren.

--
Vielen Dank

LG
Kevin

3.170 Beiträge seit 2006
vor 8 Jahren

Hallo,

vielleicht schaust Du mal in FileMode Enumeration was diese Zeile macht:

FileStream localFileStream = new FileStream(localFile, FileMode.Create);

Das erklärt dann auch, wieso Deine lokale Datei anschließend leer ist.

Im Übrigen schließe ich mich weismat an: nutze WebClient.UploadFile

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

2.298 Beiträge seit 2010
vor 8 Jahren

Ich habe deinen Fehler entdeckt. - Wieder mal sehr schusslig wie ich finde.


FileStream localFileStream = new FileStream(localFile, FileMode.Create);

Du erstellst hier eine neue Datei. - Ich dachte, du wolltest eine vorhandene hochladen?

// EDIT:
Argh - zu langsam.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

K
KevinHappy Themenstarter:in
41 Beiträge seit 2015
vor 8 Jahren

Danke.
Ich sollte mal genauer darauf achten, was ich da mache. 8o

Habe jetzt FileMode.Open und es funktioniert. 👍

Werde mir aber dennoch WebClient.UploadFile anschauen.

--
Vielen Dank

LG
Kevin