Laden...

Forenbeiträge von lehmaennche Ingesamt 4 Beiträge

10.07.2007 - 14:39 Uhr

Also. Grundsätzlich geht es um folgendes. Wir haben ein Programm um Festplatten zertifiziert nach BSI Vorgaben zu löschen.
Das Programm generiert bei jeder Löschung einen Report. Dieses Textfile will ich auswerten. Im ersten Teil geht es darum, dass für den Dateinamen eine zufällige HEX-Zahl verwendet wird, der wenig Aussagekraft besitzt.
In der Datei steht, vom Benutzer eingegeben das AssetTag, die Seriennummer und die Shipment-No. Im ersten Teil des Programms sollen zunächst diese Informationen ausgelesen werden und anschließend die Datei umbenannt werden. Sie soll die Bezeichnung des Asset-Tags bekommen.
Hier ist der Code dazu:


using System;
using System.Collections.Generic;
using System.Text;
// Namespace System.IO für Dateioperationen einbinden
using System.IO;
//Prozessverwaltung
using System.Threading;
//Namespace für Reguläre Ausdrücke
using System.Text.RegularExpressions;


namespace Process_IBAS_Reports
{
    class MyIbasReportProcessing
    {
       
        static void Main(string[] args)
        {   
            bool bolNoDir = true;
            string strPath = "";
            while (bolNoDir)
            {   // Benutzereingabe des Arbeitsverzeichnisses 
                Console.Write("Geben Sie den Suchpfad ein:");
                strPath = Console.ReadLine();
                // Verzeichnis auf Existenz prüfen.
                if (!Directory.Exists(strPath))
                {
                    Console.WriteLine("Das Verzeichnis {0} existiert nicht!", strPath);
                    Console.ReadLine();
                }
                else
                {   //Schleife verlassen
                    Directory.SetCurrentDirectory(strPath);
                    bolNoDir = false;
                }
            }
            //Dateien aus dem Verzeichnis einlesen, bei denen das Suffix .RPT ist.
            string strFileExtPattern = "*.RPT";
            string[] arrListFiles = (Directory.GetFiles(strPath, strFileExtPattern));
            for (int i = 0; i <= arrListFiles.GetUpperBound(0); i++)
            {
                //Datei öffnen
                StreamReader srReportFile = File.OpenText(arrListFiles[i]);
                string strLineInput = srReportFile.ReadLine();

                // Datei Zeilenweise lesen 
                int intLine = 0;
                while (strLineInput != null)
                {
                    strLineInput = srReportFile.ReadLine();
                    intLine++;
                    //Zeile 16 enthält Asset-Tag, Serial u. Shipment-No.
                    if (intLine == 15)
                    {

                        //Informationen in Zeile auftrennen
                        char[] chrSeparator = new char[] { ';', ':' };
                        char[] chrSpace = new char[] { ' ' };
                        string[] strResult = strLineInput.Split(chrSeparator, StringSplitOptions.RemoveEmptyEntries);
                        string strAssetTag = strResult[1];

                        //Teilstrings auf gültiges Format überprüfen. AssetTag besteht aus 12 numerischen Zeichen inkl. 3 führenden 0-en
                        Regex regAssetTagLayout = new Regex("[0]{3}[0-9]{9}");
                        bool bolValidLayout = regAssetTagLayout.IsMatch(strAssetTag);

                        string strFileExt = ".RPT";
                        if ((bolValidLayout == true)&&(!File.Exists(strAssetTag + strFileExt)))
                        {
                            Console.WriteLine("Copy {0} to {1}",arrListFiles[i],strAssetTag + strFileExt);
                            File.Copy(arrListFiles[i], strAssetTag + strFileExt);
                            /*foreach (string j in strResult)
                            {   //Vorläufige formatierte Ausgabe 
                                Console.WriteLine("{0}\t", j.Trim(chrSpace));
                            }*/


                            strLineInput = null;
                        }

                    }
                }
                srReportFile.Close();
                }
                Console.ReadLine();
            }
        }

}

Ich hoffe der Code ist einigermaßen lesbar.

