Zum Inhalt springen

FTP komplett downloaden Csharp


swonson

Empfohlene Beiträge

Nabend leute,

Ich möchte ein tool schreiben, womit ich auf einem ftp connecten kann und alles runterladen kann. Ich finde nur seiten im internet, wo beschrieben wird wie man file downloaded und nicht wie man den gesamten ftp bzw einen aufgewählten tree komplett (sammt ornder und unterordner) downloade...

kann mri jemand helfen ? ich bin für jeden ansatz dankbar ;)

mit besten grüßen swonson

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank Klotzkopp ersteinmal für deinen geistreichen Erguß....

Mir ist klar das ich kein fertigen Code kriege deswegen ja auch

kann mri jemand helfen ? ich bin für jeden ansatz dankbar;)

Aber gut was solls.

Ich hab im groben zwei classen gebaut, die von der main form geladen werden. Mein Konstrukt funktioniert einwandfrei! Er ädt runter und erstellt auch die gleiche struktur auf meinem lokalen Verzeichnis, aber leider macht er das nur für einmal... soll heißen, er geht auf den server und lädt den ersten ordner samt inhalt sprich alles datein. Sind in diesem ordner Unterverzeichnisse saugt er nur den ersten davon. Mein Programmd ringt so lange in die Struktur ein bis es nicht mehr weiter geht, aber er geht leider nicht ein Verzeichnis zurück und lädt das nächste Unterverzeichnis.... Ich weiss nicht wie ich das Programmieren soll...

Ich hoffe meine Ausführung war klar, wenn nicht fragt bitte ich suche dringen eine Antwort...

Hier noch meine Classen bzw meine Form:

Form:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

using System.Net;

namespace Testftp

{

    public partial class Form1: Form

    {

        private byte[] downloadedData;

        public string Ftp;

        public string User;

        public string Pw;

        public string Ftp_orig;


        string pfad = @"C:\Users\Swonson\Desktop\Testftp\Testftp\Testftp\download\";


        public Form1()

        {

            InitializeComponent();

        }


        private void Load_tb_Click(object sender, EventArgs e)

        {

            initFiles datei = new initFiles();

            initDir ordner = new initDir();


            Ftp_orig = FTPserver_tb.Text;

            Ftp = FTPserver_tb.Text;

            User = User_tb.Text;

            Pw = Pw_tb.Text;


            try

            {

                datei.GetFile(Ftp, User, Pw, pfad);

                ordner.GetDir(Ftp, User, Pw, pfad);

            }

            catch (Exception)

            {

                MessageBox.Show("Es ist ein Fehler im main-rudimentär aufgetreten!");

            }

        }


        public void Dwn(string FTPAddress, string username, string password, string filename, string destination)

