Laden...

Anmerkungen zu: Alles über Dateien

Erstellt von herbivore vor 18 Jahren Letzter Beitrag vor 18 Jahren 13.442 Views
herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 18 Jahren
Anmerkungen zu: Alles über Dateien

Abgetrennt von: [Tutorial] Alles über Dateien

Hallo SimonKnight6600,

das ist doch schon mal ein sehr netter Anfang.

Kommentare sind sehr erwünscht.

Ich sehe nicht wo bzw. wofür System.Windows.Forms benötigt wird. Du solltest die Verwendung und entsprechende Hinweise entfernen.

Ein Programm wird nicht objektorientierter dadurch, dass es imperativ im Konstruktor einer Klasse ausgeführt wird. Du solltest also statt


static void Main(string[] args)
{
   new Start();
}
public Start()
{
   SaveTelefonNumbers();
   Console.WriteLine("Programmende");
   Console.ReadLine();
}

besser


static void Main(string[] args)
{
   SaveTelefonNumbers();
   Console.WriteLine("Programmende");
   Console.ReadLine();
}

verwenden, zumal in einem Tutorium jede Zeile Overhead stört.

Ansonsten weiter so!

herbivore

S
709 Beiträge seit 2005
vor 18 Jahren

Danke für die Tipps 😄. Warum ich System.Windows.Forms eingebunden hab ist mir auch ein Rätsel 🤔. Aber ich habs entfernt. Und das mit dem Konstruktor, da gebe ich dir recht. Danke fürs Kommentar. Ich werde das Tutorial bald mal ein wenig vergrößern, da ich mit Xml immer besser zurecht komme 😉.
Gruß,
SimonKnight6600

// edit:

			
StreamWriter writer = File.CreateText(Application.StartupPath + "\\telefonnummern.txt"); // Datei erzeugen

Dafür brauch ich System.Windows.Forms 😉

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo SimonKnight,

auch wenn ich ein Freund der using-Direktive bin, würde ich in diesem Fall entweder System.Windows.Forms.Application schreiben oder für diese eine Klasse einen using-Alias definieren. Ein 'unsing System.Windows.Forms' in einer Konsolen-Anwendung finde ich - gerade für Anfänger - verwirrend.

BTW: Entweder ist es ein Designfehler Application nach System.Windows.Forms zu packen (wohin es wegen Run=MessageLoop aber wohl doch sollte), oder es ist ein Designfehler StartupPath u.ä. nach Application und nicht nach Environment zu packen. Jedenfalls ist StartupPath ja nichts System.Windows.Forms-Spezifisches.

herbivore

1.985 Beiträge seit 2004
vor 18 Jahren

Hallo ihr beiden,

könnte man statt Application.StartupPath nicht auch System.Environment.CurrentDirectory verwenden? Sollte doch das gleiche Ergebnis liefern oder übersehe ich da gerade etwas?

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Fabian,

in vielen Fällen wird da das gleiche sein, aber System.Environment.CurrentDirectory kann sich während der Laufzeit ändern, Application.StartupPath nicht. Außerdem kann System.Environment.CurrentDirectory schon beim Start einen anderen Pfad enthalten (z.B. wenn du in einer Verknüpfung ein abweichendes Arbeitsverzeichnis einträgst).

herbivore

1.985 Beiträge seit 2004
vor 18 Jahren

Original von herbivore
Hallo Fabian,

in vielen Fällen wird da das gleiche sein, aber System.Environment.CurrentDirectory kann sich während der Laufzeit ändern, Application.StartupPath nicht. Außerdem kann System.Environment.CurrentDirectory schon beim Start einen anderen Pfad enthalten (z.B. wenn du in einer Verknüpfung ein abweichendes Arbeitsverzeichnis einträgst).

herbivore

Hallo herbivore,

na klar, da habe ich nicht dran gedacht. Ändert sich System.Environment.CurrentDirectory nicht auch, wenn man einen Save/OpenFileDialog hat? Zumindest gibt es doch ein Property, um dieses Verhalten zu steuern oder?

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Fabian,

ja normalerweise ändert der ODF das CWD. Nach der Doku müsste FileDialog.RestoreDirectory die Eigenschaft sein, die du meinst:

Ruft einen Wert ab, der angibt, ob das Dialogfeld das vor dem Schließen aktuelle Verzeichnis wiederherstellt, oder legt diesen fest.

herbivore

1.985 Beiträge seit 2004
vor 18 Jahren

Original von herbivore
Hallo Fabian,

ja normalerweise ändert der ODF das CWD. Nach der Doku müsste FileDialog.RestoreDirectory die Eigenschaft sein, die du meinst:

Ruft einen Wert ab, der angibt, ob das Dialogfeld das vor dem Schließen aktuelle Verzeichnis wiederherstellt, oder legt diesen fest.
herbivore

Hallo herbivore,

jo genau die Eigenschaft hatte ich im Hinterkopf. Gut zu wissen das Ganze.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

S
709 Beiträge seit 2005
vor 18 Jahren

Ich habe früher auch immer Environment.CurrentDirectory statt Application.StartupPath benützt, bis es irgendwann Probleme bekam, da die Pfadangaben eben nicht stimmten.

Original von herbivore
auch wenn ich ein Freund der using-Direktive bin, würde ich in diesem Fall entweder System.Windows.Forms.Application schreiben oder für diese eine Klasse einen using-Alias definieren.

