Laden...
Avatar #avatar-1860.gif
der Marcel myCSharp.de - Member
Ingenieur-Studi Dresden Dabei seit 11.02.2006 564 Beiträge
Benutzerbeschreibung

Forenbeiträge von der Marcel Ingesamt 564 Beiträge

05.03.2006 - 23:35 Uhr

Na, der Link zum SourceCode springt einem auf der Seite aber förmlich ins Auge... 🙂 guck mal genau unter dem programmdownload

Gruß, der Marcel

05.03.2006 - 11:52 Uhr

Ja, ich werde die fertige Klasse hier reinstellen. Zurzeit merze ich noch Fehler aus bzw. feile an den Feinheiten.

der Marcel

EDIT: meine Komfortfunktionen:

in der Arbeitsvorbereitung:

--> (die Klasse habe ich für ein Backup-Tool geschrieben) sollte die Zieldatei schon existieren, wird sie optional (per File.Move 🙂 ) in einen Sicherungsordner geschoben, so dass auch bei ungewollte Abbrüchen (Stromausfall, Bluescreen...) die Backupdateien nicht gleich weg sein müssen
--> dabei wird überprüft, ob dafür genug Speicherplatz vorhanden ist, und diese
Option dynamisch abgeschalten

--> Ausgabe der aktuellen Dateien (ausser bei den kleinen, kostet zu viel Laufzeit)

--> Rekursion

--> Ausgabe der verstrichenen Zeit/kopierter Bytes zur Berechnung der Datenrate

--> Fortschrittsanzeige für jede einzelne große Datei

--> Fortschrittsanzeige für den Gesamtvorgang

--> Möglichkeit eines "weichen Abbruchs", bei dem Dateien zuende kopiert werden

--> Möglichkeit eines harten Abbruchs, der innerhalb der Datei abbricht

Selbstverständlich ist: kopiert werden

--> Inhalt
--> Dateiattribute, Erstellungszeit, Letzte Änderung
--> Verzeichnisattribute, Erstellungszeit...
--> noch selbstverständlicher: Datei- und Verzeichnisnamen
--> bei Rekursion: leere Verzeichnisse

05.03.2006 - 11:50 Uhr

Hi!

Würde sagen, der Thread gehört ins Rund ums Programmieren...

Zu Deiner Frage: wenn du ein Buch mit Übungen suchst, dann kann ich dir das hier empfehlen: http://www.amazon.de/exec/obidos/ASIN/3860635514/028-4242303-8044530?%5Fencoding=UTF8

Da sind solche Übungen und brauchbare Theorie-Erklärungen drin, die, wenn du mich fragst, das wichtigste sind und das, worauf du sicher nicht verzichten solltest.
Beim Programmieren ist es anders als in manch anderen Disziplinen. Um praktisch arbeiten zu können, musst du die Theroie dahinter ersteinmal verstehen. Sonst kann sehr viel schief gehen...

Auch dabei: eine 180-Tage-Testversion vom Visual Studio 2005 Professional, funktionsmäßig uneingeschränkt

Trotz dass ich die Übungen mit noch keinem Blick gewürdigt habe, hat sich der Kauf gelohnt (wenn man noch nichts vergleichbares besitzt)

der Marcel

05.03.2006 - 10:28 Uhr

Dankeschön!

Werd mir das mal genauer zur Gemüte führen!

der Marcel

05.03.2006 - 10:14 Uhr

Hi herbivore!

Danke dafür! Als ich vor diesem Thread auf der Suche nach Optimierungen für meinen Algorithmus war, war ich darauf gestoßen. Wollte aber ungern meine bisherige Arbeit gleich die Kippe runtergehen lassen und ersteinmal versuchen meinen (managed) Algorithmus ohne die API auf Vordermann zu bringen, was mir bisher gelungen zu sein scheint. Ich arbeite jetzt nur noch die Komfortfunktionen in den neuen Code ein.