        {

            /*########################################

             *########################################

             *  Dwn all

             *########################################

             *########################################

             * */


            downloadedData = new byte[0];

            try

            {

                FtpWebRequest request = FtpWebRequest.Create(FTPAddress + "/" + filename) as FtpWebRequest;


                ////Holt die Dateigrößen für die Progressbar

                request.Method = WebRequestMethods.Ftp.GetFileSize;

                request.Credentials = new NetworkCredential(username, password);

                request.UsePassive = true;

                request.UseBinary = true;

                request.KeepAlive = true; //hält die Connection offen


                int dataLength = (int)request.GetResponse().ContentLength;


                //hole Datei

                request = FtpWebRequest.Create(FTPAddress + "/" + filename) as FtpWebRequest;

                request.Method = WebRequestMethods.Ftp.DownloadFile;

                request.Credentials = new NetworkCredential(username, password);

                request.UsePassive = true;

                request.UseBinary = true;

                request.KeepAlive = false; //schließt die Connection


                //Progressbar update

                progressBar1.Value = 0;

                progressBar1.Maximum = dataLength;

                //lbProgress.Text = "0/" + dataLength.ToString();


                //Streams

                FtpWebResponse response = request.GetResponse() as FtpWebResponse;

                Stream reader = response.GetResponseStream();


                //Downloadenin Zwischenspeicher

                MemoryStream memStream = new MemoryStream();

                byte[] buffer = new byte[1024]; //downloads


                while (true)

                {

                    Application.DoEvents();


                    //Datein einlesen

                    int bytesRead = reader.Read(buffer, 0, buffer.Length);


                    if (bytesRead == 0)

                    {

                        progressBar1.Value = progressBar1.Maximum;

                        //lbProgress.Text = dataLength.ToString() + "/" + dataLength.ToString();


                        Application.DoEvents();

                        break;

                    }

                    else

                    {

                        //Downloadstream puffern

                        memStream.Write(buffer, 0, bytesRead);


                        //Progressbar updaten

                        if (progressBar1.Value + bytesRead <= progressBar1.Maximum)

                        {

                            progressBar1.Value += bytesRead;

                            //text125.Text= progressBar1.Value.ToString() + "/" + dataLength.ToString();

                            //Status();


                            progressBar1.Refresh();

                        }

                    }

                }


                //Eingehende Dateiinformation ín Byte speichern

                downloadedData = memStream.ToArray();

                reader.Close();

                memStream.Close();

                response.Close();


                if (downloadedData != null && downloadedData.Length != 0)

                {

                    //Die gepufferten Byte in Dateiform bringen

                    FileStream newFile = new FileStream(destination+ @"\" + filename, FileMode.Create);

                    newFile.Write(downloadedData, 0, downloadedData.Length);

                    newFile.Close();

                }

                else

                {

                    MessageBox.Show("Keine Datein gepuffert!");

                }


            }

            catch (Exception)

            {

                MessageBox.Show("Es ist ein Fehler aufgetreten.");

            }


            //textData.Text = downloadedData.Length.ToString();

            username = string.Empty;

            password = string.Empty;

        }

    }

}

Klasse 1: Holt ließt die Datein auf dem Server aus und übergibt sie der Funktion in der Form zum downloaden
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

using System.Net;


namespace Testftp

{

    public class initFiles

    {

        Form1 mainform = new Form1();

        string sort;

        string[] words;

        int i = 0;

        public void GetFile(string FTPAddress, string username, string password, string pfad)

