C# Bilddateien auswählen und in bestimmtes Zeilverzeichniss kopieren

freak1051

Cadet 4th Year
Dabei seit
Dez. 2012
Beiträge
123
Hallo Community,

zu aller erst ein kleines bild, zum Besseren Verständniss:



Ziel des Tools ist folgendes:

der Benutzer kann in die TextBox einen Pfad eingeben, oder mit druck auf den Button hinter der TextBox einen den Windows bekannten Öffne-Dialog öffnen. Bei Auswahl eines Bildes, soll Windowstyptisch, der Pfad in der zugehörigen TextBox erscheinen.

Es soll die Möglichkeit geben, auch 2 (oder mehrere) Bilder auszuwählen. Der Speichername soll Bild 1 oder Bild 2 oder Bild n sein.

Bei klick auf den großen Button soll das Tool die Bilder automatisiert in einen im Code hinterlegtem Pfad speichern, wie gesagt mit dem Namen Bild1...


Habe nun schon etwas im Netz geschaut. Habe mit dem OpfenFileDialog herum gespielt. auch mit dem SavefileDialog.
Bin (nebenbei) absoluter c# Anfänger ( WINK MIT ZAUNPFAHL: bitte keine Stichwörter posten, in der Hoffnung, man ist C# allwissender :) )
Habe im netz auch befehle gesehen, welche ich aber nicht hundertprozentig verstanden habe, wie diese Befehle Dateien kopieren. bzw wie ich den Befehl dazu bekomme, den Pfad aus der TB zu nehmen.

kann mir Jemand evtl. ein Heißen tip geben, vllt mit etwas "tutorial" damit ich diese Aufgabenstellung gelöst bekomme?
 

Madman1209

Fleet Admiral
Dabei seit
Nov. 2010
Beiträge
25.325
Hi,

was genau daran ist unverständlich? Es gibt die File Copy-Methode, der übergibst du zwei Strings. Einmal Quelle, einmal Ziel. Quelle wäre der Text in deiner Textbox, Ziel ist der hinterlegte Pfad mit "Bild1" oder "Bild2", den baust du natürlich zusammen.

VG,
Mad
 

JakeD

Cadet 3rd Year
Dabei seit
Okt. 2009
Beiträge
55
Hallo,

ich denke, hier wird dir jetzt keiner die vollständige Lösung für dein Problem präsentieren.
Als kleine Hilfe hier mal ein Snippet für den OpenFileDialog:

Code:
OpenFileDialog ofdAnhang = new OpenFileDialog();
                ofdAnhang.Title = "Datei auswählen";
                ofdAnhang.Filter = "Alle Dateien (*.*)|*.*";
                ofdAnhang.InitialDirectory = @"C:\";
                if (ofdAnhang.ShowDialog() == DialogResult.OK)
                {
                    textBox.Text = ofdAnhang.FileName.ToString();
                    fileName = ofdAnhang.SafeFileName;
                }
Damit hast du zumindest schon einen Pfad zur Datei.
Code:
 File.Copy(Quelle, Ziel);
Damit kannst Dateien kopieren.
 

freak1051

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Dez. 2012
Beiträge
123
Hi,

was genau daran ist unverständlich? Es gibt die File Copy-Methode, der übergibst du zwei Strings. Einmal Quelle, einmal Ziel. Quelle wäre der Text in deiner Textbox, Ziel ist der hinterlegte Pfad mit "Bild1" oder "Bild2", den baust du natürlich zusammen.

VG,
Mad
kann ich dann damit auch den Namen des bildes ändern. Angenommen das bild heist in der Quelldatei ABC.jpg und soll Bild1.jpg im ziel sei?



Hallo,

ich denke, hier wird dir jetzt keiner die vollständige Lösung für dein Problem präsentieren.
Als kleine Hilfe hier mal ein Snippet für den OpenFileDialog:

Code:
OpenFileDialog ofdAnhang = new OpenFileDialog();
                ofdAnhang.Title = "Datei auswählen";
                ofdAnhang.Filter = "Alle Dateien (*.*)|*.*";
                ofdAnhang.InitialDirectory = @"C:\";
                if (ofdAnhang.ShowDialog() == DialogResult.OK)
                {
                    textBox.Text = ofdAnhang.FileName.ToString();
                    fileName = ofdAnhang.SafeFileName;
                }