Da es sich bei mir um Rekursion beim kopieren handeln kann, aber nicht muss, hatte ich meiner Klasse, welche Dateien aus einem Verzeichnis wegkopiert, erst eine Management-Methode verpasst und diese dann in einer abgeleiten Klasse überschrieben, um mit dem bisherigen Code die Rekursion zu ermöglichen (da mir if-Klauseln in dem Fall zu unübersichtlich erschienen).

Als Nachteile hatte ich mit euch festgestellt:
--> meine Kopierklasse hat sich für jedes Unterverzeichnis neu instanziiert
--> damit verbunden das Durchreichen der Event-Handler bis in meine GUI, was ja auch etwas Laufzeit kostet, wenn man sich im 5. Unterverzeichnis befindet
--> kleine Dateien wurden genauso behandelt wie große. Erst einlesen und dann gleich wieder schreiben, wobei man dann von der Zugriffszeit der Platte gebremst wird, wenn man viele davon hat

Jetzt erstelle ich, wenn rekursiv vorgegangen werden muss, erst eine komplette List<> an Datensätzen der zu durchlaufenden Kopiervorgänge (Quelldatei, Zieldatei, Dateigröße). Diese List<> nimmt sich die eigentliche Kopiermethode her und arbeitet sie ab. Kleine Dateien werden vor dem Kopieren aussortiert und auf eine neue List<> gesetzt.
Um eine Out-Of-Memory Exception zu vermeiden, schließe ich eine Methode an, welche sich von oben nach unten 10MB an kleinen Dateien von der Liste der kleinen Dateien nimmt und diese 10MB-Listen der Reihe nach an an die Methode übergibt, welche die komplette Liste in den Ram liest und dann auf Festplatte schreibt.

Wie gesagt läuft es jetzt zwei bis dreimal so schnell als vorher und 75MB an kleinen Dateien (750Stück) sind in 1-2 Sekunden kopiert gewesen.

Dabei hätte ich mal noch eine Frage: Ich habe jetzt wie selbstverstänlich eine foreach-Schleife eingebaut: Aber durchläuft foreach die Listen vom ersten zum letzten oder gibts da Eigenheiten? Sonst kriegen meine kleinen Dateien unter Umständen durcheinandergewürfelt... besser eine for-schleife?

Gruß, der Marcel

04.03.2006 - 18:39 Uhr

So Leute,

es gibt neues im Versuch an File.Copy ranzukommen.

Habe das FIFO Prinzip über MemoryStreams für kleine Dateien umgesetzt und bin in meinen Versuchen zwei- bis dreimal so schnell gewesen, so dass meine Klasse das Niveau von File.Copy erreicht hat! 🙂

Werd jetzt weiter dran feilen...

der marcel

04.03.2006 - 11:48 Uhr

Dieses Feld "ausführen in" (eigenschaften der verknüpfung) legt fest, was deinem programm mitgeteilt wird auf die Frage, in welchem Verzeichnis es ausgeführt wird. Steht da nichts drin, ist dieses verzeichnis das, indem sich die die verknüpfung befindet. Wenn dein Programm eine Datei XYZ.txt anlegt, dann landet auch die in diesem arbeitsverzeichnis!

Also muss dort der pfad zu deiner exe hin, wenn die datein eigentlich in deren verzeichnis landen sollen.

der marcel

04.03.2006 - 01:59 Uhr

hi!

ich weiß jetzt nich 100%ig bescheid, aber soviel ich weiß, ist ein Dataset eine Auflistung von DataTable-Objekten. Auflistungen (vrgl. Arrays) können ja vom Prinzip her unendlich groß sein.

Eine OutofMemoryException erzeugst du dann, wenn die im Arbeitsspeicher gehaltenen Daten so viel werden, dass du keinen freien Speicher mehr hast, den du nutzen kannst. Du solltest wohl daher darauf achten, den Speicher zwischendurch freizugeben und das DataSet zu verkleinern, ggf. einen Teil der Daten woanders hin verfrachten und dann im Arbeitsspeicher freigeben.

Von vorherein sollte sich ein einzelnes Programm wohl nicht die Freiheit herausnehmen, den gesamten Arbeitsspeicher für sich beanspruchen zu wollen, wenn das nicht zwingend notwendig ist.

