Laden...

FTP Download - DateiInformationen fehlen

Erstellt von Dhomas vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.327 Views
D
Dhomas Themenstarter:in
18 Beiträge seit 2014
vor 9 Jahren
FTP Download - DateiInformationen fehlen

Hallo zusammen,

ich muss für ein Projekt immer wieder die neusten .dll´s vom Server ziehen.
Der Download funktioniert soweit und er speichert mir meine Dateien wie gewollt erstmal in ein TEMP verzeichnis. Allerdings sind die DateiInformationen leer (wie z.b. Dateibeschreibung,Dateiversion Produktversion,Copyright usw.)

Hier mal mein Code für den Download:


 try
            {                
               
                Uri serverUri = new Uri(Urifile);
                if (serverUri.Scheme != Uri.UriSchemeFtp)
                {
                    return;
                }       
                FtpWebRequest reqFTP;                
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(Urifile));                                
                reqFTP.Credentials = new NetworkCredential(strFtpUser, strFtpPassword);                
                reqFTP.KeepAlive = false;                
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;                                
                reqFTP.UseBinary = true;
                reqFTP.Proxy = null;                 
                reqFTP.UsePassive = false;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);

                string file = Urifile.Substring(Urifile.LastIndexOf('/')+1, Urifile.Length - Urifile.LastIndexOf('/')-1);
                //string ZielPfad = file.Substring(1,file.LastIndexOf('/')-1);
                //Existiert der Zielordner
                if(Directory.Exists(B1SHR+@"\TEMP\") != true)        
                {
                    Directory.CreateDirectory(B1SHR + @"\TEMP\ ");
                }

                StreamWriter writeStream = new StreamWriter(B1SHR + @"\TEMP\" +file, false);
                writeStream.Write(reader.ReadToEnd());     
                writeStream.Close();
                response.Close(); 
            }
            catch (WebException wEx)
            {
                MessageBox.Show(wEx.Message, "Download Error");
            }

Wie gesagt er zieht mir alle gewünschten Dateienrunter nur die "Details" (unter Rechtsklick->Eigenschaften) sind nicht dabei.

An Was kann es liegen?

Gruß
Thomas

_Wenn d´Wurst so dick wia´s Brot is , is Wurst wia dick as Brot is _
++ ----------------------->Mia san Mia<------------------------------++

16.835 Beiträge seit 2008
vor 9 Jahren

Nimm mal nen manuellen FTP Client und lad die Dateien so. Vergleich sie.
Sind dort dann die Informationen vorhanden, oder fehlen sie einfach schon auf dem Server?

Das Teilen von DLLs über einen FTP ist zudem ungewöhnlich.
Da gibts zig bessere Alternativen (zB NuGet, öffentlich oder privat).

D
Dhomas Themenstarter:in
18 Beiträge seit 2014
vor 9 Jahren

Also ich/wir (mein Team) erstellen die DLL´s ja selber also die Informationen sind aufjedenfall vorhanden 😃
Ich hab Sie jetzt mal mit Filezilla runtergeladen da sind die Informationen auch da.

Also der FTP Server ist bei uns hier das ist jetzt alles nur Testweise 😃 Ich geh auch noch mit der internen IP drauf.

Danke schonmal und Gruß

_Wenn d´Wurst so dick wia´s Brot is , is Wurst wia dick as Brot is _
++ ----------------------->Mia san Mia<------------------------------++

16.835 Beiträge seit 2008
vor 9 Jahren

Ihr verwendet also den FTP, um eure Versionen zu verteilen.
Dann nochmal - ohne, dass ich weiß wo das Problem jetzt ist: wieso nehmt ihr nicht zB NuGet um eure DLL versioniert zu verteilen?

3.170 Beiträge seit 2006
vor 9 Jahren

Hallo,

ich denke das liegt daran, dass Du die Daten mit dem StreamReader als UTF-8 Text ausliest -> bei .dll's !?! und dann die verhackstückten Daten auf die Platte schreibst.

Speichere mal einfach die vom Server empfangenen Bytes binär in eine Datei...

Einfacher dürfte aber (wie fast immer) WebClient.DownloadFile sein.

Gruß, MarsStein

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

55 Beiträge seit 2014
vor 9 Jahren

*Hust*
Passwörter im Quellcode..
Wie schon mein Vorposter hat erwähnt, ist der WebClient dir mehr von Nutzen, als dass du
a)
Daten im Quelltext "sicherst"
b)
eine FTP-Verbindung aufbaust um Dateien zu ersetzen/aktualisieren.