Damit hast du zumindest schon einen Pfad zur Datei.
Code:
 File.Copy(Quelle, Ziel);
Damit kannst Dateien kopieren.
Kann ich dann auch andersherum den pfad in die TB kopieren( falls ich ihn zur handhätte) und er würde ihn o die OFD integrieren?
Ergänzung ()

wenn ich das ganze mal grob zusammen trage:

via openFileDialog kann ich das Bild über den Win-Üblichen File Dialog suchen. Somit habe ich den Quellpfad inkl. "alten" Namen des bildes.

diesen Pfad kann ich mir auch in meiner TB anzeigen lassen.

Andersherum: Pfad in TB, würde demnach auch gehen. Wenn ich dann mittels der FileCopy Methode den FPad aus der TB nehme und meinen Zielpfad angebe...

Nun fehlt doch eigentlich nur noch die namensänderung oder? oder kann ich des über den Zielpfad in FileCopy auch mit angeben:

Code:
Copy("C:\...\abc.jpg","D:\...\bild1.jpg")
 

JakeD

Cadet 3rd Year
Dabei seit
Okt. 2009
Beiträge
55
Kann ich dann auch andersherum den pfad in die TB kopieren( falls ich ihn zur handhätte) und er würde ihn o die OFD integrieren?
Viele Wege führen nach Rom... Wenn du bei File.Copy(textBox.Text, ....) dann holt er sich den Pfad aus der Textbox. Du kannst bei dem Zielpfad auch direkt ein Namen mit angeben z.B.


PHP:
string Ziel= "Pfad" + "Dateiname";
File.Copy(textBox.Text, Ziel);
oder auch

PHP:
File.Copy(textBox.Text, @"dein pfad" + "dein Dateiname");
 
Zuletzt bearbeitet:

freak1051

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Dez. 2012
Beiträge
123
Viele Wege führen nach Rom... Wenn du bei File.Copy(textBox.Text, ....) dann holt er sich den Pfad aus der Textbox. Du kannst bei dem Zielpfad auch direkt ein Namen mit angeben z.B.


PHP:
string Ziel= "Pfad" + "Dateiname";
File.Copy(textBox.Text, Ziel);
oder auch

PHP:
File.Copy(textBox.Text, @"dein pfad" + "dein Dateiname");
Funktioniert dann aber auf beide arten. also wenn ich über den OFD den Pfad hole, trägt er mir direkt den Pfad in meine TextBox ein: textBox.Text = ofdAnhang.FileName.ToString();

oder alternativ direkt den Pfad in die TB eingeben.

und als variable in den Copy befehlpack ich dann TextBox.text...?

kann mir evtl jemand noch etwas genauer Folgenden abschnitt erklären?

Code:
OpenFileDialog ofdAnhang = new OpenFileDialog(); // muss ich hier immer wieder andere namen vergeben, wenn ich dieses öfter aufrufe ( da ich ja mehrere Buttons habe). Und diesen aufrf muss ich bei Button.click aufrufen oder?
3.                ofdAnhang.Title = "Datei auswählen";  
4.                ofdAnhang.Filter = "Alle Dateien (*.*)|*.*";
5.                ofdAnhang.InitialDirectory = @"C:\";    
6.                if (ofdAnhang.ShowDialog() == DialogResult.OK) // hier wird erst übernommen wenn man in der Auswahl ok gedrückt hat?!?!
7.                {
8.                    textBox.Text = ofdAnhang.FileName.ToString(); // Wie müsste ich es hier angeben, damit das Bild automatisch Bild 1 im Zielverzeichniss heißt? ofdAnhang.Bild20? Was bedeutet das ToString()???
9.                    fileName = ofdAnhang.SafeFileName;
10.                }
Sorry für die mieserable Formatierung :( hoffe man kann es halbwegs lesen.. meine Fragen stehen alle im Code als Kommentar...
 
Zuletzt bearbeitet:

raptor trx

Lt. Junior Grade
Dabei seit
Mai 2006
Beiträge
289
Here you go...

Code:
using System;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (var ofd = new OpenFileDialog())
            {
                // den zuletzt gewählten Pfad öffnen
                ofd.RestoreDirectory = true;
                ofd.Filter = "Bilddateien(*.BMP;*.JPG;*.TIFF;*.PNG;*.GIF)|*.BMP;*.JPG;*.TIFF;*.PNG;*.GIF|Alle Dateien (*.*)|*.*";
                ofd.Multiselect = true;

                var dialogResult = ofd.ShowDialog();

                switch (dialogResult)
                {
                    case DialogResult.OK:
                        CopyImages(ofd.FileNames);
                        break;
                    case DialogResult.Cancel:
                        break;
                }
            }
        }

        private void CopyImages(string[] images)
        {
            try
            {
                for (int i = 0; i < images.Length; i++)
                {
                    string oldImagePath = images[i];
                    string newImageFileName = Path.GetFileName(oldImagePath.Replace(Path.GetFileNameWithoutExtension(oldImagePath), $"Bild{i + 1}"));

                    File.Copy(oldImagePath, Path.Combine(@"C:\Work\Temp", newImageFileName));
                }

                MessageBox.Show(images.Length + " Bilddateien wurden kopiert");
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }
    }
}
 