der Marcel

04.03.2006 - 01:43 Uhr

Hi Sky!

der ersten Frage mit dem Installer, welcher ggf. das Framework nachinstalliert, schließe ich mich an!

zur zweiten Frage: Wenn ich mich nicht ganz irre, kannst du das bei Windows in den Verknüpfungseigenschaften festlegen (Ausführen in). Das Setup sollte also das Feld in der Verknfüfung sinnvoll beschreiben.

der Marcel

03.03.2006 - 19:12 Uhr

Wandle die ArrayList beim Serialisieren in ein Array, dann klappt das ganze.

public void serializeSave(ArrayList personen, string fileName)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Person[]));
            StreamWriter writer = File.CreateText("data.xml");

                serializer.Serialize(writer, personen.ToArray(typeof(Person)));
                writer.Close();
        }

entsprechend deserialisieren und über AddRange zur ArrayList hinzufügen.

Besser ist aber, wenn du eine variabel große Liste brauchst, List<> zu verwenden!

der Marcel

03.03.2006 - 18:31 Uhr

irgendwie seh ich keinen Fehler mehr....

03.03.2006 - 17:58 Uhr

Hey, das hab ich auch!

bis auf die seiten wo da steht, klicken sie bitte hier und dort hin und öffnen sie datei blabla.cs, stehen dort brauchbare Einführungen und Erklärungen zu dem Wichtigsten in C# drin. Besonders cool ist die 180-Tage-Testversion vom Visual Studio 2005 Professional, welche absolut unbeschränkt in ihren Funktionen ist.

03.03.2006 - 17:46 Uhr

Welches Buch hast du denn ausgewählt? vor leuter neugier? 🙂

03.03.2006 - 17:43 Uhr

Und deshalb hoffe ich, dass es dich nicht stört, wenn ich machmal noch meinen Senf dazu gebe.

Nein, dabei kann ich ja nur dazu lernen 😉

der Marcel

03.03.2006 - 17:34 Uhr

Das ist meine Klasse:

public class XYZ

diese hat folgende private Member:

private string _X, _Y , _Z;

da schreibe ich dann zum Beispiel als öffentlichen Default-Konstruktor:

public XYZ()
        {
            _X = String.Empty;
            _Y = String.Empty;
            _Z = String.Empty;
         }

Den Default-Konstruktor verwendest du, wenn du die Klasse instanziierst (danke herbivore 🙂 ). Nämlich so:

XYZ myXYZ = new XYZ();

Aber du solltest dir wirklich ein paar Grundlagen zu Klassen und OOP im allgemeinen anschauen.

der Marcel

EDIT: wenn du die klasse instanziierst und die privaten Member in der Instanz füllen möchtest, schreibst du dir einfach noch einen Konstruktor, der parameter enthält und dann alle Werte von Anfang an "sinnvoll" füllt.

03.03.2006 - 17:27 Uhr

Hi cs_newbie!

Soweit wie ich das sehe, müsste es daran liegen, dass der Deugger nichts meldet, weil du die Exceptions abgefangen hast und diese in der Kommandozeile landen (steht so in deinem catch-block)
Das hat beim Entwickeln natürlich den Nachteil, dass man beim Visual Studio die Hilfe und konkretere Aussagen, die der Debugger gibt, verpasst und man so vielleicht nur halb so klug ist.

der marcel

03.03.2006 - 16:39 Uhr

Dann sieht es so aus, als wenn in der ArrayList nichts drin steht, die du abspeicherst...

So sieht die XML-Datei aus, wenn sie leer ist!

der Marcel

03.03.2006 - 16:25 Uhr

Ok, noch verwechsel ich manche Begrifflichkeiten, was ich schon das zweite mal unter Beweis gestellt habe, besser ich schau das nächste mal selber nochmal explizit(g) nach, wenn ich was raushaue 8o 😁

Danke, herbivore!

03.03.2006 - 14:45 Uhr