Wie, kann man auch nur eine einzige Klasse per using importieren?
Gruß,
SimonKnight6600

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo

Wie, kann man auch nur eine einzige Klasse per using importieren?

Du hast using nicht ganz verstanden 🙂

Aber ich glaub das geht jedem so, der aus einer C++ Welt kommt!

using ist NICHT "#import" und importiert hier Klassen!

Es ist eine Abkürzungsformel für Namespaces!

Du kannst auch überhauptkeine using-direktiven benutzen!

Dann musst Du aber ALLE! Typen komplett ausschreiben.

Z.B. so:

System.Int32 myInt = 15;

mit "using System;" kann man das abkürzen:

Int32 myInt=15;

Hoffe das war nun verständlich ausgedrückt, und nicht verwechseln 🙂

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo SimonKnight6600,

Wie, kann man auch nur eine einzige Klasse per using importieren?

Was das Importieren angeht, schließe ich mich norman_timo an, wobei man noch ergänzen kann, dass dem #include in C/C++ am ehesten die Compiler-Option /reference entspricht (da Assemblies ja selbsbeschreibend sind, sind sie quasi ihr eigenes Header-File).

Trotzdem kann man using für eine einzene Klasse benutzen. Ich nehme das z.B. gerne für Timer:

using FormsTimer = System.Windows.Forms.Timer;

Als Klassennamen im Code kann man dann den Aliasnamen FormsTimer verwenden.

herbivore

S
709 Beiträge seit 2005
vor 18 Jahren

Danke für die Antworten!
@norman_timo: Ich komme gar nicht von C++ her 😁
Das was du da über using beschrieben hast, ist mir schon klar. Ich kann zwar ein paar Grundlagen in C++, weiß aber weder was #include macht und was eine Headerdatei genau ist 😁

Ich hab bloß nicht kapiert was "einen using alias definieren" bedeutet.
Gruß,
Simon

PS:
@herbivore: Also könnte ich für Application folgendes schreiben:

using Application = System.Windows.Forms.Application;
herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo SimonKnight6600,

genau das kannst du schreiben.

herbivore

PS: #include, nicht #import. Das '#' steht hier allerdings nicht für 'Sharp' 🙂

S
709 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
PS: #include, nicht #import. Das '#' steht hier allerdings nicht für 'Sharp' 🙂

Danke, hab ich korrigiert. Das '#' steht ja dafür dass das irgendsoein spezieller 'Befehl' ist. (Der Ausdruck ist so kompliziert das er mir nicht ganz einfällt 😁 In C# gibts das ja auch(glaub ich)).

Was mich interresieren würde: Wie stark belasten using direktiven die performane eines Programms?
Gruß,
SimonKnight6600

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo SimonKnight6600,

gar nicht, sie beeinflussen, wenn überhaupt, die Performance des Compilers (unmerklich). Es sind wie norman_timo schon geschrieben hat, reine Schreiberleichterungen.

Das '#' alleine ist noch kein Befehl. Es leitet Präprozessor-Anweisungen ein. Einen (sehr abgespeckten) Präprozessor gibt es in C# in der Tat auch:


#define SW_TEST
// ...
#if SW_TEST
  // ... Test code ...
#endif

Jetzt sind wir aber schon ganz schön weit von Thread-Thema weg. Und das peinlicherweise in einem 'Artikel'.

herbivore

S
709 Beiträge seit 2005
vor 18 Jahren

Jo, vieleicht könnte ein Moderator die Posts in einen anderen Thread auslagern?

J
19 Beiträge seit 2005
vor 18 Jahren

kleine frage
was meinst du mit using alias definieren
jaf

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo JAF,

es gibt using in drei Geschmacksrichtungen, als Direktive, als Anweisung oder eben - wie hier zu sehen - als Alias:


using Application = System.Windows.Forms.Application;

herbivore

S
1 Beiträge seit 2005
vor 18 Jahren

hi,

kann man zur ermittlung des Anwendungsverzeichnis und Anwendungsdatei auch folgendes nutzen?

public static string ApplicationDir () {
			return EnsureTermBackslash (System.IO.Path.GetDirectoryName (ApplicationPath ()));
}

public static string ApplicationPath () {
			return System.Reflection.Assembly.GetCallingAssembly().GetName().CodeBase;
}
herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Shine,

ich denke es müsste GetEntryAssembly statt GetCallingAssembly sein, sonst würde ggf. der Pfad einer DLL (die ja ganz wo anderes liegen kann) und nicht der des EXE-Programms zurückgegeben werden.

Außerdem bekommt man die Url der Assembly (z.B. file:///C:/window/system32/notepad.exe) zurück und müsste von dieser also noch den letzen Teil abschneiden und in die normale Pfad Syntax konvertieren c:\windows\system32.

Aber ansonsten wäre das wohl ein möglicher Weg.

herbivore

L
113 Beiträge seit 2004
vor 18 Jahren

moin!
hab da mal eine frage.
ich hab eine text datei und dem user soll die möglichkeit gegeben werden einen neuen datensatz in diese einzufügen, der wiederum ans ende der datei geschrieben werden soll. wie geht das?

N
4.644 Beiträge seit 2004
vor 18 Jahren

Suchfunktion: datei öffnen und neue zeile mit text erstellen

Bitte im C# Forum posten, hier sollen Artikel gepostet und ggf. bewertet werden.