        {

            MessageBox.Show("GetFile geladen!");

            try

            {

                FtpWebRequest request = FtpWebRequest.Create(FTPAddress) as FtpWebRequest;


                request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

                request.Credentials = new NetworkCredential(username, password);

                request.UsePassive = true;

                request.UseBinary = true;

                request.KeepAlive = false;


                FtpWebResponse response = request.GetResponse() as FtpWebResponse;

                Stream responseStream = response.GetResponseStream();

                StreamReader reader = new StreamReader(responseStream);


                while (!reader.EndOfStream)

                {

                    sort = reader.ReadLine();

                    if (sort.StartsWith("-"))

                    {

                        words = sort.Split(' ');

                        mainform.Dwn(FTPAddress, username, password, words[words.Length - 1], pfad);

                    }

                }

                reader.Close();

                responseStream.Close();

                response.Close();

            }

            catch (Exception)

            {

                MessageBox.Show("Es ist ein Fehler in der \n Klasse: 'initFiles' aufgetreten!");

            }

        }

    }

}

klasse 2: Erstellt die Gefunden Ordner auf meinem Lokalen verzeichnis und speichert den Ordnerpfad. Aber genau hier liegt das problem, er geht wie gesagt nicht eine Ebene zurück.. :(
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

using System.Net;


namespace Testftp

{

    class initDir

    {

        Form1 mainform = new Form1();

        initFiles datein = new initFiles();

        string sort;

        string[] words_dir;


        public void GetDir(string FTPAddress, string User, string Pw, string pfad)

        {

            MessageBox.Show("GetDir geladen!");


            try

            {

                FtpWebRequest request = FtpWebRequest.Create(FTPAddress) as FtpWebRequest;


                request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

                request.Credentials = new NetworkCredential(User, Pw);

                request.UsePassive = true;

                request.UseBinary = true;

                request.KeepAlive = false;


                FtpWebResponse response = request.GetResponse() as FtpWebResponse;

                Stream responseStream = response.GetResponseStream();

                StreamReader reader = new StreamReader(responseStream);


                while (!reader.EndOfStream)

                {

                    sort = reader.ReadLine();

                    if (sort.StartsWith("d"))

                    {

                        words_dir = sort.Split(' ');

                    }

                }


                reader.Close();

                responseStream.Close();

                response.Close();


                string Ftp = FTPAddress + "/" + words_dir[words_dir.Length - 1];

                pfad += words_dir[words_dir.Length - 1] + @"\";

                Directory.CreateDirectory(pfad);

                datein.GetFile(Ftp, User, Pw, pfad);


            }

            catch (Exception)

            {

                MessageBox.Show("Es ist ein Fehler in der \n Klasse: 'initDir' aufgetreten!");

            }

        }

    }

}

Kann mir jemand helfen? Ich hoffe ich habe mein Problem klar dargelegt...

Vielen Dank schonmal..

Beste Grüße Swonson

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank Klotzkopp ersteinmal für deinen geistreichen Erguß....
Gern geschehen. Immerhin hat es gereicht, dich aus der Reserve zu locken, und dich dazu zu bringen, zu zeigen, was du schon hast.

Bist du wirklich sicher, dass dein Code die richtige Ordnerstruktur wieder herstellt? Es sieht mir mehr danach aus, als ob der Code Ordner, die eigentlich nebeneinander liegen sollten, untereinander anordnet.

Ich glaube, der Code macht als aus folgender Struktur auf dem Server


A
+-B
+-C[/code] das hier auf dem Client:
[code]
A
+-B
+-C

Alle danach in A gefundenen Dateien werden auch in die zwischenzeitlich angelegten Unterordner verschoben.

Das liegt daran, dass du die Pfade gefundener Ordner immer weiter hinten anhängst.

Prüf das bitte mal. Ich denke, deine Aussage

Mein Konstrukt funktioniert einwandfrei!
stimmt nicht so ganz.

Falls ich Recht habe, musst du den Code umbauen. Ohne Rekursion oder eine Liste von noch zu bearbeitenden Unterordnern wird's nicht gehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für den Hinweis, ich habe das geprüft und er stellt wirklich die richtige struktur dar.

Ich bin gerade dabei an eine ArrayList zu bauen die alles gefunden abspeichert, samt pfad versteht sich. Danach habe ich vor diese Arraylist als "ToDo-List" meiner Downloadroutine zum abarbeiten zu geben...

Macht das so Sinn? Oder ist eine ArrayList doof dafür?

Falls ja, hättest du einen anderen Tipp für mich?

Swonwon

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für den Hinweis, ich habe das geprüft und er stellt wirklich die richtige struktur dar.
Stimmt, ich hatte das falsch interpretiert. Trocken-Debugging ist nicht immer ganz einfach.

Das Hauptproblem liegt wohl hier:

                while (!reader.EndOfStream)
{
sort = reader.ReadLine();
if (sort.StartsWith("d"))
{
words_dir = sort.Split(' ');
}
}[/code]

Wenn du nämlich mehrere Unterverzeichnisse findest, erwischst du dadurch nur das letzte. In dieser Schleife muss also mehr passieren.

Ich sehe aber ehrlich gesagt immer noch nicht, wie dein Programm tiefere Unterordner finden soll. Ich sehe nur einen einzigen Aufruf von GetDir, die bei diesem Aufruf gefundenen Ordner legst du zwar an und durchsuchst sie nach Dateien, aber anscheinend nicht nach weiteren Unterordnern.

Wie oft erscheint denn diese GetDir-MessageBox?

Ich bin gerade dabei an eine ArrayList zu bauen die alles gefunden abspeichert, samt pfad versteht sich. Danach habe ich vor diese Arraylist als "ToDo-List" meiner Downloadroutine zum abarbeiten zu geben...
Ja, das könnte funktioneren.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Verzeih, du hast recht -.- Ich seh langsam den Wald vor lauter Bäumen nicht... er erstellt in der Tat nur das letzte Unterverzeichnis und auch nur einmal... er dringt nicht tiefer ein... Sorry...

Hast du ein Tipp, was mehr in dieser Schleife passieren soll? Ich sitzte langsam auf dem Trockenem... Dasmit der ArrayList ist mein letzter Rettungsanker... Wär schön wenn du vielleicht noch eine Idee hast bzw Tipps o.ä.

Danke nochmal

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst das grundsätzlich rekursiv oder iterativ lösen.

Rekursiv würde bedeuten, dass du für jeden gefundenen Unterordner wieder GetDir aufrufst.

Iterativ würde so aussehen, dass du eine Liste aller gefundenen Ordner anlegst. Diese Liste arbeitest du dann der Reihe nach ab: Findest du Dateien, kopierst du sie. Findest du Ordner, hängst du den Pfad zum Ordner hinten an die Liste.

In beiden Fällen wäre es wohl einfacher, wenn du die Bearbeitung von Verzeichnissen und Dateien nicht trennen würdest. Letztendlich holst du ja zweimal dieselben Informationen vom Server. Einmal wirfst du die Informationen über die Dateien weg, einmal die über die Verzeichnisse. Wenn man das zusammenlegt, lässt sich das sicher effizienter umsetzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem das ich sehe, wenn ich GetDir immer aufrufe wenn ich einen Ordner finde, nimmt er dann, wenn er zurück geht nicht wieder den selben ordner?

Das mit der Liste wollte ich jetzt ja machen, ist leider wieder das selbe Problem ich versteh den Logischen schritt nicht den ich machen muss um eine ebene zurück zu gehen. Generell gebe ich dir recht, ich das zusammen zu schließen ist wesentlich sinnvoller effizienter...

Wenn ich mit meinem oben genannten gedankengang falsch liege wie müsste der code dann im groben aussehn, könntest du mir das zeigen? Entweder stehe ich gerade aufm schlauch oder es ist schon zu spät...

ich selectiere ja mit

if (sort.StartsWith("d"))
und
if (sort.StartsWith("-"))
nach datei und ordner... müsste nun dort
if (sort.StartsWith("d"))

ein GetDir aufruf ran?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das mit der Liste wollte ich jetzt ja machen, ist leider wieder das selbe Problem ich versteh den Logischen schritt nicht den ich machen muss um eine ebene zurück zu gehen.
Du musst nicht "zurück gehen". Du speicherst noch zu durchsuchende Pfade in der Liste. Und du arbeitest die Liste ab. Das ist alles.

Wenn du im aktuellen Verzeichnis Unterverzeichnisse findest, hängst du hinten an die Liste den Eintrag "aktuelles_verzeichnis/gefundenes_unterverzeichnis" an und suchst weiter. So lange, bis du die Liste abgearbeitet hast.

Link zu diesem Kommentar
Auf anderen Seiten teilen

So Leute ich gebe auf...

Mein Codeschnippsel an dem ich jetzt rumgewuscht hab, aber der nicht das tut was er soll:

while (!reader.EndOfStream)

                {

                    sort = reader.ReadLine();

                    if (sort.StartsWith("d"))

                    {

                        words_dir = sort.Split(' ');

                        al.alarr(FTPAddress + "/" + words_dir[words_dir.Length - 1]);


                        FTP2 = FTPAddress + "/" + words_dir[words_dir.Length - 1];


                        if (File.Exists(sFilename))

                        {

                            StreamReader myFile = new StreamReader(sFilename, System.Text.Encoding.Default);

                            while (!myFile.EndOfStream)

                            {

                                fRow++;

                                if (FTP2 == myFile.ReadLine())

                                {

                                    myFile.Close();


                                    reader.Close();

                                    responseStream.Close();

                                    response.Close();


                                    GetDir(FTPAddress, User, Pw, pfad);

                                }

                                else

                                {

                                    myFile.Close();


                                    reader.Close();

                                    responseStream.Close();

                                    response.Close();


                                    GetDir(FTP2, User, Pw, pfad);

                                }

                            }

                            myFile.Close();

                        }


                    }

                    else if (sort.StartsWith("-"))

                    {

                        words = sort.Split(' ');

                        al.alarr(FTPAddress + "/" + words[words.Length - 1]);

                    }

                }
Der restliche Code ist wie er war.
al.alarr(FTPAddress + "/" + words_dir[words_dir.Length - 1]);
Ist einfach ein Funktionsaufruf, welche den gefunden Pfad in eine Txt-Datei speichert.
                                                               if (FTP2 == myFile.ReadLine())

                                {

                                    myFile.Close();


                                    reader.Close();

                                    responseStream.Close();

                                    response.Close();


                                    GetDir(FTPAddress, User, Pw, pfad);

                                }

                                else

                                {

                                    myFile.Close();


                                    reader.Close();

                                    responseStream.Close();

                                    response.Close();


                                    GetDir(FTP2, User, Pw, pfad);

                                }

Soll im Groben nur in die Txt-Datei schaunu nd gucken ob es den Pfad schon gibt, falls ja, dann rufe die funktion erneut mit dem root vz auf (FTPaddress). Fals es ihn nicht gibt rufe die Funktion mit dem neuen VZ auf.

Was im endeffekt in der Txt-Datei steht, und somit auch geladen und erstelt wird:

Ich denke den Rest erspare ich euch.

Man beachte! : der Punkt ist kein Platzhalter, den bekomme ich wirklich...

Ich denke ma das ist aufm FTP, der "Zurück-Ordner" den man oben immer hat, aber ich weiss es nicht.

Kann mir bitte jemand helfen !? Ich weiss nicht mehr weiter... kein stück! Kann mir jemand Codehilfe geben? Vielleicht eine ähnliche Funktion um es mir zu veranschaulichen oder so?

Ich danke euch...

Gruß Swonson

Bearbeitet von swonson
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hatte das auch in betracht gezoegn, nur wie sage ich ihm das er das ignorieren soll und das danach nehmen soll?
Indem du den if-Block leer lässt, und das, was ansonsten getan werden soll, in den else-Block schreibst. Oder indem du einfach die Bedingung umdrehst:

if( words_dir[words_dir.Length - 1] != "." && words_dir[words_dir.Length - 1] != ".." )
{
// Hier der ganze Code zur Verzeichnis-Bearbeitung
}[/code]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ihr dachtet bestimmt ich hab aufgegeben ;)

so... ich hab es soweit, das folgendes ergebnis rauskommt.

xx.xx.xxx.xx:xx/_index.php

xx.xx.xxx.xx:xx/Alea

xx.xx.xxx.xx:xx/Alea/test

xx.xx.xxx.xx:xx/Alea/test/Seite1

xx.xx.xxx.xx:xx/Alea/test/Seite1/background.jpg

xx.xx.xxx.xx:xx/Alea/test/Seite1/foto.html

xx.xx.xxx.xx:xx/Alea/test/Seite1/gedichte.html

xx.xx.xxx.xx:xx/Alea/test/Seite1/grafik

xx.xx.xxx.xx:xx/Alea/test/Seite1/grafik/IMG_1197.jpg

xx.xx.xxx.xx:xx/Alea/test/Seite1/grafik/IMG_1217.jpg

xx.xx.xxx.xx:xx/Alea/test/Seite1/grafik/janin.jpg

xx.xx.xxx.xx:xx/Alea/test/Seite1/grafik/janin1.JPG

xx.xx.xxx.xx:xx/Alea/test/Seite1/grafik/janin2.jpg

xx.xx.xxx.xx:xx/Alea/test/Seite1/grafik/mama.JPG

xx.xx.xxx.xx:xx/Alea/test/Seite1/grafik/papa.jpg

xx.xx.xxx.xx:xx/Alea/test/Seite1/grafik/schatz.jpg

xx.xx.xxx.xx:xx/Alea/test/Seite1/grafik/schatz1.jpg

xx.xx.xxx.xx:xx/Alea/test/Seite1/index.html

xx.xx.xxx.xx:xx/Alea/test/Seite1/janin.html

xx.xx.xxx.xx:xx/Alea/test/Seite1/startseite.html

Das ist allerding nur immer der erste Ordner.

Also er geht in dern ersten Unterorder und schaut dort rein findet er wieder ein Unterordner geht er dort auch rein und soweiter bis es kein ordner mehr gibt, dann zeiht er alle datein.

Problem ist, ich henge in einer endlosschleife, das er zwar ein einen ordner zurück geht, aber wieder den ersten nimmt anstatt den nächsten ordner und joa.. naja endlosschleife halt...

Ich weiß natürlich was ich machen muss von der Logik her, aber von der syntax her nicht. kann mir bitte jemand helfen?

Mir reicht ein schnippsel ich will garkeine komplettlösung...

Code folgt:


