Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

1

27.10.2015, 14:34

Dateilisten abgleichen und nur einmal vorkommende Dateien rausschreiben

Hallo,

ich arbeite grade an einem kleinen Projekt, dort sollen 2 Dateipfade mit sämtlichen Unterverzeichnissen verglichen werden. Gesucht werden Dateien mit der Endung .cs und .js. Wenn in beiden angegebenen Pfaden .cs Dateien zu finden sind, soll herausgeschrieben werden ..
- welche .cs Dateien nicht im Pfad 2, sind die aber im Pfad 1 sind
- welche .cs Dateien nicht im Pfad 1, sind die aber im Pfad 2 sind
Das Programm ist im Prinzip fertig, mein einziges Problem ist das herausschreiben der übrig gebliebenen Dateien.


Die Methode dazu habe ich auch schon angefangen, die Dateipfade werden abgespeichert in stringarrays.

Ich denke der Knackpunkt liegt ab csOne, und drunter, der obere teil des Programmes funktioniert einwandfrei.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
private void SearchFiles()
        {
            string[] fileListOnecs = Directory.GetFiles(chooseFolderOne.SelectedPath, "*.cs", SearchOption.AllDirectories);
            string[] fileListOnejs = Directory.GetFiles(chooseFolderOne.SelectedPath, "*.js", SearchOption.AllDirectories);
            string[] fileListTwocs = Directory.GetFiles(chooseFolderTwo.SelectedPath, "*.cs", SearchOption.AllDirectories);
            string[] fileListTwojs = Directory.GetFiles(chooseFolderTwo.SelectedPath, "*.js", SearchOption.AllDirectories);

            labelComparisonPathOnecs.Text = "Es wurden " + fileListOnecs.Length + " Dateien vom Typ .cs unter "
                + chooseFolderOne.SelectedPath + " gefunden";

            labelComparisonPathOnejs.Text = "Es wurden " + fileListOnejs.Length + " Dateien vom Typ .js unter "
                + chooseFolderOne.SelectedPath + " gefunden";

            labelComparisonPathTwocs.Text = "Es wurden " + fileListTwocs.Length + " Dateien vom Typ .cs unter "
                + chooseFolderTwo.SelectedPath + " gefunden";

            labelComparisonPathTwojs.Text = "Es wurden " + fileListTwojs.Length + " Dateien vom Typ .js unter "
                + chooseFolderTwo.SelectedPath + " gefunden";

            if (fileListOnecs == fileListTwocs && fileListOnejs == fileListTwojs)
            {
                labelComparisonListcs.Text = "Die Verzeichnisse sind identisch";
                labelComparisonListjs.Text = "Die Verzeichnisse sind identisch";
            }

            var csOne = fileListOnecs.Except(fileListTwocs);
            var csTwo = fileListTwocs.Except(fileListOnecs);

            var jsOne = fileListOnejs.Except(fileListTwojs);
            var jsTwo = fileListTwojs.Except(fileListOnejs);

            if (fileListOnecs != fileListTwocs)
            {
                labelComparisonListcs.Text = ".cs-Dateien die nicht in Pfad 2 enthalten sind: " + Environment.NewLine +
                    csOne + Environment.NewLine + ".cs-Dateien die in Pfad 2 existieren aber nicht in Pfad 1: " + csTwo;
            }

            if (fileListOnejs != fileListTwojs)
            {
                labelComparisonListjs.Text = ".js-Dateien die nicht in Pfad 2 enthalten sind: " + Environment.NewLine +
                    jsOne + Environment.NewLine + ".js-Dateien die in Pfad 2 existieren aber nicht in Pfad 1: " + jsTwo;
            }
        }


Über Antworten würde ich mich freuen :) Vielleicht bin ich als totaler CSharp Anfänger auch einfach zu dumm eine simple Rechnung durchzuführen .. ich weiß es nicht

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

27.10.2015, 14:53

