Laden...

[gelöst] Excel-Datei nach FTP-Download beschädigt

Erstellt von Antimaster vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.476 Views
A
Antimaster Themenstarter:in
15 Beiträge seit 2009
vor 14 Jahren
[gelöst] Excel-Datei nach FTP-Download beschädigt

Hallo,
Ich habe folgendes Problem. Ich habe auf einem FTP-Server eine Excel-Datei liegen. Wenn ich mir diese Datei jetzt über mein Programm runterlade, funktioniert alles ohne Fehler und ich kriege auch eine Excel-Datei auf dem Rechner. Problem ist allerdings, dass jegliche Formatierung und Leerzellen durch Rechtecke ersetzt sind und somit auch die gespeicherten Makros der Datei nicht erkannt werden. Wenn ich die Datei allerdings mit FileZilla runterlade funktioniert sie.


       private void download_FTP(string Quelldatei, string Zieldatei, string user, string passwort,string proxyAdress, string proxyPort,string proxyUser,string proxyPassword)
        {
            FileInfo fi = new FileInfo(Zieldatei);



            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Quelldatei);

            if (fi.Exists)
            {
                fi.Delete();
            }

            request.UseBinary = true;

            if (Properties.Settings.Default.Checkbox == true)
            {
                //if you need a proxy with credentials
                request.Credentials = new NetworkCredential(user, passwort);

                request.Proxy = new WebProxy(proxyAdress);
                request.Proxy.Credentials = new NetworkCredential(proxyUser, proxyPassword);
           

                request.UsePassive = false;
    

                request.Method = WebRequestMethods.Ftp.DownloadFile;
                request.Credentials = new NetworkCredential(user, passwort);
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream, Encoding.Default);
                StreamWriter sw = new StreamWriter(Zieldatei);
                sw.Write(reader.ReadToEnd()); sw.Close();
                reader.Close(); response.Close();
            }

            else
            {
                request.Credentials = new NetworkCredential(user, passwort);
                request.UsePassive = false;

                request.Method = WebRequestMethods.Ftp.DownloadFile;
                request.Credentials = new NetworkCredential(user, passwort);
                FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream, Encoding.Default);
                StreamWriter sw = new StreamWriter(Zieldatei);
                sw.Write(reader.ReadToEnd()); sw.Close();
                reader.Close(); response.Close();
                


            }

Ob das mit dem Proxy funktioniert habe ich noch nicht getestet, deswegen geht es erstmal hauptsächlich um das "else". Mit binary true/false hab ich auch schon probiert. Klappt auch nicht.
Ich ziehe allerdings mit der gleichen Methode ohne Probleme CSV Dateien. Diese werden nicht beschädigt oder fehlerhaft geladen
Woran könnte es noch liegen?

Danke

C
401 Beiträge seit 2007
vor 14 Jahren

Das wird am Encoding liegen. Versuch es mal mit BinaryReader/Writer

edit: Oder erstmal mit nem anderen Encoding...

A
Antimaster Themenstarter:in
15 Beiträge seit 2009
vor 14 Jahren

Wäre das nicht genau das gleiche als wenn ich die Encoding.Default ändere?

Wie würde die Umsetzung auch Binary aussehen?

Danke

A
Antimaster Themenstarter:in
15 Beiträge seit 2009
vor 14 Jahren

Hab alle Encoding-Varianten ausprobiert.
Hat auch nicht geklappt.
Wie soll ich jetzt weiter verfahren? Kann ich das einfach auf BinaryStream ändern? Hab noch nie damit gearbeitet. Wie ersetze ich dann das "sw.Write(reader.ReadToEnd())" oder die Angabe der Zieladresse?

Danke

C
401 Beiträge seit 2007
vor 14 Jahren

Hi,

bei mir hat das so geklappt:


FtpWebRequest req = WebRequest.Create(url) as FtpWebRequest;
req.Credentials = new NetworkCredential(user, pass);
req.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse response = (FtpWebResponse)req.GetResponse();
Stream responseStream = response.GetResponseStream();
BinaryReader reader = new BinaryReader(responseStream);
BinaryWriter writer = new BinaryWriter(File.OpenWrite("test2.xls"));
byte[] buffer = new byte[1024];
while (reader.Read(buffer, 0, 1024) != 0)
{
    writer.Write(buffer);
}

Gruß

Dario

A
Antimaster Themenstarter:in
15 Beiträge seit 2009
vor 14 Jahren

Danke für den Code allerdings funktioniert das immer noch nicht. Er sagt mir nach dem download beim öffnen der Datei "ungültiges Dateiformat".

Hast du sonst noch eine Idee?

Grüße Marcel

A
Antimaster Themenstarter:in
15 Beiträge seit 2009
vor 14 Jahren

Wenn ich das ganze mit einer leeren Excel-Mappe mache bekomme ich die Fehlermeldung nach dem Download"Auf Test1.xls konnte nicht zugegriffen werden. Unter Umständen ist die Datei schreibgeschützt, oder der Server auf dem die Datei gespeichert ist reagiert nicht mehr"

Ich bin echt am Verzweifeln. Kann doch nicht so schwer sein eine Excel-Datei von nem FTP zu downloaden.

Danke schonmal für alle hilfreichen Antworten

A
Antimaster Themenstarter:in
15 Beiträge seit 2009
vor 14 Jahren

So für alle die das selbe Problem haben. Der Ansatz BinaryWriter war schon richtig allerdings fehlt ein wichtiger Teil des Code damit das ganze auch funktioniert. Hat mich ne halbe Nacht Gehirnschmalz gekostet aber jetzt läufts.
Er hat vorher auch die Daten gezogen allerdings hat die Datei nie funktioniert.
Hier die Lösung:


                BinaryReader reader = new BinaryReader(responseStream);
                BinaryWriter writer = new BinaryWriter(File.OpenWrite(Zieldatei));

                int bufferSize = 2048;
                int readCount;
                byte[] buffer = new byte[bufferSize];

                readCount = reader.Read(buffer, 0, bufferSize);
                while (readCount > 0)
                {
                    writer.Write(buffer, 0, readCount);
                    readCount = reader.Read(buffer, 0, bufferSize);
                }

Wichtig ist beim Schreiben nicht den festen Buffer zu benutzen sondern den readCount. Sonst gibt es beim letzten Schreiben Probleme wenn die Datei kleiner ist als 2048. Dann hängt er Daten an und dadurch wird die Datei zerstört. Also erst lesen wieviel noch übrig ist.
Aber dennoch danke für die Sache mit dem BinaryWriter.