                while (!reader.EndOfStream)

                {

                    StreamReader Liste_reader = new StreamReader(sFilename, System.Text.Encoding.Default);

                    sort = reader.ReadLine();

                    if (sort.StartsWith("d"))

                    {

                        words_dir = sort.Split(' ');

                        string FTP3 = FTPAddress + "/" + words_dir[words_dir.Length - 1];



                        while (!Liste_reader.EndOfStream && words_dir[words_dir.Length - 1] != "." && words_dir[words_dir.Length - 1] != "..")

                        {

                            if (FTP3 == Liste_reader.ReadLine())

                            {

                                treffer = true;

                                break;

                            }

                        }


                        if (!treffer)

                        {

                            if (words_dir[words_dir.Length - 1] != "." && words_dir[words_dir.Length - 1] != "..")

                            {

                                Liste_reader.Close();

                                // Hier der ganze Code zur Verzeichnis-Bearbeitung

                                al.alarr(FTPAddress + "/" + words_dir[words_dir.Length - 1]);

                                FTP2 = FTPAddress + "/" + words_dir[words_dir.Length - 1];

                                reader.Close();

                                responseStream.Close();

                                response.Close();

                                GetDir(FTP2, User, Pw, pfad);


                            }

                        }

                    }

                    else if (sort.StartsWith("-"))

                    {

                        words = sort.Split(' ');

                        treffer = false;


                        string FTP3 = FTPAddress + "/" + words[words.Length - 1];


                        while (!Liste_reader.EndOfStream)

                        {

                            if (FTP3 == Liste_reader.ReadLine())

                            {

                                treffer = true;

                                break;

                            }

                        }


                        if (!treffer)

                        {

                            Liste_reader.Close();

                            al.alarr(FTPAddress + "/" + words[words.Length - 1]);

                        }

                    }

                    Liste_reader.Close();


                }