Das ist eine implizite Konvertierung. Du sagst damit mehr oder weniger, dass das object halt eigentlich ein Array string[] sein soll.

Wenn du schnell zum Kiosk gehst und Dir die aktuelle Ausgabe der c't besorgst (Montag kommt die nächste Ausgabe), dann steht das dort auch alles beschrieben.

im guide to C# oder einem Buch stehen solche Sachen ebenfalls drin.

der Marcel

EDIT: Zu Spät 🙂

03.03.2006 - 14:31 Uhr

Wenn ich das jetzt richtig sehe, dann ist

regOutParams["sNames"]

eigentlich ein Array, aber allgemein bei dir als object gelandet.
Dann kannst Du mit

((string[])regHistoryUsers)

dein object als Array interpretieren und wie gewohnt darauf zugreifen.

der Marcel

03.03.2006 - 14:25 Uhr

Original von Kai.
Normalerweise bekommt man die Daten über nameDesObjekts[index]. Dann ggf. noch ein ToString() dran.

Das stimmt zudem ausserdem. Dann hab ich die Fragestellung etwas missverstanden...

der Marcel

03.03.2006 - 14:16 Uhr

Hi!

Von welchem Typ ist denn das Array regHistoryUsers ??? Ist es ein object[]-Array oder meintest du das mit den Objekten verallgemeinert, dass da Elemente drin sind?

Wie kommst du denn an die Daten im Array ran?

der Marcel

EDIT: Auf dem Bild sieht es so aus, als wären das, wenn es objects sind, einmal strings gewesen. Wenn das stimmt, wozu dann die Umwandlung in objects?

mit Objekten, die mal Strings waren, kann man

string objText = (string)[irgendein object]

ausführen und erhält wieder den String.

03.03.2006 - 14:09 Uhr

Danke für eure Vorschläge!!

Ich baue meine Klasse gerade grundlegend, wo eure Ratschläge mit einfließen. Melde mich in dem Thread bald wieder, wenn Ergebnisse vorliegen!

der Marcel

03.03.2006 - 11:52 Uhr

Hi herbivore!

Allerdings ist das Wort "ableiten" in diesem Zusammenhang gänzlich unangebracht.

Das hatte ich mir hinterher auch durch den Kopf gehen lassen. Vielen Dank für die fundierte Erklärung! Noch bin ich ein grober Anfänger 🙂

Gruß, der Marcel

03.03.2006 - 00:33 Uhr

wenn es mit "binäre Datei" darum geht, dass man die Datei mit keinem Text-Editor lesen kann, dann wäre wohl eine prakikable Variante, den FileStream zu verschlüsseln. So würden dir die Einfachheit der Serialisierung erhalten.

Der Ikaros hat Recht, jede Datei ist binär. Es kommt nur darauf an, welches Format (auch Encoding) der Ersteller der Datei verwendet hat, um daraus verwertbare Informationen zu gewinnen.

der Marcel

03.03.2006 - 00:11 Uhr

Hi CS_Newbie!

Ein Array definierst du so:

object[] obj = new object[Anzahl der Array-Elemente als int]

Das kannst du für jeden anderen Typ machen.
Sonst sollte Dir zum Einstieg der guide to C# (http://www.mycsharp.de/guide) weiterhelfen.
Arrays lassen sich einfach über Seralisierung in eine Datei schreiben und Lesen.
Suche einfach mal nach "XML" und "Serialisierung" und guck hier nach http://msdn2.microsoft.com/de-de/library/system.xml.serialization.xmlserializer.aspx

Sonst kann ich Dir für den Einstieg noch einschlägige Literatur über C# empfehlen (Microsoft Press, ...) und auch die aktuelle Einstiegsserie der c't kann dir weiterhelfen.

Gruß und schönen Abend

der Marcel

02.03.2006 - 23:53 Uhr

Bitte, bitte!

Allerdings muss ich etwas sagen, ohne Dir zu nahe treten zu wollen. Deine Fehler gerade eben waren von so grundsätzlicher Natur was objektorientierte Programmierung betrifft, dass ich Dir wirklich dazu rate ein gutes Buch (oder zumindest ein gutes Tutorial) zu lesen, denn die Grundlagen kann kein Forum schaffen, dies muss man selbst tun.

