Laden...

Jede Datei überprüfen - ggf. Dummy Datei erstellen.

Erstellt von Tommylik vor 2 Jahren Letzter Beitrag vor 2 Jahren 815 Views
T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren
Jede Datei überprüfen - ggf. Dummy Datei erstellen.

Servus,

Habe eine Form mit einem Button und möchte bei Betätigung
das im vorgegebenen Ordner geprüft wird das alle Dateien vorhanden sind.
Sollte eine oder mehrere Dateien fehlen, sollen dafür Dummy Dateien erstellt werden.


private void button1_Click(object sender, EventArgs e)
        {
            // Nur für eine bessere Verständnis habe ich hier Zahlen hingeschrieben und keine Variablen.
            string strFile = "21050612325";
            string strFolder = "21050612325";        
          
            string TargetPath = @"D:\S7_Export\AppData\" + strFolder;

            string[] strZusatz = new string[6];

            strZusatz[0] = "_x015id02xa1_Job1_" + "*.*";
            strZusatz[1] = "_x015id02xa1_Job2_" + "*.*";
            strZusatz[2] = "_x015id02xa1_Job3_" + "*.*";
            strZusatz[3] = "_x015id02xa1_Job4_" + "*.*";
            strZusatz[4] = "_x015id02xa1_Job5_" + "*.*";
            strZusatz[5] = "_x015id02xa1_Job6_" + "*.*";

            string[] strDummy = new string[6];
            strDummy[1] = "15id02_Job1_Dummy.txt";
            strDummy[2] = "15id02_Job2_Dummy.txt";
            strDummy[3] = "15id02_Job3_Dummy.txt";
            strDummy[4] = "15id02_Job4_Dummy.txt";
            strDummy[5] = "15id02_Job5_Dummy.txt";
            strDummy[6] = "15id02_Job6_Dummy.txt";

            for (int i = 0; i == strZusatz.Length; i++)
            {
                    string path = @"D:\S7_Export\Sensopart\x015id02xa1\" + strFile + strZusatz[i];
                    string[] prüfen;
                    prüfen = Directory.GetFiles(path);
                if (prüfen.Length > 0)
                {
                    Directory.Move(@"D:\S7_Export\Sensopart\x015id02xa1\" + strFile + strZusatz[i], TargetPath);
                }
                else
                {
                    //Dummydatei im Zielordner erstellen

                    StreamWriter myWriter = File.CreateText(@"D:\S7_Export\AppData\" + strFolder + strDummy[i]);
                }                   
                    
            }
            
        }

Wenn ich den Code ausprobiere bekomme ich einen Fehler:
System.IndexOutOfRangeException: "Der Index war außerhalb des Arraybereichs."
Es wird die For Schleife markiert.

Als Vorlage dient mein VBA Code der in einer Runtime einer Visualisierungssoftware läuft.


    Dim strZusatz1(1 To 6) As String
    strZusatz1(1) = "_x015id02xa1_Job1_" & "*.*"
    strZusatz1(2) = "_x015id02xa1_Job2_" & "*.*"
    strZusatz1(3) = "_x015id02xa1_Job3_" & "*.*"
    strZusatz1(4) = "_x015id02xa1_Job4_" & "*.*"
    strZusatz1(5) = "_x015id02xa1_Job5_" & "*.*"
    strZusatz1(6) = "_x015id02xa1_Job6_" & "*.*"

    Dim strDummy1(1 To 6) As String
    strDummy1(1) = "15id02_Job1_Dummy.txt"
    strDummy1(2) = "15id02_Job2_Dummy.txt"
    strDummy1(3) = "15id02_Job3_Dummy.txt"
    strDummy1(4) = "15id02_Job4_Dummy.txt"
    strDummy1(5) = "15id02_Job5_Dummy.txt"
    strDummy1(6) = "15id02_Job6_Dummy.txt"

    qCount = 0
    rCount = 0
    For qCount = 1 To 6
        'check if the file exists
        If Dir("D:\S7_Export\Sensopart\x015id02xa1\" & strFile & strZusatz1(qCount)) <> "" Then
            'Dateien in den Zielordner verschieben
            oFSO.MoveFile "D:\S7_Export\Sensopart\x015id02xa1\" & strFile & strZusatz1(qCount), strTargetPath
            If qCount = 6 Then
                MsgBox "Fertig", vbOKOnly 
            End If
        Else
            rCount = rCount + 1
            'Dummydatei im Zielordner erstellen
            oFSO.CreateTextFile "D:\S7_Export\AppData\" & strFolder & "\" & strDummy1(qCount)
            If rCount = 1 Then
                MsgBox "Es fehlen Dateien. Siehe im Ordner welche", vbExclamation
            End If
        End If
    Next qCount

Könnte mir einer von Euch sagen was falsch ist stehe total auf dem Schlauch.
Ich möchte etwas Umsetzen was es hier im Forum nicht als Beispiel gibt.
Und logischerweise ist alles verschieden zwischen den Sprachen.

Vielen Dank im voraus.

MfG Tommylik

2.078 Beiträge seit 2012
vor 2 Jahren

Du solltest Path.Combine nutzen, um Teil-Pfade zusammenzusetzen.
Und bedenke, dass File.CreateText (und andere ähnliche Methoden auch) die Datei öffnet, aber nicht schließt, das musst Du selber machen.

Und dein Fehler liegt nicht bei der for-Schleife, dennoch:

for (int i = 0; i == strZusatz.Length; i++)
{
    // ...
}

Schau dir mal die Bedingung an, macht die so viel Sinn?
Siehe: for (C#-Referenz)

Dein Fehler liegt bei der strDummy-Variable.
Bei C# und den meisten anderen Sprachen auch) fangen die Indizes immer bei 0 an.
Du fängst bei 1 an. Bei strZusatz hast Du's richtig gemacht.

Ach ja:
Mit der ungarischen Notation machst Du dir nicht gerade Freunde 😉
Bleib beim camelCase bzw. PascalCase, je nach Situation.

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Hallo Palladin007,

Vielen Dank für deine schnelle Antwort.

Du solltest Path.Combine nutzen, um Teil-Pfade zusammenzusetzen.

Meinst du so und nur bei strZusatz oder generel?


            string Job1 = "_x015id02xa1_Job1_";
            string Job2 = "_x015id02xa1_Job2_";
            string Job3 = "_x015id02xa1_Job3_";
            string Job4 = "_x015id02xa1_Job4_";
            string Job5 = "_x015id02xa1_Job5_";
            string Job6 = "_x015id02xa1_Job6_";
            string ext = "*.*";

            string[] strZusatz = new string[6];

            strZusatz[0] = Path.Combine(Job1, ext);
            strZusatz[1] = Path.Combine(Job2, ext);
            strZusatz[2] = Path.Combine(Job3, ext);
            strZusatz[3] = Path.Combine(Job4, ext);
            strZusatz[4] = Path.Combine(Job5, ext);
            strZusatz[5] = Path.Combine(Job6, ext);

Und bedenke, dass File.CreateText (und andere ähnliche Methoden auch) die Datei öffnet, aber nicht schließt, das musst Du selber machen.

Das habe ich wie folgt abgeändert.


                    using (StreamWriter myWriter = File.CreateText(@"D:\S7_Export\AppData\" + strFolder + strDummy[i]))
                    {
                        myWriter.Close();
                    }

Und dein Fehler liegt nicht bei der for-Schleife, dennoch:

Habe ich mir angeschaut und abgeändert.


for (int i = 0; i < strZusatz.Length; i++)

Das mit mit dem strDummy habe ich danach auch gesehen aber daran liegt es auch nicht.
Die For Schleife ist es auch nicht mehr.

Ich habe jetzt ein neues Problem.
Der neue Fehler stoppt jetzt hier:


string[] path;

Der Hinweis lautet:
System.ArgumentException: "Illegales Zeichen im Pfad."

Wenn ich dann mit F10 oder F11 debugge und an diese Stelle komme:


  string[] strZusatz = new string[6];

            strZusatz[0] = Path.Combine(Job1, ext);

Dann steht im strZusatz[0] folgendes: ({string[6]}

Ich verstehe es so das die geschweifte Klammer das illegale Zeichen ist.

Und das mein String Array ein Schrotthaufen ist.
Das kommt davon wenn man es nicht richtig versteht und etwas 1 zu 1 umsetzen will.

Wer kann mir sagen wie ich es besser machen könnte.

MfG Tommylik

16.806 Beiträge seit 2008
vor 2 Jahren

Also Deine ungarischen Notation tut in den Augen echt weh, da muss man Palladin recht geben...

Meinst du so und nur bei strZusatz oder generel?

Immer, ausnahmslos immer. Siehe auch die Doku zu Path.Combine.
Daher solltest Du auch


File.CreateText(Path.Combine("D:\S7_Export\AppData\" , strFolder , strDummy[i])

schreiben und nichts anderes.

Deine Änderung


using (StreamWriter myWriter = File.CreateText(@"D:\S7_Export\AppData\" + strFolder + strDummy[i]))
{
    myWriter.Close();
}

ist besser, aber unnötig auwendig.
Schau Dir doch wenigstens an, was die Methoden und Co tun, wenn Du sie verwendest.
Aber ein manuelles Close bei einem using() ist absolut sinnfrei - dass Du jetzt das Handle schließt jedoch korrekt.


using (File.Create(filename)) ;
// oder 
File.Create(filename).Dispose();
// oder 
File.WriteAllText(filename, String.Empty);

Eine Fehlermeldung wie

Fehlermeldung:
System.IndexOutOfRangeException: "Der Index war außerhalb des Arraybereichs."

bekommst Du sehr sehr einfach selbst raus, wenn Du Deinen Code debuggst.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Zum Fehler> Fehlermeldung:

System.ArgumentException: "Illegales Zeichen im Pfad."

und der Aussage

Ich verstehe es so das die geschweifte Klammer das illegale Zeichen ist.

ist es aber so, dass Du dann offenbar nicht den Fehler verstehst 🙂
Du verstehst hier den Debugger-Eintrag nicht, denn {string[6]} zeigt Dir nur an, dass sich im Array sechs Elemente befinden.
Schau Dir daher die Doku zum Debugger an. Du wirst es mächtig schwer haben, wenn Du den Debugger nicht oder falsch anwendest.

Dein Illegales Zeichen ergibt sich aus


Path.Combine(Job1, ext);

genauer gesagt ext.
ext ist bei Dir . und * ist eben ein illegales Zeichen.

2.078 Beiträge seit 2012
vor 2 Jahren

Deine zwei Arrays sind eigentlich auch sinnlos, die sind ein Paradebeispiel für Spaghetticode, den man sehr leicht mit einer for-Schleife lösen kann.
Schreib einfach in die for-Schleife:

string strZusatz = "_x015id02xa1_Job" + (i + 1) + "_*.*";
// oder 
string strZusatz = $"_x015id02xa1_Job{i + 1}_*.*";

var strDummy = "15id02_Job" + (i + 1) + "_Dummy.txt";
// oder 
var strDummy = $"15id02_Job{i + 1}_Dummy.txt";

Dann nutzt Du die zwei Variablen anstelle des Arrays und gut ist.
Das jeweils zweite Beispiel nennt sich "String Interpolation" und wird vom Compiler in einen string.Format-Aufruf umgebaut.

Und Path.Combine setzt dir den Pfad aus einzelnen Elementen (Ordner/Datei) zusammen, z.B. den Datei-Namen kannst Du damit nicht zusammenbauen.
Aber die Klasse bietet noch andere nützliche Methoden, z.B. für die Arbeit mit den Datei-Erweiterungen.
Es lohnt, immer mal wieder in die Doku zu schauen, was eine Klasse noch so alles kann.

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Hallo Abt,

Vielen Dank für deine Antwort und die Kritik.

Also Deine ungarischen Notation tut in den Augen echt weh, da muss man Palladin recht geben...

Ich habe von Palladin die Links bekommen und werde mich um eine korrekte Notation kümmern,
wenn der Ablauf funktioniert.

Immer, ausnahmslos immer. Siehe auch die Doku zu Path.Combine.

Wenn ich Path.Combine benutze, werden die Pfadseparatoren automatisch gesetzt.
Mit der Variable strFolder ist das kein Problem, weil diese Variable einen Ordner darstellt.


File.CreateText(Path.Combine("D:\S7_Export\AppData\" , strFolder , strDummy[i])

aber

Die Variable strFile_IB ist ein Teil des Dateinamen und steht am Anfang und der wichtigste Teil vom Dateinamen.
Hier bekomme ich mit Path.Combine einen Pfadseparator in den Dateinamen. Siehe Foto


 prüfen = Directory.GetFiles(Path.Combine(SourcePath, strFile_IB, strZusatz));

Da ich es vorher nicht wusste, muss ich nach einer neuen Lösung suchen.

z.B. den Datei-Namen kannst Du damit nicht zusammenbauen.

Danke an Palladin.

Ich habe es mit String.Concat probiert den Dateinamen zusammenzubauen?

Bekomme aber wie vorher den Fehler: System.IO.IOException: "Der Verzeichnisname ist ungültig.
Siehe Foto.

Schau Dir doch wenigstens an, was die Methoden und Co tun, wenn Du sie verwendest.

Versuche ich.
Ich bin nie auf den Gedanken gekommen auf eine Klasse oder Methode mal die F1 Taste zu drücken.
Da kommt man ja gleich zu dem, was man braucht. Entwicklertools, technische Dokumentation und Codebeispiele

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Bin fleißig am Nutzen. Siehe Fotos
Vor allem, was VS alles so kann, was ich nicht wusste.

@ Palladin007

Vielen Dank für deine Codebeispiele.

Es lohnt, immer mal wieder in die Doku zu schauen, was eine Klasse noch so alles kann.

Das hast du absolut recht. Mir fällt es nur schwer aus den Beispielen, die da mit angegeben sind die richtigen Schlüsse raus zu ziehen.
Sehr oft ist es so das die Beispiele nicht zu dem passt, was du gerade machst. Und dann wechsle ich schnell zu Google.

Ich werde weiter Google bemühen, um die Lösung für den Dateinamen zu finden.

Vielen Dank für Eure Unterstützung.

Tommylik

D
261 Beiträge seit 2015
vor 2 Jahren

Directory.GetFiles liefert dir die Dateien eines Verzeichnisses zurück. Du versuchst aber ständig einen Dateipfad an die Methode zu übergeben.

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Hallo dannoe,

Danke für deine Antwort.

Ja, das da, was falsch war, habe ich auch erkannt.
Ich habe es nun zum Laufen bekommen.


private void button1_Click(object sender, EventArgs e)
        {
            //ComponentResult CR = LeakResult();

            //string strFolder = CR.FolderName;
            //string strFile_IB = CR.PraegeCodeIB;
            string strFile_IB = "21050612325";
            string strFolder = "21050612325";

            string SourcePath = @"D:\S7_Export\Sensopart\x015id02xa1\";
            string TargetPath = @"D:\S7_Export\AppData\" + strFolder + "\\";                     

            for (int i = 0; i < 6; i++)
            {
                string strZusatz = "_x015id02xa1_Job" + (i + 1) + "_Pass.jpg";
                var strDummy = "15id02_Job" + (i + 1) + "_Dummy.txt";

                string strFileName;
                strFileName = string.Concat(strFile_IB, strZusatz);                
                
                string[] fileEntries = Directory.GetFiles(SourcePath, strFileName);

                string path = Path.Combine(SourcePath, strFileName);
                string path2 = Path.Combine(TargetPath, strFileName);

                if (fileEntries.Length > 0)             
                {
                    File.Move(path, path2);                    
                }
                else
                {
                    //Dummydatei im Zielordner erstellen
                    using (StreamWriter myWriter = File.CreateText(Path.Combine(@"D:\S7_Export\AppData\", strFolder, strDummy)))
                    {
                        myWriter.Close();
                    }
                }                  
                    
            }
            
        }

Die richtige Dummy Datei wird auch erstellt, wenn eine von den JPG-Dateien fehlt.

Könnt Ihr mir bitte sagen, ob noch gravierende Fehler drin sind, die ich nicht erkenne?
Nur, weil es funktioniert muss nicht alles richtig sein.
Die Notation muss ich machen das ist klar. Vielleicht könnt Ihr mir mal eine Sache markieren was schlechte Notation ist.
Die File.Create Sache, die mir Abt vorgeschlagen hat, muss ich mir auch noch anschauen.

Also vielen Dank noch mal für die tolle Unterstützung.

Grüße Tommylik

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Hallo Palladin,

Ich habe doch noch eine Frage, weil ich heute die Situation damit hatte.

Von dir habe ich diesen guten Vorschlag bekommen.


string strZusatz = "_x015id02xa1_Job" + (i + 1) + "_*.*";

Ich habe wegen des illegalen Zeichens das . gegen _Pass.jpg ausgetauscht.


string strZusatz = "_x015id02xa1_Job" + (i + 1) + "_Pass.jpg";

In VBA hatte ich . genutzt, weil es vorkommen kann das die Dateien auch mit _Fail.jpg benannt werden können.
Kann ich die beiden Wörter irgendwie verodern das auch nach den Dateien mit "Fail" geschaut werden.

Ist dieses Zeichen || für eine Veroderung richtig?

Vielen Dank

Grüße Tommylik

16.806 Beiträge seit 2008
vor 2 Jahren

* ist ein reserviertes Zeichen von den aller meisten Dateisystemen, daher kann dieses nicht für Filesystem-Handles (zB Dateinamen) verwendet werden.
Was Du meinst sind Wildcards bei der Suche nach Dateien; und das ist ebenfalls alles dokumentiert.
Das kann entweder direkt durch die Unterstützung von Dateioperationen erfolgen, oder durch String-Operationen (mit etwas Zusatz-Code).

Nimm den Rat an und les Dir ein mal die Doku durch. Damit tust Du Dir vor allem einen gefallen, weniger uns - weil Du selbst schneller ans Ziel kommst und die Sache verstehst.
Damit hast Du dann mind. 70% Wissen - und weißt wo der Rest steht.

Path Klasse (System.IO)
Directory Klasse (System.IO)
File Klasse (System.IO)

Ich bin mir sehr sicher, dass Du diese Frage sehr schnell selbst beantworten kannst, weil sie gleich im ersten Code Beispiel der Links gezeigt wird.

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Hallo Abt,

Vielen Dank für deine Antwort.

Dein Rat ist sehr hilfreich und ich habe auch gelesen aber vieles verstehe ich nicht.
Aber ich habe auch eine kleine Lösung gefunden mit dem * die Dateien zu verschieben.
Genauso wie es in der Doku steht.


               string sourceDirectory = @"D:\S7_Export\Sensopart\x015id02xa1";
                string archiveDirectory = @"D:\S7_Export\AppData\" + strFolder;

                var jpgFiles = Directory.EnumerateFiles(sourceDirectory, "*.jpg");

                foreach (string currentFile in jpgFiles)
                {
                    string fileName = currentFile.Substring(sourceDirectory.Length + 1);
                    Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));
                }                

Aber jetzt muss ich herausfinden wie ich diesen Code in den alten Code intrigiere um
jede Datei zu prüfen und wenn notwendig ein Dummy Datei erstellen.

Ich habe einerseits einen Schritt nach vorne gemacht aber auch wieder einen zurück.

Vielen Dank nochmal für deine Unterstützung

Tommylik

16.806 Beiträge seit 2008
vor 2 Jahren

string fileName = currentFile.Substring(sourceDirectory.Length + 1); Path.GetFileName Methode (System.IO)

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Hallo Abt,

Danke für deine Antwort.

Zitat von Tommylik
string fileName = currentFile.Substring(sourceDirectory.Length + 1);

Path.GetFileName Methode (System.IO)

Tut mir Leid jetzt hältst du mich für Klüger als ich bin.
Ich weiß nicht was du mir damit sagen willst?
Irgendetwas an der Zeile austauschen?

Vor allem diese Zeile soll ich mir anschauen mit der ich auf Kriegsfuß stehe und dieses Substring??
Es gibt Sachen da kommste nicht dahinter.


string fileName = currentFile.Substring(sourceDirectory.Length + 1);

Vieleicht könntest du bitte noch was dazu sagen. z.B. Wo rauf ich achten soll?

Jetzt ist mir eine Idee gekommen. Sehr unschön und so professionell wir Ihr das machen
würdet bekomme ich es sowieso nicht hin aber es funktioniert.
Die For Schleifen 2 x aufrufen und nur die Wörter Pass und Fail anpassen.

Grüße Tommylik

C
55 Beiträge seit 2020
vor 2 Jahren

Hallo,

Die Methode GetFileName gibt aus einem gegebenen Pfad, den Dateinamen zurück oder anders gesagt du brauchst kein Aufruf an substring. Hättest du dir den Link angeguckt wäre dir das bestimmt aufgefallen, dort gibt es sogar ein Beispiel, dafür.

Grüße

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Hallo ClaraSoft,

Vielen Dank für deine Antwort.

Ich hatte es mir angeschaut auch das Beispiel und als du das
mit dem Substring erwähnt hattest nochmal.
Aber, wenn ich nicht verstehe, was genau falsch ist oder
was Ihr mir damit sagen wollt, dann kann ich es nicht nutzen.

Du hast mir die Info gegeben:

oder anders gesagt du brauchst kein Aufruf an substring.

Also verstehe ich jetzt das ich diese Zeile mit GetFileName erstellen soll.


string fileName = currentFile.Substring(sourceDirectory.Length + 1);

Aber warum? Das Verschieben der Dateien funktioniert ja.
Ist es mit GetFileName besser, sicherer oder ist die Vorlage aus der Doku nicht mehr aktuell???

Tut mir leid aber Abt hat mich mit dieser Code Zeile und nur mit dem Hinweis auf die Doku überfordert.

Trotzdem Danke für Eure Hilfe.

Grüße Tommylik

D
261 Beiträge seit 2015
vor 2 Jahren

Dein Substring-Gefummel funktioniert nicht mehr, wenn dein sourceDirectory ein Schrägstrich am Ende enthält.

Außerdem: Welcher der Sätze ist leichter für dich zu verstehen:

  1. "Wenn du mir einen Pfad gibst, dann liefere ich dir den Dateinamen des Pfades zurück"

  2. "Wenn du mir einen String gibst, dann gebe ich dir einen Teilbereich zurück. Den Start des Teilbereichs errechne ich anhand der Länge eines anderen Strings und addiere magischerweise 1 darauf."

Du und andere werden später dankbar sein, wenn dein Code selbsterklärend ist und sie nicht erst überlegen müssen was das Substring eigentlich macht.

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Hallo dannoe,

Vielen Dank für deine Antwort.

Außerdem: Welcher der Sätze ist leichter für dich zu verstehen:

Ist Eindeutung keine Frage. Für Euch ist das selbstverständlich
ich erkenne so was nicht. Ok jetzt vielleicht. Vielen Dank.

So meine geänderte Variante mit GetFileName. Funktioniert sehr gut.
Fast so wie ich es mir vorstelle.

Ein Schönheitsfehler hat das noch.
Weil ich nicht *.jpg nutzen kann so wie ich es möchte habe ich in den 2 Zeilen
die Wörter getauscht und rufe die Schleifen 2 x auf.
Wenn ich nur eine bräuchte, wäre es schöner.


string strZusatz = strFile_IB + "_x015id02xa1_Job" + (i + 1) + [color]"_Pass.jpg"[/color];
und
string strZusatz = strFile_IB + "_x015id02xa1_Job" + (i + 1) + [color]"_Fail.jpg"[/color];


private void BtnTest2_Click(object sender, EventArgs e)
        {
            // Nur für Testzwecke
            string strFile_IB = "21050612325";
            string strFolder = "21050612325";          
            
            for (int i = 0; i < 6; i++)
            {                
                string SourcePath = @"D:\S7_Export\Sensopart\x015id02xa1\";
                string strZusatz = strFile_IB + "_x015id02xa1_Job" + (i + 1) + "_Pass.jpg";
                string strDummy = "15id02_Job" + (i + 1) + "_Pass_Dummy.txt";
                string SourceFullPath = SourcePath + strZusatz;
                string TargetFullPath = @"D:\S7_Export\AppData\" + strFolder;
                string result = Path.GetFileName(SourceFullPath);
                string[] fileEntries = Directory.GetFiles(SourcePath, strZusatz, SearchOption.TopDirectoryOnly);

                if (fileEntries.Length > 0)
                {
                    Directory.Move(SourceFullPath, Path.Combine(TargetFullPath, result));
                }
                else
                {                    
                    //Dummydatei im Zielordner erstellen
                    File.WriteAllText(Path.Combine(@"D:\S7_Export\AppData\", strFolder, strDummy), string.Empty);
                }

            }

            for (int i = 0; i < 6; i++)
            {
                string SourcePath = @"D:\S7_Export\Sensopart\x015id02xa1\";
                string strZusatz = strFile_IB + "_x015id02xa1_Job" + (i + 1) + "_Fail.jpg";
                string strDummy = "15id02_Job" + (i + 1) + "_Fail_Dummy.txt";
                string SourceFullPath = SourcePath + strZusatz;
                string TargetFullPath = @"D:\S7_Export\AppData\" + strFolder;
                string result = Path.GetFileName(SourceFullPath);
                string[] fileEntries = Directory.GetFiles(SourcePath, strZusatz, SearchOption.TopDirectoryOnly);

                if (fileEntries.Length > 0)
                {
                    Directory.Move(SourceFullPath, Path.Combine(TargetFullPath, result));
                }
                else
                {
                    //Dummydatei im Zielordner erstellen
                    File.WriteAllText(Path.Combine(@"D:\S7_Export\AppData\", strFolder, strDummy), string.Empty);
                }

            }
        }

Vielen Dank noch mal für Eure Hilfe.

Grüße

D
261 Beiträge seit 2015
vor 2 Jahren

...
die Wörter getauscht und rufe die Schleifen 2 x auf.
Wenn ich nur eine bräuchte, wäre es schöner.
...

Lager deinen Code in eine Methode ausund rufe diese Methode 2x mit unterschiedlichen Parametern auf.


        private void MyExportTestMethodXyz(string strFile_IB, string strFolder, string filenameSuffix) {
            for (int i = 0; i < 6; i++) {
                string SourcePath = @"D:\S7_Export\Sensopart\x015id02xa1\";
                string strZusatz = $"{strFile_IB}_x015id02xa1_Job{i + 1}_{filenameSuffix}.jpg";
                string strDummy = $"15id02_Job{i + 1}_{filenameSuffix}_Dummy.txt";
                string SourceFullPath = SourcePath + strZusatz;
                string TargetFullPath = @"D:\S7_Export\AppData\" + strFolder;
                string result = Path.GetFileName(SourceFullPath);
                string[] fileEntries = Directory.GetFiles(SourcePath, strZusatz, SearchOption.TopDirectoryOnly);

                if (fileEntries.Length > 0)
                {
                    Directory.Move(SourceFullPath, Path.Combine(TargetFullPath, result));
                }
                else
                {
                    //Dummydatei im Zielordner erstellen
                    File.WriteAllText(Path.Combine(@"D:\S7_Export\AppData\", strFolder, strDummy), string.Empty);
                }
            }
        }

und dann aufrufen:


MyExportTestMethodXyz(strFile_IB, strFolder, "Pass");
MyExportTestMethodXyz(strFile_IB, strFolder, "Fail");

Und du solltest wirklich diese ungarische Notation entfernen.

O
79 Beiträge seit 2011
vor 2 Jahren

Die ungarische Notation sieht vor, das man Variablennamen mit einem Kürzel versieht, das den Typ der Variablen erkennbar macht. So sieht man schon am Namen, ob das ein Integer (iAlter z.B.), ein String (strFilename) oder ein Double (dEinkommen) ist. Diese Idee stammt aus einer Zeit, als die Code-Editoren noch keine Farbkennung für die verschiedenen syntaktischen Elemente der Programmiersprache beherrschten.

Heutzutage ist Farbcodierung Standard und für alle Sprachen verfügbar. Dadurch ist die ungarische Notation unnötig und - nicht nur für uns alte, eingefleischte C#-Hasen - sogar abzulehnen, da es den Codeguidelines für C# widerspricht.

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Hallo dannoe,

Vielen Dank für deine Antwort und Code Beispiel.

Du hast hier die "String Interpolation" benutzt, in der Microsoft Hilfe steht das dies zur besseren Lesbarkeit beiträgt.


        string strZusatz = $"{strFile_IB}_x015id02xa1_Job{i + 1}_{filenameSuffix}.jpg";
        string strDummy = $"15id02_Job{i + 1}_{filenameSuffix}_Dummy.txt";

Kann man hier sagen das meine Variante zur ungarischen Notation zählt?

So hier nun meine Variante wegen der ungarischen Notation.
Ich hoffe, es ist schon etwas besser geworden.


private void MyExportTestMethodXyz(string fileIB, string folder, string filenameSuffix)
        {
            for (int i = 0; i < 6; i++)
            {
                string sourcePath = @"D:\S7_Export\Sensopart\x015id02xa1\";
                string fullFileName = $"{fileIB}_x015id02xa1_Job{i + 1}_{filenameSuffix}.jpg";
                string dummyDatei = $"15id02_Job{i + 1}_{filenameSuffix}_Dummy.txt";
                string sourceFullPath = sourcePath + fullFileName;
                string targetFullPath = @"D:\S7_Export\AppData\" + folder;
                string result = Path.GetFileName(sourceFullPath);
                string[] fileEntries = Directory.GetFiles(sourcePath, fullFileName, SearchOption.TopDirectoryOnly);

                if (fileEntries.Length > 0)
                {
                    Directory.Move(sourceFullPath, Path.Combine(targetFullPath, result));
                }
                else
                {
                    // Dummydatei im Zielordner erstellen
                    File.WriteAllText(Path.Combine(@"D:\S7_Export\AppData\", folder, dummyDatei), string.Empty);
                }
            }
        }

@OlafSt
Vielen Dank für deine Antwort war sehr hilfreich.

Vielen Dank nochmal für Eure Unterstützung.

Grüße Tommylik

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Hallo an alle,

So nochmal vielen Dank an alle für Eure Erklärungen und Tipps.
Einerseits waren sie sehr gut und manchmal haben Sie mir nicht geholfen da ich es nicht Nachvollziehen konnte.
Ich habe festgestellt das was ich Ursprünglich wollte war nicht gut durchdacht.
Und habe es nochmal von ein anderen Perspektiven aus betrachtet und dann anders gelöst.
Ich verschiebe erst die Daten und prüfen dann alles was von Bedeutung ist.
Try und Catch für die Fehler die mit Datei Operationen passieren können habe ich noch nicht mit eingebaut,
weil ich noch am überlegen bin wie ich die Anzeige mache.
MessageBox möchte ich nicht nehmen da man die bestätigen muss und der Code läuft nicht weiter.
Ich hoffe das die Notation ein bisschen besser ist.
Es wäre schön, damit ich es in Zukunft besser machen kann, das ihr mir nur markiert was ich nochmal überdenken sollte.


 private void BtnTest2_Click(object sender, EventArgs e)
        {          
            // Nur für Testzwecke
            string fileIB = "21050612325";
            string folder = "21050612325L";
            string sourcePath = @"D:\S7_Export\AppData\" + folder + "\\";

            DirectoryInfo TargetDirectory = new DirectoryInfo(@"D:\S7_Export\AppData\" + folder);
            //if (dirInfo.Exists == false)
            //Directory.CreateDirectory(@"D:\S7_Export\AppData\" + folder);

            // Bilddateien vom Mutternstanzen x15id02xa1 verschieben.
            List<String> foundFiles = Directory.GetFiles(@"D:\S7_Export\Sensopart\x015id02xa1\", "*.*", 
            SearchOption.AllDirectories).ToList();            
            foreach (string file in foundFiles)
            {
                FileInfo mFile = new FileInfo(file);
                mFile.MoveTo(TargetDirectory + "\\" + mFile.Name);
            }      
            
            // Dummy Datei erstellen wenn Dateien fehlen.
            for (int i = 0; i < 6; i++)         
            {
                string fullFileName = $"{fileIB}_x015id02xa1_Job{i + 1}*.jpg";
                string sourceFullPath = sourcePath + fullFileName;
                string[] fileEntries = Directory.GetFiles(sourcePath, fullFileName, SearchOption.TopDirectoryOnly);

                if (fileEntries.Length > 0)
                {
                    File.Exists(sourceFullPath);
                }
                else
                {
                    string dummyDatei = $"15id02_Job{i + 1}_NoFile.txt";
                    // Dummydatei im Zielordner erstellen
                    File.WriteAllText(Path.Combine(@"D:\S7_Export\AppData\", folder, dummyDatei), string.Empty);
                }
            }

            // Anzahl Dateien die verschoben wurden.
            LblAnzDateien.Text = Convert.ToString(TargetDirectory.GetFiles().Length);

            // Anzeige welche Dateien verschoben wurden in der ListBox 1.
            foreach (FileInfo file in TargetDirectory.GetFiles())
            {
                listBox1.Items.Add("Datei: " + file.Name);
            }

            // Anzeige welche Dateien fehlen in der ListBox 2.
            foreach (string foundFile in Directory.GetFiles(@"D:\S7_Export\AppData\" + folder, "*NoFile.txt", 
            SearchOption.TopDirectoryOnly))
            {
                listBox2.Items.Add("Datei: " + foundFile);
            }

            // Anzeige welche Dateien sind niO in der ListBox 2.           
            foreach (string foundFile in Directory.GetFiles(@"D:\S7_Export\AppData\" + folder, "*Fail.jpg", 
           SearchOption.TopDirectoryOnly))
            {
                listBox2.Items.Add("Datei: " + foundFile);
            }            
        }

Dann hätte ich zum Abschluss noch eine Frage über die Struktur des Aufbaus eines Projektes und würde mich freuen wenn Ihr mir Eure Meinung sagen würdet.

Wenn ich mehrere solche verschiebe Aktionen hätte und jeweils mit unterschiedlichen Pfad Angaben und auch welche über das Netzwerk, wäre es dann nicht besser das in einzelne Methoden / Klassen auszulagern?
Ich denke schon alleine wegen der Übersicht wäre das besser. Da ich keine Erfahrung habe bin ich mir nicht sicher. Und dann könnte ich doch alle Methoden in einer Methode aufrufen oder? Was ist schneller alles in einer Methode oder aufgeteilt auf mehrere?

Vielen Dank nochmal für Eure Hilfe.

Grüße Tommylik

16.806 Beiträge seit 2008
vor 2 Jahren

Ich verschiebe erst die Daten und prüfen dann alles was von Bedeutung ist.

Das ist umgekehrt, als dass man es tun sollte.
Vorher prüfen war schon der richtige Weg; spart einfach Resourcen und verhindert Folgefehler, sowohl strukturell wie auch logisch.

Es wäre schön, damit ich es in Zukunft besser machen kann, das ihr mir nur markiert was ich nochmal überdenken sollte.

Wenn Du ein Thema erstellst, dann musst Du auch immer damit rechnen, dass Du nicht unbedingt nur das Feedback bekommst, was Du willst; das wäre natürlich ein nettes Rosinenpicken - aber das ist nicht Sinn der Sache, allein, weil es hier viele verschiedene Aspekte und Blickwinkel gibt.
Du musst für Dich lernen Feedback zu filtern und anzuwenden; das ist in Foren im Endeffekt nicht anders als überall sonst.

Wenn ich mehrere solche verschiebe Aktionen hätte und jeweils mit unterschiedlichen Pfad Angaben und auch welche über das Netzwerk, wäre es dann nicht besser das in einzelne Methoden / Klassen auszulagern?

Klar, das ist der Aspekt von Software Architektur, der aus vielen verschiedenen Puzzleteilen besteht, die allesamt in Erfahrung enden.
Dein Code ist halt schon sehr Spaghetti-Code. Für Dich würde vielleicht schon reichen, wenn Du Dinge wie OOP, Single-Responsibility-Prinzip und Don’t repeat yourself anwendest, damit Du die selbst die Übersicht behälst.

Generell: Ich vermute einfach mal ins blaue, dass Du Dich bisher nie mit strukturellem Code-Aufbau beschäftigt hast, eher drauf los programmiert hast und Dich nie mit Pattern und Code Designs eingelesen hast.
Letzten Endes ist aber genau das die Basis dafür. Es gibt sooo viele Standards, Pattern, Best Practises und Co - und Du wirst viele Stunden investieren und hunderte Seite lesen und verstehen müssen, um auch nur die Basics davon abzudecken.
Meiner Meinung nach kann man sehr schnell erkennen, ob genau das jemand schon mal gemacht hat - oder nicht; einfach weil diese Leute deutlich aus der Masse hervorstechen in Sachen Software Qualität.

Ist natürlich eher relavant und anwendbar bzw. einfacher, wenn man schon einige Zeit in der Code Welt unterwegs ist.

Da ich keine Erfahrung habe bin ich mir nicht sicher.

Erfahrung kommt mit der Zeit, aus Fehlern, aus Feedback. Die kann Dir keiner Rüberwerfen, die musst Dir selbst nehmen/machen.

Was ist schneller alles in einer Methode oder aufgeteilt auf mehrere?

Über "Geschwindigkeit" solltest Du Dir in Deinem Stadium keine Sorgen machen. Von Micro-Optimizing sollten wir hier wirklich nicht sprechen 🙂
Versuch Dich auf das für Dich wesentliche zu konzentrieren und das ist ja eher, dass Du selbst verstehst, was Du da machst.
Nutze also Struktur eher für Dich fürÜbersichtlichkeitsaspekte.

T
Tommylik Themenstarter:in
51 Beiträge seit 2019
vor 2 Jahren

Servus Abt,

Vielen Dank für deine Antwort und die vielen Denkanstöße.
Die Links waren auch sehr hilfreich. Dadurch bin ich zu einigen anderen interessante Seiten gekommen.
Vor allem hat mir dieses Video geholfen. https://www.youtube.com/watch?v=QKX9VJAvGWM.

Vorher prüfen war schon der richtige Weg

Sorry da habe ich noch vergessen dir zu erklären das die Situation es so verlangt.
Aber gewiss hast du im normal Fall Recht.
Da ist eine Anlage wo Bauteile gefertigt werden. Auf dem ganzen Weg bis das BT fertig ist,
werden Dateien mit Prozessdaten von den diversen Applikationen auf ihren PCs abgelegt.
Wenn das Teil dann fertig ist müssen so wie so alle Dateien in den Ziel Ordner verschoben werden.
Die Anlage muss weiter laufen deswegen wird nicht vor dem verschieben geschaut ob Dateien fehlen
um die Anlage anzuhalten, sondern erst danach wen sich der Fall wiederholen sollte.
Hat auch etwas mit der Politik der Firma zu tun wie sie das haben möchte auf Fehler zu reagieren.

dass Du nicht unbedingt nur das Feedback bekommst, was Du willst

Da hast du Recht und das weiß ich auch und es kann ja auch alles so bleiben.
Ich dachte auch mehr so wie als wenn man einen Aufsatz abgegeben hat.
Rote Kringel drunter und man weiß da hat man drüber nachzudenken.

dass Du Dich bisher nie mit strukturellem Code-Aufbau beschäftigt hast

Da hast du vollkommen Recht. Das was ich jetzt umsetzen möchte läuft derzeit schon
als VBA Variante in eine Visualisierungssoftware in der Runtime.
Da diese Runtime von der Visu nicht Multitasking fähig ist, kann es möglich sein das man
die Visu nicht nutzen kann wenn gerade in diesem Moment ein VBA Code aufgerufen wird.
Gerade bei verschieben der Dateien könnte es etwas länger Dauern es sind ja nicht wenig Dateien.
Somit habe ich darüber nachgedacht wie ich das verschieben der Dateien anders lösen kann.

Erfahrung kommt mit der Zeit, aus Fehlern, aus Feedback. Die kann Dir keiner Rüberwerfen, die musst Dir selbst nehmen/machen.

Jetzt bin ich verwirrt.
Die Erfahrung bekomme ich mit der Zeit da hast du Recht und auch aus Fehlern lernt man, aber wenn
ich etwas zeige, was ich gemacht habe und niemand sagt etwas dazu dann habe ich damit keinen Feedback bekommen und weiß somit nicht ob es Richtig oder Falsch ist.

So ich wollte nicht nur dir Antworten sondern auch noch mal zeigen was ich jetzt neues habe.


namespace PDE_2
{
    public partial class Form1 : Form
    {
        private const string TargetPath = @"D:\S7_Export\AppData\"; 
        private const string SourcePath = @"D:\S7_Export\AppData\"; 
        // Absicht einmal für das verschieben und einmal für die Dummy-Datei erstellen.

        private const string PathOfCamera15 = @"D:\S7_Export\Sensopart\x015id02xa1";
        private const string JobFileName = "_x015id02xa1_Job";        
        private const string Extension = "*.jpg";         

        /// <summary>
        /// Dateien verschieben
        /// </summary>
        /// <param name="rootPath"></param>
        /// <param name="targetPath"></param>
        /// <param name="folder"></param>
        private void FileMove(string rootPath, string targetPath, string folder)
        {
            string[] files = Directory.GetFiles(rootPath);
            foreach (string file in files)
            {
                string destinationFolder = targetPath + folder + "\\";
                File.Move(file, $"{destinationFolder}{Path.GetFileName(file) }");
            }
        }
                 
        /// <summary>
        /// Dummy Datei erstellen wenn Dateien fehlen.
        /// </summary>
        /// <param name="sourcePath"></param>
        /// <param name="folder"></param>
        /// <param name="fileIB"></param>
        /// <param name="jobFileName"></param>
        /// <param name="extension"></param>
        private void DummyDatei(
            string folder, string fileIB, string jobFileName, string sourcePath, string extension)
        {
            for (int i = 0; i < 6; i++)
            {
                string fullSourcePath = sourcePath + folder + "\\";
                string fullFileName = $"{fileIB}{jobFileName}{i + 1}{extension}";                
                string[] fileEntries = Directory.GetFiles(fullSourcePath, fullFileName, SearchOption.TopDirectoryOnly);

                if (fileEntries.Length > 0)
                {
                    string fullPath = fullSourcePath + fullFileName;
                    File.Exists(fullPath);
                }
                else
                {
                    string dummyDatei = $"{jobFileName}{i + 1}_NoFile.txt";                    
                    File.WriteAllText(Path.Combine(sourcePath, folder, dummyDatei), string.Empty);
                }
            }
        }

       /// <summary>
        /// Bilddateien vom Mutternstanzen x15id02xa1 verschieben.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnTest2_Click(object sender, EventArgs e)
        {            
            string fileIB = "21050612325";
            string folder = "21050612325L";
            string jobFileName = JobFileName;
            string sourcePath = SourcePath;
            string extension = Extension;
            string rootPath = PathOfCamera15;
            string targetPath = TargetPath;

            FileMove(rootPath, targetPath, folder);            

            DummyDatei(folder, fileIB, jobFileName, sourcePath, extension);
        }
    }
}

So wie ich das jetzt gemacht habe mit den Konstanten und die 2 separaten Methoden
ist das schon zu gebrauchen? Ich persönlich der keine Ahnung hat finde es besser.

Dann noch eine Frage zu diesem Buch:
Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code: Deutsche Ausgabe
Lohnt sich dieses Buch oder seit Ihr der Meinung das geht mit dem Internet alleine?

So vielen Dank nochmal für Eure Hilfe.

Servus Tommylik

309 Beiträge seit 2020
vor 2 Jahren

Dann noch eine Frage zu diesem Buch:
Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code: Deutsche Ausgabe
Lohnt sich dieses Buch oder seit Ihr der Meinung das geht mit dem Internet alleine?

Servus, solche Bücher lohnen sich eigentlich immer. Also einfahc mal sehen wie andere an bekannte Problemstellungen ran gehen.

Bei deinem Projekt sieht es allerdings ehr danach aus, als würdest du es mit sowas verkomplizieren.
Sieht vom groben draufblicken jedenfalls ehr nach einer Aufgabe aus die man kurz mit einem Shellskript erledigt.
Am besten versuchen, allgemeine Methoden anlegen, um sich Code zu sparen, eigene Klasse dafür anlegen, Bennungsregeln beachten,...

16.806 Beiträge seit 2008
vor 2 Jahren

Ich dachte auch mehr so wie als wenn man einen Aufsatz abgegeben hat.
Rote Kringel drunter und man weiß da hat man drüber nachzudenken.

Immer schwierig. Da würde ich Dir eher empfehlen Dir einen Mentoren zu suchen.
Foren sind eher weniger dazu da Dich wie ein Lehrer an die Hand zu nehmen. Die Idee von Foren ist Dir bei konkreten Probleme zu helfen.

Dir wurden schon viele Hinweise und Empfehlungen gegeben, die Du nur noch anwenden musst.
zB puzzlest Du immer noch Pfade über String-Operationen zusammen statt über Path.Combine().
Das kann man Dir hundert mal ankringeln; verstehen und anwenden musst es halt selbst 😉

Die Erfahrung bekomme ich mit der Zeit da hast du Recht und auch aus Fehlern lernt man, aber wenn
ich etwas zeige, was ich gemacht habe und niemand sagt etwas dazu dann habe ich damit keinen Feedback bekommen und weiß somit nicht ob es Richtig oder Falsch ist.

Jo, deswegen ist die Software Entwicklung eigentlich eine Teamarbeit.
Moderne Software Entwicklungs Prozesse beinhalten daher auch immer Zeit für Feedback- und Wissensvermittlungskultur.
Und Probleme in der Software kann man eben oft nicht nur mit einem Weg lösen.

Lohnt sich dieses Buch oder seit Ihr der Meinung das geht mit dem Internet alleine?

Sehe das wie Jim, Bücher lohnen sich meistens schon.
Die Frage ist, was Dir persönlich dieses Buch nun bringt, weil halt schon Grundlagen erfordert werden, die ich persönlich bei Dir noch nicht sooo sehe.
Back kleinere Brötchen, mach kleinere Schritte. Du wirst nicht von heut auf morgen zum Profi 😉

Und auch der Keep it simple Hinweis von Jim ist durchaus berechtigt.
=> KISS-Prinzip