                reader.Close();

                responseStream.Close();

                response.Close();


                if(FTP2!= "")

                {

                    //MessageBox.Show("If FTP2 wurde geladen!");

                    goback = FTP2.Split('/');

                    back = FTP2.Replace("/" + goback[goback.Length - 1], "");

                    GetDir(back, User, Pw, pfad);

                }

Die deklarierten variablen sind die selben wir in den vorherigen posts die die dazu gekommen deren funktion müsste ersichtlich sein.

Ich weiß das der code nicht schön ist, das werde ich versuche nach zubessern wenn es denn endlich funktioniert.

ich danke euch...

Grüße Swonson

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich weiß natürlich was ich machen muss von der Logik her, aber von der syntax her nicht.
Du hast kein Syntaxproblem, du hast ein Logikproblem. Wenn du ein Syntaxproblem hättest, würde sich der Compiler beschweren. Da dein Programm aber kompiliert und ausgeführt werden kann, kann nur ein Logikfehler vorliegen.

Ich glaube übrigens, dass dir die Logik nicht klar ist. Du hast da anscheinend immer noch Code drin, um im Verzeichnisbaum wieder "zurück" zu gehen. Das brauchst du nicht. Weder bei der Listenvariante noch bei der Rekursionsvariante.

Beschreib doch deinen Algorithmus mal auf Deutsch. Der Quellcode ist sehr unübersichtlich.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...