Ein guter Einstieg ist http://www.mycsharp.de/guide/ oder die aktuelle Einstiegsserie der c't zu C# oder eben ein Buch 🙂

Das soll dich aber nicht vom Fragenstellen abhalten!

Einen Gruß und schönen Abend wünscht

der Marcel

02.03.2006 - 23:17 Uhr

ok, alles klar.

Manchmal ist man aber auch wie vernagelt 🙂

du musst dir erst mal ein Objekt der Klasse ASCIIEncoding ableiten!

Das sieht dann so aus:

ASCIIEncoding ascii = new ASCIIEncoding();
ascii.GetBytes("infostring", 0, 10, sendBytes, 4);

Gruß, der Marcel

PS.: Das Ableiten einer Klasse ist das erstellen eines Objektverweises (um auf die Fehlermeldung einzugehen). Denn eine Klasse ist ein Verweistyp.

02.03.2006 - 23:14 Uhr

was streicht dir der Compiler denn genau an?

02.03.2006 - 22:48 Uhr

hi herbivore!

man versucht, seine bescheidenen Künste an den Mann zu bringen 🙂

Gruß, der Marcel

02.03.2006 - 22:40 Uhr

Hallo Creave!

ich habe deinen Aufruf von ASCIIEncoding.GetBytes mit MSDN verglichen und es scheint ales richtig zu sein.
Was mir aber beim Lesen deines Codes ausgefallen ist, solltest du vielleicht bei der Array-Erstellung die Größe des Arrays explizit mit angeben. Das würde dann so aussehen:

byte [] sendBytes = new byte[6];
                sendBytes[0] = 0xff;
                sendBytes[1] = 0xff;
                sendBytes[2] = 0xff;
                sendBytes[3] = 0xff;
                sendBytes[5] = 0x00;

Habe selber noch nicht damit gearbeitet, also bitte nicht so sehr übel nehmen, wenn ich daneben liege 🙂

Gruß, der Marcel

02.03.2006 - 21:42 Uhr

Werde morgen meine Klasse umkrempeln, die Puffergröße variieren und meine Ergebnisse hier posten. Bei der Puffergröße bin ich davon ausgegangen, dass die Größe des Schreibcaches der Platte eine entscheidende Rolle spielt. 1024 Byte waren auf jeden Fall zu klein, da man dann den Overhead des Schleifendurchlaufs deutlich zu spüren bekommt.

Gruß, der Marcel 🙂

02.03.2006 - 21:06 Uhr

Danke für die schnellen Antworten!

@ herbivore:

Danke für die Links. Diese hatte ich schon über die Suche gefunden. 🙂 Habe das Kopieren auch in einem eigenen Thread ausgelagert und versucht, die Puffergröße festplattengerecht zu gestalten, wobei ich bei 2MB angekommen war. Größer oder kleiner kostet nur noch Performance.
Wenn ich bei mir den ganzen Schnickschnack mit dem Senden von Statusinformationen und der Abbruchmöglichkeit mal wegnehme, ist File.Copy immernoch gut doppelt so schnell oder besser. Zudem erzeuge ich auch eine höhere CPU-Last als File.Copy, was ich mir im Prinzip gar nicht erklären kann, da ja die Festplattenzugriffe identisch sind. Das sollte ja ein Indiz dafür sein, dass ich noch optimieren muss... g

So nehme ich das prinzipielle Schreiben und Lesen vor: (SourceFile und DestinationFile sind FileStreams)

ReadBytes = SourceFile.Read(buffer, 0, buffer.Length);
DestinationFile.Write(buffer, 0, ReadBytes);

Die Dateien sind alle in einem String-Array gespeichert, welches mit foreach abgearbeitet wird.

@ikaros:

Das habe ich mir bei kleinen Dateien auch schon in etwa so gedacht, dass ich alle zu kleinen Dateien zu mehreren komplett einlese und dann in einem Rutsch wieder schreibe. Werde es morgen mal ausprobieren, da ich dazu die Klasse etwas umbauen muss. 🙂
Allerdings hat es File.Copy ohne diese Optimierung geschafft, um Längen besser zu sein 😕

EDIT: Nach jedem 2MB-Block schicke ich den aktuellen Prozentwert über ein Event an den GUI-Thread. Das Kopieren an sich läuft in einem eigenen Thread.

Gruß, der Marcel

02.03.2006 - 20:19 Uhr

Hi!

Ich habe mir eine eigene Klasse zum Kopieren von Dateien geschrieben, da ich während des Kopiervorganges zum einen Statusinformationen brauche und der Vorgang zum anderen eine Möglichkeit des Abbruchs vorsehen soll.
Beim Algorithmus zum Kopieren der Dateien lese ich die Dateien in Byte-Blöcken ein und schreibe diese entsprechend wieder. Bei Dateien, die kleiner als diese Blöckgröße (2MB) sind, wird mit kleinerer Blockgröße gearbeitet, welche der Dateigröße entspricht. Die Schleife habe ich mit do-while implementiert.

Jetzt bin ich drauf und dran, zu versuchen den Algorithmus performancemäßig zu optimieren. Gibt es Dinge aus eurer Erfahrung, die ich zur Steigerung der Performance machen oder lassen sollte?

Gruß, der Marcel 🙂

02.03.2006 - 10:36 Uhr

Hi marsgk!

Die Zeit war ja nur ein Beispiel, wie man das anwenden kann.
Bei stationären Vorgängen hat dies nichts mit der Zeit zu tun, das stimmt.
In den Ingenieur- und Naturwissenschaften, welche die Mathematik anwenden, ist es durchaus von Bedeutung etwas nicht nur über dem Raum, sondern auch über der Zeit zu betrachten, da man es in der Realität so gut wie immer mit instationärem Verhalten zu tun hat. Zur stationären (und einfacheren) Betrachtungsweise gelangt man meist nur über weitgehende Annahmen, die dann zu dem Schluss kommen, dass man den insationären Vorgang stationär betrachten darf, da man damit dann keinen größeren Fehler mehr macht.

Gruß, der Marcel

01.03.2006 - 23:26 Uhr

Freut mich, wenn ich helfen konnte!

Man muss sich nur einmal richtig vor Augen führen, was objektorientiertes Programmieren ausmacht. Wenn man das einmal richtig verstanden hat, ist man in der Lage sich durch MSDN zu wühlen 🙂

Gute Nacht!

Der Marcel

01.03.2006 - 23:13 Uhr

Hi Wazer!

Ich zeige Dir mal eine Methode aus meinem aktuellen Projekt, wobei eine generische Liste meiner eigenen Klasse (BackupData) serialisiert wird.
Die List<BackupData> Database ist bei mir für die gesamte Form deklariert (die Deklaration ist in der Methode also nicht zu sehen)

private void UpdateDBFile()
        {
            FileInfo DSFileInfo = new FileInfo("Database.xml");
            if (File.Exists("Database.xml"))
                DSFileInfo.Attributes = FileAttributes.Normal;
            XmlSerializer Serializer = new XmlSerializer(typeof(List<BackupData>));
            StreamWriter DBWrite = File.CreateText("Database.xml");
            Serializer.Serialize(DBWrite, Database);
            DBWrite.Close();
            if (File.Exists("Database.xml"))
                DSFileInfo.Attributes = FileAttributes.Hidden;
        }

Gruß, der Marcel 🙂

PS:Wünsche eine gute nacht g

01.03.2006 - 23:05 Uhr

Hi!

Ja, ein Array ist serialisierbar. Du kannst sogar generische Listen serialisieren, deren Handhabung sich etwas flexibler darstellt, da ein Array immer eine feste Anzahl von Elementen besitzt. Meist hat man beim Speichern von Daten aber eine Variable Menge an Klassen, die man da reinsteckt.

Gruß, der Marcel

