Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Sa 14.05.16 22:18 
Hallo,
ich generiere über die Klasse Random eine Zufallszahl, welche eine Austragsnummer darstellt, und nach dieser Zahl soll ein Directory erstellt werden.

Mein Ansatz:
ausblenden 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:
if ((this.textBox1.Text != "") && (this.textBox3.Text != ""))
                {
                reset:
                    string _path = Path.Combine(Application.StartupPath, "Aufträge", GeneriereArtikelnummer());
                
                    if (!Directory.Exists(_path))
                    {
                        Directory.CreateDirectory(_path);
                        MessageBox.Show("Erfolg");
                    }
                    else
                    {
                        goto reset;
                    }
                }

private string GeneriereArtikelnummer()
        {
            //try
            //{
                Random random = new Random(90000000);
                return random.Next().ToString();
            //}
            //catch (Exception ex)
            //{ MessageBox.Show(ex.Message); return "00000000"; }
        }


Wenn GeneriereArtikelnummer() eine Zahl zurückgibt, die es schon gibt, soll der Vorgang ab reset nochmal ausgeführt werden. Wenn ich diese Funktion aber aufrufe, kommt der Fehler: System.IO.FileNotFoundException.
Ich rufe in dieser Methode aber keinen File auf, sondern prüfe lediglich, ob es schon ein Directory gibt. Also Fehler wird mir keine Zeile markiert, ich weiß also nicht, warum dieser Fehler auftritt.

Ich hoffe, ihr könnt mir hier weiterhelfen.
Mit freundlichen Grüßen,
Yannic M.

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 15.05.16 02:07 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Di 24.05.16 15:57 
Vielen Dank Frühlingsrolle. Das haut hin

Also wenn ich nun einen Auftrag hinzufüge, wird in dem Ordner, wo die .exe läuft, ein Unterordner, der den Namen der Zufallszahl hat, erstellt. In diesem Unterordner befinden sich dann noch weitere Dateien. Wenn ich nun einen Auftrag fertig bearbeitet habe, kann der Benutzer den Auftrag als erledigt markieren. Hierzu werden die Dateien aus dem Ordner "Aufträge" gelöscht, und auch der Unterordner. Dafür wird im anderen Ordner namens "Erledigte Aufträge" eine neue XML-Datei erzeugt, die die Artikelnummer als Namen hat.

Nun ist es sehr wichtig, dass weder im Ordner Aufträge als auch im Ordner Erledigte Aufträge ein Ordner/File eine Zufallszahl bekommt, die es schon gibt. Da sich sonst das ganze System "zusammenbricht" und im Ernstfall der Ruf der Firma meines Kumpels geschädigt wird, was für mich ein NoGo ist. Deswegen habe ich nun so etwas geschrieben:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
do
{
    _auftragsnummer = random.Next(100000900000000).ToString();
    _path = Path.Combine(Application.StartupPath, "Aufträge", _auftragsnummer);
while ((Directory.Exists(_path)) && (File.Exists(Path.Combine(Application.StartupPath, "Erledigte Aufträge", _auftragsnummer + ".xml"))));

Ist das so richtig, dass gar nichts eine Zufallsnummer bekommt, die es schon gibt?

Moderiert von user profile iconTh69: Codeformatierung überarbeitet.

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 24.05.16 16:55 
Willst du nicht eher ein logisches Oder in deiner Bedingung haben?
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 24.05.16 17:14 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Di 24.05.16 18:33 
Hm ja ok. Aber wenn die Firma an einem Tag 3 Aufträge beispielsweise bekommt, hat man mit DateTime.Now.Date.ToOADate().ToString(); dann nicht das Problem, dass es diese Zahl schon gibt?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 24.05.16 21:58 
Da kann man ja immer noch ein simple laufende Nummer dranhängen. Aber wo wir beim Thema sind;) Was soll der ganze Zufall bei der Sache? Warum sind deine Auftragsnummern nicht einfach laufende Nummern 1,2,3 u.s.w.?
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Mi 25.05.16 17:26 
Ich würde das System etwas anders aufbauen.
Ein Ordner "Aufträge" mit Unterordnern für jeden Auftrag.
Ein weiterer Ordner "aktuelle Aufträge".
Wird ein Auftrag angelegt, muss man nur das Verzeichnis "Aufträge" prüfen und das neue Verzeichnis dort anlegen.
Zusätzlich wird eine Verknüpfung zum neuen Verzeichnis im Verzeichnis "aktuelle Aufträge" angelegt.
Wird ein Auftrag abgeschlossen, wird nur die Verknüpfung gelöscht.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
|-Aufträge
|  |-00001
|  |-00002
|  |-00009
|  |-00010
|-aktuelle Aufträge
|  |-00009->
|  |-00010->