Zuletzt bearbeitet:

freak1051

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Dez. 2012
Beiträge
123
hier kann ich ja dann die Bilder Automatisiert nach Bild 1-n kopieren lassen. hab auch zumindest s meiste von dem Code verstanden .

Allerdings habe ich ne etwas andere Anwendung. vllt hab ich mich unverständlich ausgedrückt.. schwer sowas zu erklären :)

Generator screen.png

so sieht meine GUI aus.

Das ganze soll ihm rahmen von ner kleinen Studienarbeit ein Generator werden, bei dem eine Init File und diese bilder automatisiert in einem Oderner erstellt werden.

Der Nutzer muss das Tool mit Daten Füttern, und die Init file wird geschrieben. Diese File wird dann von einem Rapsberry Pi später gelesen. Dieser Programmteil kommt später. Auf dem Pi läuft ein Programm, welches mit einer SPS kommuniziert. Nun können Bilder über Steuerbefehle von der SPS am Pi Angezeigt werden. eine art "Billig"HMI.

Die Automatische Ordner-Erstellung anhand einer Maschinennummer habe ich schon geschrieben und getestet.

Nun ist es das Ziel, dass der Nutzer folgende 2 Möglichkeiten hat:

1. er klickt auf den Button hinter einer TextBox, ein Bild-Auswählen Dialog wird geöffnet und der Nutzer kann wie gewohnt das Bild suchen. Bei klick auf okay/öffnen/was auch immer erscheint der Pfad des Bildes in der TextBox.
2. Der Nutzer kennt zufällig den Pfad, oder hat ihn in der Zwischenablage und kann ihn in die TextBox kopieren.

Dass der Pfad in der TextBox erscheint ist wichtig, da es sein kann dass er das Bild bei Teileabfragebild 20 auch bei 21 nutzt... demzufolge ist es natürlich komfortabler den Pfad zu kopieren und bei Teileabfragebild 21 einzufügen..

Die Bilder die der Nutzer hier auswählt, sollen nachher lediglich 20, 21 ...heißen. Es kann aber auch sein, dass aufgrund des Projektierten Programms er Bild 20 und 22 auswählen muss. oder Bild 22 und 27. Es darf also nichts mit zählen zu tun haben.

So wie die Zeile heißt, in der der Nutzer ein Pfad angelegt hat( über ofd oder eingefügten Pfad) soll das Bild nachher hießen.
Wird ein Pfad nicht genutzt passiert nichts.


Nun habe ich folgenden Code erstellt (erste Zeile):

Code:
        private void btOpenTaf20_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofdBildTaf20 = new OpenFileDialog();

            if (ofdBildTaf20.ShowDialog()==DialogResult.OK)
            {
                tbTaf20.Text = ofdBildTaf20.FileName.ToString();
               
            }
wenn ich das Prog ausführe, und auf die 3 punkte klicke, öffnet sich auch der Dialog, ich habe einen Warte-Donut der Dialog schließt sich und ich bekomme folgende Meldung im Debug-Fenster:

"LSB_init_gen.vshost.exe" (CLR v4.0.30319: LSB_init_gen.vshost.exe): "C:\(...)\LSB_init_gen.exe" geladen. Symbole wurden geladen.
Das Programm "[29200] LSB_init_gen.vshost.exe" wurde mit Code 1073741855 (0x4000001f) beendet.

komischerweise funktioniert es ab und an.... an was kann dies liegen?
 
Top