01.03.2006 - 22:08 Uhr

Hi!

Also, ich hab noch nichts mit DirectX zu tun, kann dir aber eine mathematische Antwort darauf geben. 4D-Vektoren können dazu genommen werden, einfach nur 4 zusammengehörende zustandswerte zu speichern. Zum Beispiel würde es sinn machen einen dreidimensionalen Punkt (was dann schon die ersten 3 Komponenten wären) exakt über der zeit (als 4. Komponente) zu definieren. Das kann man sich dann räumlich nicht mehr vorstellen, aber möglich sind Vektoren und Matrizen mit unendlich hohen Dimensionen.

Gruß, der Marcel

01.03.2006 - 18:58 Uhr

Ich würde denken, über Google oder vom Hören/Sagen kommen die meisten Leute, die wirklich ein konkretes Problem haben, es hier beantwortet bekommen und dann dankbar wiederkommen und mitposten (so wie in meinem Fall) 😉

Gruß, der Marcel

01.03.2006 - 18:22 Uhr

Also ich hab mich auf die Express-Version der c't gestürzt.

Ziemlich schnell hatte ich spezielle Fragen an Google und dafür fand ich das Forum ideal 🙂

27.02.2006 - 17:43 Uhr

Hi!

Bin selber auch noch nicht solange dabei und habe mich vor kurzem ein bißchen zu Threads in C# schlau gemacht.
Von meinem Verständnis her würde ich meinen, dass BeginInvoke immer eines tut: Daten von einem Thread im Prinzip in einen anderen Thread schaufeln, wobei es der Methode egal ist welche Threads das nun sind.
Bei Control.BeginInvoke willst du ja auf das Control zugreifen, und das befindet sich für gewöhnlich im GUI-Thread...
Bitte berichtigen, wenn ich hier noch was falsch sehe! 🙂

MSDN-Online ist tatsächlich recht träge, was daran liegen dürfte, dass so viele Entwickler darauf zurückgreifen. 🙂 Ein "Aktualisieren" kenne ich nicht, da dies eine Unmenge an Daten umfassen würde (glaube mindestens 2GB), und die Informationen sowieso nur eine gewisse Halbwertszeit aufweisen, womit Aufwand und Nutzen in keiner vernünftigen Relation zueinander stehen.

Gruß, der Marcel

26.02.2006 - 11:07 Uhr

Hi Weyoun!

Du kannst auch erstmal die aktuellen Ausgaben der c't hinzunehmen. Da gibts zurzeit eine Einsteigerserie für C# mit Visual C# Express, wo dir grundsätzliche Sachen der OOP geklärt werden! Aktuell ist es Teil 2/5.

Viel Spaß! 🙂

Gruß, der Marcel

22.02.2006 - 22:38 Uhr

Stimmt, da muss ich mich herbivore anschließen. Da Du nicht in das Array schreibst, ist eine foreach-Schleife die beste Variante!

Gruß, der Marcel

22.02.2006 - 22:29 Uhr

Hi Dial!

Probier es mal mit folgenden Befehlen:

Path.GetFileName(files[counter]);
Path.GetFileNameWithoutExtension(files[counter]);

Die geben beide einen String zurück.

Benutz doch bei der Schleife eine For- statt einer While-Schleife, da ist das Hochzählen des counter von vornherein mit implementiert.

Viel Spaß! 🙂

Gruß, der Marcel

PS: Das Initialsieren von int counter NUR für die Schleife ist bei For auch enthalten. So gäbe es auch keine Probleme, wenn Du mehrere Schleifen hintereinander durchläufst...bei deiner Lösung müsstest Du counter erst vor jeder Schleife "resetten". --> Die Lösung ist meiner Meinung nach absolut unpraktisch und stellt einen potentiellen Fehlerherd dar 🙂

22.02.2006 - 21:39 Uhr

Hi!

Das geht so hier:

DateTime now = DateTime.Now;
            NewBackupOrderButton.Text = now.ToString("dd.MM.yyyy");

Viel Spaß! 🙂

Gruß, der Marcel