Alternativ könnte man alle Nummern der neuen Aufträge einfach in einer Datei im Ordner "Aufträge" speichern.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 27.05.16 17:41 
Zitat:
42514 --> DateTime.Now.Date.ToOADate().ToString();

Okay. Das habe ich ausprobiert:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
do
                    {
                        i++;
                        _auftragsnummer = DateTime.Now.Date.ToOADate().ToString() + i.ToString();
                        _path = Path.Combine(Application.StartupPath, "Aufträge", _auftragsnummer);
                    } while ((Directory.Exists(_path)) && (File.Exists(Path.Combine(Application.StartupPath, "Erledigte Aufträge", _auftragsnummer + ".xml"))));

Aber nun erstellt er eine Datei, auch wenn ein Ordner mit der selben Nummer schon vorhanden ist.

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 27.05.16 17:53 
Ich halte das Verfahren immer noch für merkwürdig aber wir vermuten im noch das du keine AND Bedingung sondern OR in deiner while Schleifen Bedingung willst.

Weiteres :
- Du scheinst Daten an dem Ort ablegen zu wollen an dem auch die Executable liegt. Das ist üblicherweise keine gute Idee. An dem Ort an dem man üblicherweise Programme ablegt/installiert hat ein normaler Benutzer keine Schreibrechte. Und da wo ein User seine Daten ablegen sollte sollte man üblicherweise keine Executable haben.
- Das Filesystem hat Grenzen ab dem es Probleme bekommt mit der Menge an Foldern/Dateien in einem Folder. Du solltest das überdenken wenn du anfängst tausende Ordner/Files in einem Ordner anzulegen.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 27.05.16 18:12 
Zitat:
- Du scheinst Daten an dem Ort ablegen zu wollen an dem auch die Executable liegt. Das ist üblicherweise keine gute Idee. An dem Ort an dem man üblicherweise Programme ablegt/installiert hat ein normaler Benutzer keine Schreibrechte. Und da wo ein User seine Daten ablegen sollte sollte man üblicherweise keine Executable haben.


Ich "liefere" das Programm in einem ZIP-Ordner. Beim Programmstart werden dann die einzelnen Unterordner erstellt und auch sämtliche andere Daten sind in dem ZIP-enthalten.

Zitat:
Das Filesystem hat Grenzen ab dem es Probleme bekommt mit der Menge an Foldern/Dateien in einem Folder. Du solltest das überdenken wenn du anfängst tausende Ordner/Files in einem Ordner anzulegen.


Was meinen Sie damit genau? Dass ich nicht zu viele Ordner/Files in einen Ordner hinzufügen kann?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 27.05.16 18:16 
Zitat:
Was meinen Sie damit genau? Dass ich nicht zu viele Ordner/Files in einen Ordner hinzufügen kann?


Könne schön. Man sollte das aber nicht tun. Dort wieder reinschauen wird problematisch. Der Zugriff wird langsam und das mal reinschauen mit dem File Explorer wird schwer bis ummöglich.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 27.05.16 18:36 
Ich finde auch, diese Lösung ist keine Musterlösung, also die ganzen Ordner zu erstellen. Da die Firma aber maximal um die 30 Aufträge (wenn überhaupt) gleichzeitig hat, denke ich, es sollte funktionieren, oder? Ist ein Auftrag bearbeitet, werden die XML-Daten in eine komplexere Klasse geschrieben und es kommt eine Xml-Datei heraus und der Ordner samt Dateien wird gelöscht.

Aber wenn die Lösung nicht gut ist, interessiert es mich, wie es die Profis machen :wink:

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 27.05.16 19:38 
Zitat:
Aber wenn die Lösung nicht gut ist, interessiert es mich, wie es die Profis machen :wink:


Man nimmt halt eine Datenbank. Da hattest du ja glaube ich schon nachgefragt.