Benutzer mit den meisten Antworten
den QuellPfad an das Programm über eine Eingabe übergeben?

Frage
-
Hallo,
ich habe ein fertiges Programm wo aus einem "statischen" QuellPfad Dateien ausgelesen werden.
Jetzt möchte ich aber, dass den QuellPfad der Benutzer individuell an das Programm übergibt.
Einen Versuch habe ich gebastelt, jedoch funktioniert es nicht. Wo ist der Fehler?
Danke
string eingabe; Console.WriteLine("Bitte geben Sie den gewünschten Pfad ein"); eingabe = Console.ReadLine(); this.QuellPfad = @"eingabe"; this.ZielPfad = @"C:\TEMP\Ziel"; this.Erweiterungen = new string[] { ".jpg", ".png", ".tif" }; } /// <summary>Das Quell-Verzeichnis (mit den Bitmaps).</summary> public string QuellPfad { get; set; } /// <summary>Das Ziel-Verzeichnis (verarbeitete Bitmaps und Text-Ausgabe).</summary> public string ZielPfad { get; set; } /// <summary>Die Erweiterungen (Bitmap-Formate).</summary> public string[] Erweiterungen { get; set; }
Antworten
-
Servus Marius,
ich habe mir jetzt nicht den kompletten Code der Klasse angeschaut, da ich nicht soo viel Zeit derzeit habe. Daher kann ich dir die genaue Funktionsweise nicht erklären. Es scheint mir aber auch keine sonderlich komplexe Klasse zu sein, weswegen du das sicherlich auch selbst hinbekommen wirst.
Bei dem anderen Teil, kann ich dir jedoch auch ohne dieses Wissen helfen. Am besten wäre es sicherlich, wenn du den Konstruktor der Klasse Scannen ein wenig umschreibst, sodass du alle Parameter, die die Klasse benötigt, übergibst.
Ändere daher den Konstruktor von:
public Scannen() { /* this.QuellPfad = @"C:\TEMP"; this.ZielPfad = @"C:\TEMP2"; */ string eingabe; Console.WriteLine("Bitte geben Sie den gewünschten Pfad ein"); eingabe = Console.ReadLine(); this.QuellPfad = eingabe; this.ZielPfad = @"C:\TEMP\Ziel"; this.Erweiterungen = new string[] { ".jpg", ".png", ".tif" }; }
Auf:
public Scannen(String quellPfad, String zielPfad) { this.QuellPfad = quellPfad; this.ZielPfad = zielPfad; this.Erweiterungen = new String[] { ".jpg", ".png", ".tif" }; }
Wie du sehen kannst, werden den Eigenschaften ZielPfad und QuellPfad nun die Werte zugewiesen, die du der Klasse bei der Initialisierung mit auf den Weg gibst. Die Zuweisung der Eigenschaft Erweiterungen habe an dieser Stelle einfach mal im Konstruktor gelassen, wie sie vorher war. Du kannst diese Eigenschaft natürlich auch so behandeln, wie die anderen beiden, wenn du magst.Wie du ebenfalls sehen kannst, habe ich die Console.ReadLine() Anweisung aus dem Konstruktor entfernt. Diese wird aber gleich wieder in der Main-Methode auftauchen. Und so könnte diese aussehen:
static void Main(string[] args) { String pfad; if(args != null && args.Length == 1) { // Wir holen uns den Zielpfad aus dem 1. übergebenen Argument: pfad = args[0]; } else { // Wir holen uns den Zielpfad vom User, da kein Argument übergeben wurde: Console.WriteLine("Bitte geben Sie den gewünschten Pfad ein"); pfad = Console.ReadLine(); } // Nun nur noch fix ein Objekt der Scannen Klasse anlegen und wie gewohnt damit arbeiten: var scannen = new Scannen(pfad, @"C:\Temp\Ziel"); scannen.Verarbeiten(); }
Nun kannst du das Programm entweder mit einem zusätzlichen Parameter starten, wie zum Beispiel:Programm.exe C:\EingabeVerzeichnis
Oder aber du startest es ohne, dann wird der Benutzer allerdings nach dem Pfad gefragt. Ebenso verhält es sich, wenn du dem Programm mehrere Argumente übergibst, da dann
if(args != null && args.Length == 1)
nicht gilt und in den Else-Block gesprungen wird.Fröhliches Lernen,
CKPS: Ich habe den Quellcode hier ohne VS oder so geschrieben. Ich hoffe, dass sich keine Typos eingeschlichen haben :/
EDIT:
Und hier mal noch die Erkärung zu der Main-Methode - wie immer hübsch auf der MSDN Library zu finden: Main-Methode und Argumente
Außerdem könntest du - vielleicht als Übung, oder einfach nur der Sinnhaftigkeit halber - den Code erweitern, sodass du auch noch den Zielpfad per Argument übergeben kannst. Außerdem solltest du überprüfen, ob die Pfade, die der Benutzer per Argument übergibt bzw. in das Konsolenfenster hinein schreibt, wirklich exisitieren. Sie dazu die System.IO.Directory-Klasse. Ansonsten könntest du (mit selbiger Klasse) die Ordner erstellen, oder aber mit einer Schleife den Benutzer so lange nerven, bis er denn mal endlich einen richtigen Pfad eingibt.
- Bearbeitet Christopher Kellner Donnerstag, 18. August 2011 22:03 Links und Erweiterungen
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 25. August 2011 13:47
- Als Antwort markiert Therox_X Donnerstag, 25. August 2011 15:25
Alle Antworten
-
Hi,
mit
this.QuellPfad = @"eingabe";
setzt Du die Eigenschaft "QuellPfad" auf den Wert "eingabe". Schreibs mal so:
this.QuellPfad = eingabe;
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Danke für Eure Hilfe.
Ich habe schon Vorher diese Möglichkeiten ausprobiert. Jedoch ohne Erfolg. Er läuft in einem Fehler rein. Er meint, dass das Verzeichniss nicht vorhanden ist?
Hier mein kompletter Code :
using System; using System.Collections; using System.Drawing; using System.IO; using System.Linq; using System.Text; namespace BarcodeScannen { /// <summary> /// Einfache Klasse zum Erkennen von Barcodes auf Basis von http://www.codeproject.com/KB/graphics/BarcodeImaging3.aspx /// </summary> class Scannen { public Scannen() { /* this.QuellPfad = @"C:\TEMP"; this.ZielPfad = @"C:\TEMP2"; */ string eingabe; Console.WriteLine("Bitte geben Sie den gewünschten Pfad ein"); eingabe = Console.ReadLine(); this.QuellPfad = eingabe; this.ZielPfad = @"C:\TEMP\Ziel"; this.Erweiterungen = new string[] { ".jpg", ".png", ".tif" }; } /// <summary>Das Quell-Verzeichnis (mit den Bitmaps).</summary> public string QuellPfad { get; set; } /// <summary>Das Ziel-Verzeichnis (verarbeitete Bitmaps und Text-Ausgabe).</summary> public string ZielPfad { get; set; } /// <summary>Die Erweiterungen (Bitmap-Formate).</summary> public string[] Erweiterungen { get; set; } /// <summary>Erweiterung für die Ausgabe.</summary> public string AusgabeErweiterung { get { return ".txt"; } } /// <summary>Anzahl der Scan-Vorgänge (Optimum?).</summary> public int AnzahlScans { get { return 100; } } /// <summary>Zu scannende Barcode-Typen (Alle?).</summary> public BarcodeImaging.BarcodeType BarcodeType { get { return BarcodeImaging.BarcodeType.All; } } public void Verarbeiten() { // Argumente prüfen if (!ArgumentePrüfen()) return; var quellDateien = from datei in Directory.EnumerateFiles(this.QuellPfad, "*.*", SearchOption.TopDirectoryOnly) from erweiterung in this.Erweiterungen let endung = Path.GetExtension(datei) where endung.Equals(erweiterung, StringComparison.OrdinalIgnoreCase) select datei; foreach (var quellDatei in quellDateien) { try { // Wenn zu verarbeiten, wird die Datei verschoben string zielDatei = Path.Combine(this.ZielPfad, Path.GetFileName(quellDatei)); if (DateiScannen(quellDatei)) { if (quellDatei != zielDatei) File.Move(quellDatei, zielDatei); } } catch (Exception exception) { Console.Error.WriteLine("Fehler bei der Verabeitung von '{0}':\r\n{1}", quellDatei, exception.Message); } } } /// <summary>Verarbeitet eine Datei (Bitmap)</summary> private bool DateiScannen(string dateiName) { // Datei als Bitmap laden using (Bitmap bitmap = (Bitmap)Bitmap.FromFile(dateiName)) { Console.Write("Scanne: '{0}' ... ", dateiName); var barcodes = new ArrayList(); BarcodeImaging.FullScanPage(ref barcodes, bitmap, this.AnzahlScans); // Barcodes erkannt? if (barcodes.Count > 0) { // Schreiben der Barcodes string ausgabeDatei = Path.Combine(this.ZielPfad, Path.GetFileNameWithoutExtension(dateiName) + this.AusgabeErweiterung); File.WriteAllLines(ausgabeDatei, barcodes.Cast<string>(), Encoding.Default); Console.WriteLine("'{0}' Barcodes erkannt.", barcodes.Count); return true; } else { Console.WriteLine("keine Barcodes erkannt.", barcodes.Count); } } return false; } /// <summary>Eine (sehr einfache) Prüfung der Argumente.</summary> /// <returns><c>true</c>, wenn die Argumente vollständig sind, sonst <c>false</c>.</returns> private bool ArgumentePrüfen() { bool ok = true; if (!Directory.Exists(this.QuellPfad)) { Console.Error.WriteLine("Das Quellverzeichnis '{0}' ist nicht vorhanden.", this.QuellPfad); ok = false; } if (!Directory.Exists(this.ZielPfad)) { Console.Error.WriteLine("Das Zielverzeichnis '{0}' ist nicht vorhanden.", this.ZielPfad); ok = false; } if (this.Erweiterungen == null || this.Erweiterungen.Length == 0) { Console.Error.WriteLine("Es sind keine Dateierweiterungen angegeben."); ok = false; } else { foreach (var erweiterung in this.Erweiterungen) { if (erweiterung == null || erweiterung.Length == 0 || !erweiterung.StartsWith(".")) { Console.Error.WriteLine("Die Dateierweiterung '{0}' ist ungültig.", erweiterung ?? "NULL"); ok = false; } } } return ok; } } }
-
An welcher Stelle wirft er die Exception ? Existieren beide Pfade wirklich ? C:\TEMP und C:\TEMP2. Sind diese evtl. schreibgeschützt ?
Bei deiner Abfrage
if (!Directory.Exists(this.ZielPfad)) { Console.Error.WriteLine("Das Zielverzeichnis '{0}' ist nicht vorhanden.", this.ZielPfad); ok = false; }
würde ich als Elese Zweig eifnach ein Directory erstellen.
Wir brauchen also mehr Infos um dir zu helfen ;-)
-
Ich habe schon Vorher diese Möglichkeiten ausprobiert. Jedoch ohne Erfolg. Er läuft in einem Fehler rein. Er meint, dass das Verzeichniss nicht vorhanden ist?
Dann wird das wohl auch so sein. Was gibt der User denn überhaupt ein? Das sollte schon ein vollständiger Pfad, also bspw. X:\Ordner\Abc\ sein
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Fehler gefunden: War mein Fehler. Zielpfad war c:\temp\ziel und ich dusel erstelle c:\temp\zielpfad.
Eine Frage hätte ich noch:
Wie kann ich das ganze noch automatisieren, dass bei der Ausführung der exe das Quellverzeichnis durch Parameter übergeben werden?
Wie muss ich den Code anpassen und was eben hinter der exe schreiben?
Danke
- Bearbeitet Robert BreitenhoferModerator Donnerstag, 25. August 2011 13:46 Formatierung
-
Hi,
du musst dei params[] der Main methode parsen bwz. auslesen.
In deiner Program.cs findest du
[STAThread] static void Main(string[] param) {
du kannst dann mit param[0] den ersten übergebenen Wert auslesen.
ACHTUNG : Immer prüfen wie groß das param Array ist, nicht dass das Programm gar nicht erst startet ;-)
Grüße
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 25. August 2011 13:48
-
Hallo Pawel,
danke für die Antwort.
Ich bin jedoch Anfänger und bin (noch) etwas überfordert.
Könntest Du mir den Code erläutern in der Program.cs sowie in der Klasse Scanen.cs. Den kompletten Code der Klasse Scannen.cs habe ich ja schon gepostet.
Im Program.cs steht nur ein Befehl wo eben die Klasse aufgerufen wird. Aber das weißt (siehst) Du ja...
class Program { static void Main(string[] args) { var scannen = new Scannen(); scannen.Verarbeiten(); } }
Danke
Grüße
Marius
-
Servus Marius,
ich habe mir jetzt nicht den kompletten Code der Klasse angeschaut, da ich nicht soo viel Zeit derzeit habe. Daher kann ich dir die genaue Funktionsweise nicht erklären. Es scheint mir aber auch keine sonderlich komplexe Klasse zu sein, weswegen du das sicherlich auch selbst hinbekommen wirst.
Bei dem anderen Teil, kann ich dir jedoch auch ohne dieses Wissen helfen. Am besten wäre es sicherlich, wenn du den Konstruktor der Klasse Scannen ein wenig umschreibst, sodass du alle Parameter, die die Klasse benötigt, übergibst.
Ändere daher den Konstruktor von:
public Scannen() { /* this.QuellPfad = @"C:\TEMP"; this.ZielPfad = @"C:\TEMP2"; */ string eingabe; Console.WriteLine("Bitte geben Sie den gewünschten Pfad ein"); eingabe = Console.ReadLine(); this.QuellPfad = eingabe; this.ZielPfad = @"C:\TEMP\Ziel"; this.Erweiterungen = new string[] { ".jpg", ".png", ".tif" }; }
Auf:
public Scannen(String quellPfad, String zielPfad) { this.QuellPfad = quellPfad; this.ZielPfad = zielPfad; this.Erweiterungen = new String[] { ".jpg", ".png", ".tif" }; }
Wie du sehen kannst, werden den Eigenschaften ZielPfad und QuellPfad nun die Werte zugewiesen, die du der Klasse bei der Initialisierung mit auf den Weg gibst. Die Zuweisung der Eigenschaft Erweiterungen habe an dieser Stelle einfach mal im Konstruktor gelassen, wie sie vorher war. Du kannst diese Eigenschaft natürlich auch so behandeln, wie die anderen beiden, wenn du magst.Wie du ebenfalls sehen kannst, habe ich die Console.ReadLine() Anweisung aus dem Konstruktor entfernt. Diese wird aber gleich wieder in der Main-Methode auftauchen. Und so könnte diese aussehen:
static void Main(string[] args) { String pfad; if(args != null && args.Length == 1) { // Wir holen uns den Zielpfad aus dem 1. übergebenen Argument: pfad = args[0]; } else { // Wir holen uns den Zielpfad vom User, da kein Argument übergeben wurde: Console.WriteLine("Bitte geben Sie den gewünschten Pfad ein"); pfad = Console.ReadLine(); } // Nun nur noch fix ein Objekt der Scannen Klasse anlegen und wie gewohnt damit arbeiten: var scannen = new Scannen(pfad, @"C:\Temp\Ziel"); scannen.Verarbeiten(); }
Nun kannst du das Programm entweder mit einem zusätzlichen Parameter starten, wie zum Beispiel:Programm.exe C:\EingabeVerzeichnis
Oder aber du startest es ohne, dann wird der Benutzer allerdings nach dem Pfad gefragt. Ebenso verhält es sich, wenn du dem Programm mehrere Argumente übergibst, da dann
if(args != null && args.Length == 1)
nicht gilt und in den Else-Block gesprungen wird.Fröhliches Lernen,
CKPS: Ich habe den Quellcode hier ohne VS oder so geschrieben. Ich hoffe, dass sich keine Typos eingeschlichen haben :/
EDIT:
Und hier mal noch die Erkärung zu der Main-Methode - wie immer hübsch auf der MSDN Library zu finden: Main-Methode und Argumente
Außerdem könntest du - vielleicht als Übung, oder einfach nur der Sinnhaftigkeit halber - den Code erweitern, sodass du auch noch den Zielpfad per Argument übergeben kannst. Außerdem solltest du überprüfen, ob die Pfade, die der Benutzer per Argument übergibt bzw. in das Konsolenfenster hinein schreibt, wirklich exisitieren. Sie dazu die System.IO.Directory-Klasse. Ansonsten könntest du (mit selbiger Klasse) die Ordner erstellen, oder aber mit einer Schleife den Benutzer so lange nerven, bis er denn mal endlich einen richtigen Pfad eingibt.
- Bearbeitet Christopher Kellner Donnerstag, 18. August 2011 22:03 Links und Erweiterungen
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 25. August 2011 13:47
- Als Antwort markiert Therox_X Donnerstag, 25. August 2011 15:25
-
Hallo Christopher,
Vielen Danke für Deine Hilfe und für Deine Tipps.
Das Programm funktioniert, und ich kann es jetzt studieren.
Hoffe, dass ich bald mir selbst so helfen kann.
Ich hätte aber noch ein paar Fragen:
Was muss ich umschreiben um die Barcodes nur in eine Textdatei auszugeben. Die .txt-Datei soll so aussen:
Dateiname_Barcode
Dateiname_Barcode
.
.
.
Dann sollen die kopierten Bilddateien umbenannt werden im Zielverzeichniss. Am besten mit Datum und eine fortlaufende Nummer.
Und manche Seiten haben keine Barcodes, dies sollte man auch in der Textdatei sehen. Also Seite 1 hat Barcodes und Seite 2-6 keine und Seite 7 hat wieder einen.
Also sollte dann so aussehen
Dateiname_Barcode
Dateiname
Dateiname
.
.
Dateiname_Barcode
Und zum Schluß sollte eine LOG-Datei erstellt werden. Eben wieviele Seiten angefasst wurden und wann und wie lange.
Danke danke danke
Grüße
Marius