Das erste Problem habe ich übrigens schon. Eigentlich sollten die Dateien nicht kopiert werden, sondern gemoved. Wenn ich die Methode File.Move() verwende bekomme ich eine IO Exception, mit der Mitteilung, das die Datei bereits von einem anderen Prozess verwendet wird. Das liegt wohl daran, dass das File zum gegebenen Zeitpunkt noch von mir selbst geöffnet ist. Also werde ich schon mal anfangen den Code ein wenig umzubauen.... 😉

Das eigentliche Ziel ist, sämtliche Informationen aus den Reportfiles in eine Datenbank zu schreiben und die verarbeiteten Dateien in einem Zipfile zu archivieren, welches den Namen der Shipment-No. enthält. Auch ist das Programm derzeit eine simple Konsolenanwendung und soll später noch ein grafisches Gesicht bekommen. Die Daten aus der Datenbank sollen mittels einer XML-Schnittstelle nach bestimmten Suchkriterien wieder extrahiert werden können. Um z.B. Listen für Kunden zu erstellen, usw. Ich könnte mir auch vorstellen, die Daten für unser WAWiSystem zur Verfügung zu stellen.

Nochmals Danke an alle, die sich genötigt fühlen diesen Beitrag zu lesen und Ihre Meinung zu äußern. 😉

gruß
cl

10.07.2007 - 13:12 Uhr

Hallo Leute,

ich bin in der Welt von C# noch relativ grün hinter den Ohren. Ich habe ein bißchen in den Openbooks gestöbert und habe mit dem Schreiben meines ersten Programm-Codes begonnen. Es ist noch nicht ganz fertig, aber ein Teil der Funtionalität ist schon implementiert. Ich würde ganz gerne die Meinung von einigen Leuten hören die mehr Erfahrung auf dem Gebiet haben. Das Thema OOP ist je schon mit einigen Fallstricken verbunden und ich möchte nur sicher gehen, dass ich auf dem richtigen Weg bin. Ich würde den Code mal posten, wenn nichts dagegen spricht.

Vielen Dank schon mal an alle.
Gruß
cl

28.06.2007 - 16:26 Uhr

Jo, das klingt logisch. So hab´ ich das noch garnicht gesehen.
Vielen Dank, dass du meinen grauen Zellen auf die Sprünge geholfen hast. 😁

gruß
cl

28.06.2007 - 14:49 Uhr

Hallo Leute,

ich bin neu hier und auch in Sachen C# Programmierung noch ziemlich grün hinter den Ohren. Ich arbeite mich gerade mit Hilfe eines Buches vom o.a. Author (Visual c# 2005, galileo openbook) in die Sprache C# ein.
Jetzt bin ich b ei Kap.5 über etwas gestolpert, was ich nicht verstehe. Vielleicht finde ich hier eine Antwort.

In Kap. 5.1.1 "Realisierung eines Objektzählers" spricht der Author davon eine Klassenvariable anstatt einer Instanzvariablen als Zähler zu verwenden. Das leuchtet soweit ein, damit nicht für jedes Objekt unnötig Speicher alloliert wird, usw.. bla bla...


public class Circle {
  // ---------- statische Felder --------------

 private static int countCircles; // hier
  
// ---------- Klasseneigenschaften ----------
  public static int CountCircles {
    get {return countCircles;}
  }
  ...
}

Ok. Soweit, so gut. Weiter unten geht es darum den Zähler zuverlässig wieder zu reduzieren. Hierfür werden diverse Methoden und Schnittstellen verwendet. Verstehe ich auch.
Jetzt kommt´s...
Warum wird die Bool´sche Variable CounterReduced nicht auch als Klassenvariable definiert? Als Klassenvariable müsste sie doch das Schlüsselwort static angegeben haben.


class Circle : IDisposable {
  // boolesche Variable, die Destruktor und Dispose steuert
  private bool counterReduced = false; // hier
  ...
  // Destruktor
  ~Circle() {
    if( ! counterReduced)
      countCircles--;
  }
  // Dispose aus der IDisposable-Schnittstelle
  public void Dispose() {
    if( ! counterReduced) {
      countCircles--;
      counterReduced = true;
    }
  }
}

Wenn mir das vielleicht jemand in kurzen Worten erklären kann, wäre ich sehr dankbar.

Danke schon mal!
cl