Entwickler-Ecke

Basistechnologien - Directory über Zufallszahl erstellen


Csharp-programmierer - Sa 14.05.16 22:18
Titel: Directory über Zufallszahl erstellen
Hallo,
ich generiere über die Klasse Random eine Zufallszahl, welche eine Austragsnummer darstellt, und nach dieser Zahl soll ein Directory erstellt werden.

Mein Ansatz:

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.


Delete - So 15.05.16 02:07

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - 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:


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.


Th69 - Di 24.05.16 16:55

Willst du nicht eher ein logisches Oder in deiner Bedingung haben?


Delete - Di 24.05.16 17:14

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - 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?


Ralf Jansen - 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 - 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.

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 - Fr 27.05.16 17:41

Zitat:
42514 --> DateTime.Now.Date.ToOADate().ToString();

Okay. Das habe ich ausprobiert:


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.


Ralf Jansen - 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 - 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?


Ralf Jansen - 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 - 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:


Ralf Jansen - 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.