Ist ganz nett, aber ehrlich... Für solche Operationen empfehle ich die dafür wirklich vorgesehenen Tools. Git diff (Tortoise bietet dafür sogar ein Kontext-Menü auf beliebigen Ordnern an), SVN diff oder diverse Merge-Tools. Die zeigen auch noch wesentlich mehr als nur die unterschiedlichen Dateien. Nämlich auch unterschiedliche Inhalte, falls beide Dateien in beiden Pfaden existieren.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

3

27.10.2015, 15:01

danke für deine Antwort, aber gibt es nicht eine Lösung zu diesem Code ? :( das es möglich ist das csOne etc so umzuschreiben das unten der richtige sinn herauskommt bzw das programm so erhalten bleibt ?

Edit:

Konnte es leider noch nicht selber ausprobieren aber mit kam grade der Gedanke das ganze etwas umzuschreiben.

Unter

C#-Quelltext

1
2
3
4
5
var csOne = fileListOnecs.Except(fileListTwocs);
            var csTwo = fileListTwocs.Except(fileListOnecs);

            var jsOne = fileListOnejs.Except(fileListTwojs);
            var jsTwo = fileListTwojs.Except(fileListOnejs);


würde dann stehen:

C#-Quelltext

1
2
3
4
5
if (fileListOnecs != fileListTwocs)
            {
        
 foreach (string s in csOne)
            labelComparisonListcs.Text = ".cs-Dateien die nicht in Pfad 2 enthalten sind: " + s;


und so weiter ..

würde es durch die foreach Schleife möglich sein die nicht-doppelten Dateien zu trennen und rauszuschreiben ?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Garzec« (27.10.2015, 15:20) aus folgendem Grund: Edit


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

27.10.2015, 15:34

Getrennt werden sie ja durch den Aufruf von Except(). Ich weiß daher jetzt nicht so genau, was Dir überhaupt fehlt. Wenn es Dir nur um Ausgabe geht, dafür wäre ein foreach wohl sicherlich sinnvoll.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

5

27.10.2015, 16:00

Da ich grade noch den Quellcode zur Hand habe lasse ich den hier erstmal so im Raum stehen und hoffe, dass wenn ich morgen früh reinschaue, jemand den hilfreichen Gedankenblitz hatte :D

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
namespace Filecomp
{
    public partial class FrmMain : Form
    {
        #region Konstruktoren

        /// ========================================================================================================================
        /// <summary>
        ///
        /// </summary>
        public FrmMain()
        {
            InitializeComponent();
        }

        #endregion Konstruktoren

        #region Interne Variablen

        /// ------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Erstellt Dateipfad 1
        /// </summary>
        private FolderBrowserDialog chooseFolderOne = new FolderBrowserDialog();
        /// ------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Erstellt Dateipfad 2
        /// </summary>
        private FolderBrowserDialog chooseFolderTwo = new FolderBrowserDialog();

        #endregion Interne Variablen

        #region Methoden

        /// ------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Zeigt den ausgewählten Dateipfad 1 an
        /// </summary>
        private void LabelOutputButtonOne()
        {
            labelOutputButtonOne.Text = "Ausgewähltes Verzeichnis für Dateipfad 1:" + Environment.NewLine + chooseFolderOne.SelectedPath;
        }

        /// ------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Zeigt den ausgewählten Dateipfad 2 an
        /// </summary>
        private void LabelOutputButtonTwo()
        {
            labelOutputButtonTwo.Text = "Ausgewähltes Verzeichnis für Dateipfad 2:" + Environment.NewLine + chooseFolderTwo.SelectedPath;
        }

        /// ------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Sucht nach Dateien mit der Endung .cs oder .js
        /// </summary>
        private void SearchFiles()
        {
            string[] fileListOnecs = Directory.GetFiles(chooseFolderOne.SelectedPath, "*.cs", SearchOption.AllDirectories);
            string[] fileListOnejs = Directory.GetFiles(chooseFolderOne.SelectedPath, "*.js", SearchOption.AllDirectories);
            string[] fileListTwocs = Directory.GetFiles(chooseFolderTwo.SelectedPath, "*.cs", SearchOption.AllDirectories);
            string[] fileListTwojs = Directory.GetFiles(chooseFolderTwo.SelectedPath, "*.js", SearchOption.AllDirectories);

            labelComparisonPathOnecs.Text = "Es wurden " + fileListOnecs.Length + " Dateien vom Typ .cs unter "
                + chooseFolderOne.SelectedPath + " gefunden";

            labelComparisonPathOnejs.Text = "Es wurden " + fileListOnejs.Length + " Dateien vom Typ .js unter "
                + chooseFolderOne.SelectedPath + " gefunden";

            labelComparisonPathTwocs.Text = "Es wurden " + fileListTwocs.Length + " Dateien vom Typ .cs unter "
                + chooseFolderTwo.SelectedPath + " gefunden";

            labelComparisonPathTwojs.Text = "Es wurden " + fileListTwojs.Length + " Dateien vom Typ .js unter "
                + chooseFolderTwo.SelectedPath + " gefunden";

            if (fileListOnecs == fileListTwocs && fileListOnejs == fileListTwojs)
            {
                labelComparisonListcsOne.Text = "Die Verzeichnisse sind identisch";
                labelComparisonListjsOne.Text = "Die Verzeichnisse sind identisch";
                labelComparisonListcsTwo.Text = "Die Verzeichnisse sind identisch";
                labelComparisonListjsTwo.Text = "Die Verzeichnisse sind identisch";
            }

            var csOne = fileListOnecs.Except(fileListTwocs);
            var csTwo = fileListTwocs.Except(fileListOnecs);

            var jsOne = fileListOnejs.Except(fileListTwojs);
            var jsTwo = fileListTwojs.Except(fileListOnejs);

            if (fileListOnecs != fileListTwocs)
            {
                foreach (string differenceFiles in csOne)
                {
                    labelComparisonListcsOne.Text = ".cs-Dateien die nicht in Pfad 2 enthalten sind: " + Environment.NewLine + differenceFiles;
                }

                foreach (string differenceFiles in csTwo)
                {
                    labelComparisonListcsTwo.Text = ".cs-Dateien die in Pfad 2 existieren aber nicht in Pfad 1: " + Environment.NewLine + differenceFiles;
                }
            }

            if (fileListOnejs != fileListTwojs)
            {
                foreach (string differenceFiles in jsOne)
                {
                    labelComparisonListjsOne.Text = ".js-Dateien die nicht in Pfad 2 enthalten sind: " + Environment.NewLine + differenceFiles;
                }

                foreach (string differenceFiles in jsTwo)
                {
                    labelComparisonListjsTwo.Text = ".js-Dateien die in Pfad 2 existieren aber nicht in Pfad 1: " + Environment.NewLine + differenceFiles;
                }
            }
        }

        #endregion Methoden

        #region Events

        /// ------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Öffnet Verzeichnisauswahl Dateipfad 1
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSelectPathOne_Click(object sender, EventArgs e)
        {
            if (chooseFolderOne.ShowDialog() == DialogResult.OK)
            {
                LabelOutputButtonOne();
            }
        }

        /// ------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Öffnet Verzeichnisauswahl Dateipfad 2
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSelectPathTwo_Click(object sender, EventArgs e)
        {
            if (chooseFolderTwo.ShowDialog() == DialogResult.OK)
            {
                LabelOutputButtonTwo();
            }
        }

        /// ------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// Beginnt mit der Suche nach Dateien mit der Endung .cs oder .js
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonStart_Click(object sender, EventArgs e)
        {
            SearchFiles();
        }

        #endregion Events
    }
}


Ich wünsche viel Spaß damit :)
Bitte nehmt mir "wirre" Bezeichnungen oder Strukturen oder Schreibweisen als Anfänger nicht so übel, ich beschäftige mich mit dem Programmieren erst seit zwei Wochen :P

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

27.10.2015, 16:05

Zeilen 90 und 103 tun vermutlich nicht ganz das, was Du erwartest. Sie sind immer ungleich, weil nicht die Inhalte, sondern die Referenzen verglichen werden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

7

28.10.2015, 08:22

Ich habe die If-Abfragen mal herausgenommen, stimmt ja was du sagst. Bei der Ausgabe zeigt er auch schon etwas an, nur stimmen tut es nicht ganz. Er listet zb nur 1 Datei auf, anstatt wirklich durchzugehen und alle fehlenden oder überschüssigen dateien aufzulisten.

Fehlt vielleicht noch etwas bei den foreach-Schleifen? Weil Zeile 90 und 103 umzuschreiben, also eine andere Bedingung zu stellen, da wüsste ich jetzt nicht was man da schreiben könnte




EDIT:

Das Programm erkennt die Unterschiede, listet aber in meinen Labels immer nur die letzte Datei auf. Angenommen man hat 3 Dateien a,b,c die auf .cs enden und im anderen Pfad 2 Dateien d,e die auf .js enden, so schreibt er nur auf : in pfad 2 gibt es kein c und in pfad 1 gibt es kein e

Da wird also etwas bei der foreach-Schleife fehlen denke ich ?(

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Garzec« (28.10.2015, 08:45)


8

28.10.2015, 08:44

In den jeweiligen Ausgabezeilen (94, 99, ..) überschreibst du in jedem Schleifendurchlauf den Label-Text. Somit wird natürlich nur das letzte Listenelement angezeigt. Da müsstest du die Listeneinträge an den Ausgabetext anhängen ( "+=" statt "=" wäre ein Stichwort).

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

9

28.10.2015, 08:51

Genau der gleiche Gedanke kam mir als ich das Edit geschrieben habe, vielen Dank :)

Damit ist mein Problem wohl gelöst, falls es jemanden interessiert eine Ausgabe sieht dann bei mir so aus :

C#-Quelltext

1
2
3
4
5
foreach (string differenceFiles in csOne)
            {
                labelComparisonListcsOne.Text += ".cs-Dateien die nicht in Pfad 2 enthalten sind: " + Environment.NewLine + differenceFiles
                    + Environment.NewLine;
            }


Dankeschön

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

10

28.10.2015, 10:52

Ich bins nochmal ...

habe den Code jetzt schlanker gemacht, es wird jetzt nur noch Pfad 1 als .cs Pfad ausgewählt und Pfad 2 als .js Pfad. Dadurch habe ich auch nur noch 2 Ausgaben die folgendes machen:
--------------------------------------------------
Dateien, die im .js Pfad fehlen:

...\Testordner 1\a.cs
...\Testordner 1\b.cs
...\Testordner 1\c.cs
...\Testordner 1\d.cs
...\Testordner 1\e.cs
....................


-----------------------------------------
Dateien, die im .cs Pfad fehlen:

...\Testordner 2\a.js
....\Testordner 2\b.js
.....\Testordner 2\h.js
................


usw. halt.

Da ja im Prinzip nur Dateien gesucht werden, die NICHT gleich sind, egal ob .cs oder .js, denke ich kann das Programm das noch nicht unterscheiden. a.cs und a.js soll nicht aufgelistet werden.

Zudem wäre es evtl. als Schönheitskorrektur gut den vorherigen Pfad "auszublenden" und nur die Datei auszugeben.

Ich hatte mir überlegt mit Linq den Substring - 3 abzuziehen, damit .cs und .js rausfallen. Nehme ich aber \\ als letzten Index um den Pfad auszublenden, so weiß er noch nicht das er vom allerletzten \\ im Pfad ausgehen soll.

Gibt es da auch einen Weg?

Sodass man z.B. folgenden Testordner 1 mit Dateien anlegt:

a.cs
b.cs
c.cs
d.cs

Testordner 2:

a.js
b.js
z.js

Auflisten soll das Programm dann das in Pfad 2 c und d nicht da sind und im Pfad 1 kein z ist. Das die Pfade und Dateitypen abgeschnitten werden und nur die Dateinamen verglichen werden.

Werbeanzeige