Ich habe hier ein SourceCode bereitgestellt:

Der Aufruf:

           
           List<ServerDatei> zuAktualisierendeServerDateien = new List<ServerDatei>();
            zuAktualisierendeServerDateien.Add(new ServerDatei.ServerDatei("HTTP://SERVER.DE", "DATEINAME.DLL"));
            foreach (var Daten in zuAktualisierendeServerDateien)
            {
                Daten.Aktualisiere(@"LOKALER PFAD");
            }

Die ServerDatei-Klasse


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
namespace TestMYCSHARPFORUM.ServerDatei
{
    public class ServerDatei
    {
        public string ServerPfad { get; set; }
        public string zuAktualisierendeDatei { get; set; }

        public bool Vollständig { get; private set; }

        private  WebClient _webClient = new WebClient();

        public ServerDatei(string _ServerPfad, string _zuNutzendeDatei)
        {
            this.ServerPfad = _ServerPfad;
            this.zuAktualisierendeDatei = _zuNutzendeDatei;
            this._webClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(istVollständig);
        }

        public void Aktualisiere(string _SpeicherOrt)
        {
            //Ist anzupassen
            new Thread(new ParameterizedThreadStart(DownloadeAsynchron)).Start(_SpeicherOrt);
        }
                private void DownloadeAsynchron(object _Ort)
                {
                    this._webClient.DownloadFile(new Uri(this.ServerPfad + this.zuAktualisierendeDatei), (string)_Ort + this.zuAktualisierendeDatei);            
                }

        private void istVollständig(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            this.Vollständig = true;
        }
    }
}

Gruß..
-3r0rXx

'Tis not too late to seek a newer world.

D
Dhomas Themenstarter:in
18 Beiträge seit 2014
vor 9 Jahren

Also erstmal Danke an Alle für die schnellen Antworten. Das mit dem Webclient funktioniert einwandfrei

Also danke an 3r0rXx und MarsStein.

@Abt sorry mit NuGet haben wir uns noch nie so beschäftigt. Ich hab mich da kurz umgesehen. Kann man hier von überall zugreifen?
Es handelt sich bei diesem Projekt nur um ein Update Prozess für ein größeres Projekt. Ziel war es das die Anwender dann per Mausklick das Update runterladen können.
(Eben die DLL´s ersetzen).

Gruß

_Wenn d´Wurst so dick wia´s Brot is , is Wurst wia dick as Brot is _
++ ----------------------->Mia san Mia<------------------------------++

16.835 Beiträge seit 2008
vor 9 Jahren

Hi,

also ich würde von dem Quellcode etwas Abstand nehmen - er verstößt gegen so ziemlich alle Grundregeln von C# 😉

Nicht nur die Umlaute sind hier fehl am Platz, auch die Namen von Klasse, Variablen Methoden verstoßen mehr als nur den guten Geschmack.
General Naming Conventions bzw. Naming Guidelines
Das Auslagern von Thread hier macht auch wenig Sinn. Wenn dann macht man die Benachrichtigung über Events und nicht über Eigenschaften.
Gewonnen ist so durch den Thread nämlich: nichts.

Zudem bietet der WebClient von Haus aus WebClient.DownloadFileAsync

NuGet ist zuerst einmal ein öffentlich verfügbares Repository von Projekten, Snippets und Bibliotheken.
Das Vorteil ist: es gibt einen Zwang auf Versionierung und für den öffentlichen Teil auch eine Garantie der Verfügbarkeit auf alte Versionen. Man kann also jederzeit eine alte Version laden und auch sicher aktualisieren.

Was sich in eigenen Umgebungen, wie Firmen, lohnt, ist ein eigenes NuGet Repository zu erstellen. Das kann ein Webserver sein, oder einfach nur eine Netzwerkshare eines internen Servers im Unternehmen.
Einfacher und sicherer kann man kaum DLLs über mehrere Entwickler und Projekte teilen.