21.02.2006 - 20:12 Uhr

Kannst Du mir mal bitte erläutern, was du unter seiner session verstehst? Dann kann ich Dir vielleicht eine Antwort geben 🙂

der Marcel

21.02.2006 - 10:28 Uhr

Hi!

Habe wieder mal eine Frage, zu der die Forums-, Google und MSDN-Suche nichts ergeben hat.

Und zwar habe ich vor, mit meiner Anwendung nach einer bestimmten Datei zu suchen, die sich irgendwo auf irgeneinem Laufwerk in irgendeinem Unter(-Unter)-Verzeichnis befinden kann. Die Klasse, welche das Suchen ausführt, erwartet nur den Laufwerksbuchstaben und findet die Datei(en).

Nun würde ich das Ganze gerne so einbinden, dass ich mir alle logischen Laufwerke aufliste und diese dann den physischen Laufwerken zuordne. Als Beispiel: Platte 1: C:, D:, E:\ Platte 2: F:, G:, H:\

Damit habe ich dann vor, die Suche für Platte 1 und Platte 2 in einem jeweils eigenen Thread auszulagern, damit das parallel stattfinden kann.

Daher ist meine Frage, ob ich die Informationen "Platte 1" und "Platte 2" irgendwie herausbekommen kann oder ob das wirkllich nur über WMI geht?

Gruß, der Marcel

20.02.2006 - 18:26 Uhr

Hi herbivore und talla!

Nein, ich hatte nicht vor, die Listbox zu löschen, da sie als laufende Statusanzeige dient und bei meinen Sersuchen (erstmal) auch noch nicht wirklich sehr viel hineingeschrieben bekommt.

Habe eben herausgefunden, dass man EventHandler auch mehrmals hinzufügen kann 😁

Es lag tatsächlich daran, dass ich die Methode zum Schluss nicht mehr vom EventHandler getrennt habe. Somit hat sie beim 3 Durchgang auch 3 Mal die Werte eingetragen (3 mal das selbe Ereignis) 🙂

Arbeite mich noch neu ein, da kann so einen Fehler noch passieren 🙂

Vielen Dank für eure schnellen Antworten!!!

Gruß, der Marcel

20.02.2006 - 17:57 Uhr

Hi!

Habe mir ein Projekt erstellt, welches primär jetzt erstmal aus einem Verzeichnis alle Dateien in ein anderes kopieren soll. Da dieser Vorgang ja schon mal etwas Zeit in Anspruch nehmen kann, habe ich die Methode CopyAllFiles in einen Thread ausgelagert.
Sobald ich auf den Button "Kopieren" klicke wird der Thread mit der Methode CopyAllFiles gestartet und arbeitet. Die Methode liegt in einer DLL von mir und sendet über Events den Dateinamen der aktuell zu kopierenden Datei an eine ListBox status_list in meine GUI.
Beim ersten Durchlauf ist alles ok. Mache ich einen zweiten Durchlauf (auch mit anderen Dateien) direkt danach, werden die einzelnen Dateien doppelt in die ListBox eingetragen, beim dritten Durchgang dann 3 Mal und so weiter. Daher ist meine Frage, ob ich den Thread, nachdem CopyAllFiles fertig ist, beenden muss. Meine Versuche mit Thread.GetCurrentThread.Abort() lieferten ein unverändertes Ergebnis.
Die Forumssuche hat für mich leider auch nichts ergeben (zumindest nichts, was ich gefunden hätte 😉 )

Initialisiere den Thread folgendermaßen:

Thread Thread1 = new Thread(new ParameterizedThreadStart(Validation.CopyAllFiles));
            AskForFolder.ShowDialog();
            string rawpath = AskForFolder.SelectedPath + (char)215 + ReadDestinationDir("C:\\Dokumente und Einstellungen\\Marcel\\Desktop\\dongle.sec");
            Thread1.Start(rawpath);

Wenn jemand eine Ahnung hat, wo mein Problem liegen könnte, wäre ich wirkilich dankbar 🙂

Gruß, der Marcel