Laden...
S
seeker myCSharp.de - Member
Schüler Wien - Österreich Dabei seit 28.06.2008 37 Beiträge
Benutzerbeschreibung

Forenbeiträge von seeker Ingesamt 37 Beiträge

17.05.2010 - 19:58 Uhr

update: nachdem ich daten und darstellung getrennt hatte, funktioniert es jetzt endlich. mein erstes spiel übers netzwerk läuft, jetzt muss ich nur noch ein paar bugs beseitigen 😉

wenn es euch interessiert, die serialisierungs-prozeduren hab ich beibehalten, wie in mienem ersten post. ein paar der klassen, wie ich sie jetzt verwende:

[Serializable]
    class Vect2
    {
        public float X, Y;

        public static Vect2 Zero
        {
            get
            {
                return new Vect2(0f, 0f);
            }
        }

        public Vect2(float x, float y)
        {
            this.X = x;
            this.Y = y;
        }

        public Vector2 ToVector2()
        {
            return new Vector2(this.X, this.Y);
        }

        // overload operator +
        public static Vect2 operator +(Vect2 a, Vect2 b)
        {
            return new Vect2(a.X + b.X, a.Y + b.Y); 
        }
    }

[Serializable]
    class Block
    {
        public Vect2 Position;
        //public Texture2D BlockTexture;
        public int TextureID;
        public Vect2 Size;
        public Color BlockColor;
        public int LiveTime;

        public Block()
        {

        }
    }

statt dem Texture2D objekt, verwende ich jetzt eben nur den integer wert. dafür hab ich in meinem spiel folgendes array:

Texture2D[] TextureTable;

        private void FillTextureTable()
        {
            TextureTable = new Texture2D[2];
            TextureTable[0] = Content.Load<Texture2D>("namea");
            TextureTable[1] = Content.Load<Texture2D>("nameb");
        }

danke nochmal für die hilfe

17.05.2010 - 17:08 Uhr

hmm ok..

ich wusste nicht, dass ich auf eine so strikte trennung von daten und darstellung achten muss, jetzt weiß ichs

danke, lg

17.05.2010 - 16:44 Uhr

ok, wenn ich das jetzt richtig verstehe, einfach nur zwei floats für den vector beispielsweise, keinen ganzen vector gleich?

Das wird zwar dann einiges an programmieraufwand, aber da führt anscheinend nichts vorbei..

danke jedenfalls

17.05.2010 - 16:32 Uhr

das mit dem vektor wäre wirklich einfach, man müsste nur zwei float werte übertragen. wie ich allerdings eine textur übertrage hab ihc keine ahnung..

ich könnte allerdings nur so eine art "ID" der ressource auch übertragen, da ich sowieso client und server in einer anwendung habe, brauche ich die ressource dafür sowieso.

mein ziel: einfach gewisse informationen für ein spiel übers netzwerk übertragen. zb nen vector für die spielerpositionen, usw.

17.05.2010 - 16:17 Uhr

wenn du objekte übertagen möchtest, welche als nciht serialisierbar gekennzeichnet sind (bzw nciht die serialsierbar kennzeichnung tragen), musst du customized serialisation verwenden und die benötigten informationen in die serialsierungs info klassen schreiben.

hi, also ich hab mal msdn befragt und meine Message-Klasse dahingehend verändert, dass ich jetzt eine (glaube ich) customized serialization habe:

[Serializable]
    class Message : ISerializable 
    {
        public object Data;
        public string ID;

        public Message()
        {

        }

        protected Message(SerializationInfo info, StreamingContext context)
        {
            ID = info.GetString("b");
            //Wie bekomme ich hier das Data objekt wieder?
        }

        [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]

        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("a", Data);
            info.AddValue("b", ID);
        }
    }

das problem ist, dass es eine info.GetObject methode oder in der art nicht gibt. Anscheinend kann ich das nicht so allgemein schreiben.

Meistens übertrage ich eigene klassen in Data bzw. Lists (List<Klasse>) von eigenen Klassen. Wenn ich jetzt jede einzelne "Daten-"Klasse auch mit diesen customized serialization schreiben müsste, würde das auch nicht gehen weil ich zum Beispiel gewisse Klassen vom XNA-Framework wie Vector2 oder Texture2D ebenfalls nicht über info.Get bekommen könnte (um nicht die exception zu bekommen, dass jeweilige Klassen nicht serialisierbar wären).

ist dann serialisierung überhaupt möglich für diese ansprüche, oder müsste ich mir ein komplett neues konzept überlegen?

danke, LG Martin

16.05.2010 - 20:11 Uhr

hi leute,

ich habe ein gewisses problem beim schicken von serialisierten klassen übers netzwerk. meine "basisklasse" hab ich einfach mit [Serializable] gekennzeichnet und soweit funktioniert es gut, allerdings hat diese objekte gespeichert vom xna-framework, zum beispiel die klasse Vector2D.

immer wenn ich jetzt serialisieren möchte, bekomme ich die fehlermeldung dass diese klasse nicht serialisierbar sei. habt ihr eine idee, wie ich das lösen/umgehen könnte?

ich hab schon die suchfunktion im forum verwendet, aber keine ähnlichen probleme gefunden, solltet ihr das thema schon einmal behandelt haben.

hier noch der code, wie ich zb. serialisiere:

BinaryFormatter b = new BinaryFormatter();
b.Serialize(stream, msg);
stream.Flush();

msg ist in diesem fall meine eigene klasse (name: Message), stream einfach der netzwerkstream im prinzip.

entserialisieren läuft bei mir so:

BinaryFormatter b = new BinaryFormatter();
if (stream.CanRead)
{
      msg = (Message)b.Deserialize(stream);
}

ich hab auch schon probiert die serialisierung umzuschreiben, hab aber dann exat die selbe fehlermeldung bekommen. ich hoffe, ihr könnt mir helfen.

LG Martin

20.07.2009 - 08:50 Uhr

hi,

ich hab versucht im web etwas über wmp gemeinsam mit dde zu finden, jedoch ohne erfolg.

macht es vielleicht sinn, das ganze über APIs zu steuern?

19.07.2009 - 20:07 Uhr

hi, erstmal danke für deine antwort.

ich hab mir das mal ein bisschen genauer angeschaut, anscheinend ist das wirklich nur windows media-player, der das unterstützt.

mit einer schleife hab ich es bis jetzt gelöst, dass geht aber eben mit wmp nicht.

und mit den arguments auch nicht. aber anscheinend müsste man sich dafür genauer mit wmp beschäftigen...

19.07.2009 - 19:40 Uhr

hi leute

jeder von euch kennt das sicherlich, wenn man im dateiexplorer von windows zb mehrere mp3-lieder markiert und dann öffnet, werden diese "gemeinsam" wiedergegeben. genauso wie bei word-dokumenten, wo jedes einzel geöffnet wird. meine frage ist jetzt, wie ich das auch realisieren kann.

bis jetzt hab ich es so probiert:

private void RunAppForFiles(string filename, string additional_args)
        {
            if (filename != string.Empty)
            {
                System.Diagnostics.Process proc = new System.Diagnostics.Process();
                //proc.EnableRaisingEvents = false;
                proc.StartInfo.FileName = filename;
                if (additional_args != string.Empty)
                {
                    proc.StartInfo.Arguments = additional_args;
                }
                try
                {
                    proc.Start();
                }
                catch (Exception ex)
                {
                    //irgendeine fehlerbehandlung
                }
            }
        }

den string additional_args befülle ich dann mit den weiteren liedern zum beispiel, alle durch ein "\n" zum beispiel getrennt. es funktioniert so nicht und ich habe eigentlich keine ahnung, wie ich da mehrere auf einmal öffnen kann.

danke schon im voraus, lg seeker

14.04.2009 - 19:58 Uhr

ich hab ja oben bereits geschrieben: wenn ich einmal bilder angezeigt habe und dann beide imagelists (also klein und groß) auf null setze, lässt er noch immer den rand.

09.04.2009 - 17:51 Uhr

genau das verwende ich ja gerade. wenn dort aber einmal eben die imagelists drinnen sind, bekommt man sie nicht mehr raus 😉

09.04.2009 - 16:54 Uhr

also bei den verschiedenen view-eigenschaften hab ich keine veränderung festgestellt. er hat immer platz für bilder gelassen.

08.04.2009 - 12:32 Uhr

naja ich würde gern diesen rand für die bilder weghaben. wenn ich nie eine imagelist dem listview zuweise, dann lässt er auch keinen rand. wenn ich einmal bilder angezeigt habe und dann beide imagelists (also klein und groß) auf null setze, lässt er noch immer den rand.

soll ich vielleicht das control neu erstellen?

08.04.2009 - 09:41 Uhr

hi, danke für eure antworten.

ich hab es jetzt geschafft, mir ist nicht aufgefallen dass es doch auch mit der SHFILEINFO methode funktioniert. war gestern schon etwas spät 😉

habt ihr auch eine idee zu meinem zweiten problem? dass wenn es einmal eine imagelist in listview gegeben hat er immer den platz lässt für bilder, auch wenn diese leer sind?

07.04.2009 - 23:58 Uhr

hi leute, ich bin nicht der erste sicherlich, der diese frage stellt aber in google oder hier findet man nicht die lösung dazu, oder ich zumindest nicht.

wie kann man von Ordnern das Icon dazu bekommen? (also wie es im explorer angezeigt wird).

ich hab schon einiges ausprobiert:

Icon ic = System.Drawing.Icon.ExtractAssociatedIcon(@"C:\WINDOWS");

oder das "umständliche" über den SHGetFileInfo Aufruf.

Leider funktionieren alle diese Varianten nur bei Dateien und nicht bei Ordner.

nebenbei hab ich auch noch eine zweite blöde frage, beim ListView steuerelemnt kann man ja eine kleine oder große imagelist hinzufügen. wenn man jetzt eine kleine imagelist hat und ansicht auf detail, dann werden die icons schön angezeigt. will man aber jetzt "umschalten" auf keine Icons, kann ich das irgendwie nicht. die imagelist einfach auf null setzen geht zwar, aber lässt dann noch immer platz für bilder. kann ich ihm das irgendwie abgewöhnen?

20.01.2009 - 16:06 Uhr

hmm, da merkt man wiedermal wie man sich nicht auskennt, wenn man so oft stimmt nicht hört 😉

jedenfalls VIELEN, VIELEN Dank für den Code!

ich hab zwar lang jetzt gebraucht, bis ich ihn zum laufen gebracht hab, jetzt funktioniert er aber!!!!

(kleine anmerkung noch: ich hab nur die datei hinzugefügt und hab dann noch einen verweis auf System.Core.Dll erstellen müssen)

20.01.2009 - 08:03 Uhr

hi leute, danke für eure zahlreichen antworten.

das war etwas salop formuliert, natürlich hab ich nicht das gesamte projekt hinzugefügt, sondern nur die CrossThread.cs Datei.

Weiters ist ziemlich sicher das Laden des Forms nciht sehr aufwändig, geht also meiner meinung nach sicherlich nicht länger als 1/10 sekunde (laut FAQ), ein oder zwei Bilder sind dabei.

ich würde es ja gerne so umändern, dass das form aus dem gui-thread selber ausgerufen wird, aber ich weiß nicht wie ich das machen soll, weil die netzwerkklasse ein event feuert aus dem heraus das form generiert werden soll.

da diese klasse sich in einen anderen projekt befindet (also nach dem kompilieren in einer eigenen DLL), befindet sie sich auch in einem anderen Thread, als das GUI.

Danke nochmal See Sharp für dein codebeispiel, wenn ich wieder zuhause bin werd ich den code sofort ausprobieren, ob ich das auf mein projekt adaptieren kann 😉

19.01.2009 - 20:21 Uhr

hi See Sharp, erstmal danke für deinen Post

ich hab mir dieses projekt mal runtergeladen und meiner mappe hinzugefügt. allerdings ist mir noch einiges unklar.

ich hab jetzt mal das erstellen des forms im netzwerkinterface auf einen neuen void aufgeteilt:

void ChatwindowInitializer(User activator)
        {
            Chatwindow cw = new Chatwindow(activator);
            cw.FormClosing += new System.Windows.Forms.FormClosingEventHandler(cw_FormClosing);
            cw.Show();
            this.openConversations.Add(activator.ScreenName, cw);
        }

aufrufen möchte ich es so:

CrossThread.RunGui(ChatwindowInitializer, activator);

fehler: die klasse benötigt nämlich anscheinend als zweitens eine Methode, und kein Argument (in dem Fall eine Klasse)

ich muss ja wahrscheinlich auch noch irgendwo in der CrossThread klasse definieren, auf welches fenster synchronisiert werden soll, oder?

19.01.2009 - 19:49 Uhr

hi leute,

ich weiß dass diese frage sicherlich schon hundertmal aufgetreten ist und ihc hab mir auch schon das [FAQ] Warum blockiert mein GUI? dazu durchgelesen von herbivore.

genau der letzte punkt, den er aufgeführt hat betrifft mein problem, nämlich:

Nur ein GUI-Thread

Alle Fenster sollten/müssen immer aus dem GUI-Thread erzeugt werden. Das Erzeugen von Fenster und Controls sollte nicht/nie in extra Thread verlagert werden. Wenn man das tut, kann das - so paradox das klingt - ebenfalls zum Blockieren des neue erzeugten Fensters und zu anderen Problemen führen. Ein Prozess sollte also insgesamt nur einen GUI-Thread haben, um diese Probleme zu vermeiden.

Ich habe ein Projekt in Projektmappe die so in der Art das Interface zur Netzwerkschicht und damit zu anderen Computern darstellt. immer wenn jetzt eine neue nachricht kommt und noch nicht ein dazugehöriges fenster offen, soll er dieses öffnen. das form wird einfach per folgenden code geladen:

Chatwindow cw = new Chatwindow(msg.Sender);
                cw.FormClosing += new System.Windows.Forms.FormClosingEventHandler(cw_FormClosing);
                cw.Show();

alleine ausprobiert (im selben Thread wie die Haupt-GUI sag ich mal) funktinoiert der Code so einwandfrei, nur eben nicht wenn es aus einen anderem thread heraus kommt.

was kann man dagegen tun? ich hab hier so komische ideen wie zum beispiel den GUI thread mit der Kommunikationsschicht zu invoken, ich weiß aber nicht ob das überhaupt einen sinn ergibt, falls das geht.

hoffentlihc könnt ihr mir helfen, ich verbringe jetzt schon so viel zeit damit^^

lg

26.12.2008 - 20:40 Uhr

ok die sache hat sich erledigt! der fehler lag woanders, alles funktioniert einwandfrei jetzt!

danke für deine hilfe, JAck30lena.

das Serialisieren funktioniert super!

23.12.2008 - 21:23 Uhr

ich bin jetzt endlich soweit, dass ich den code mal testen kann.

die verbindung kann zwar erfolgreich aufgebaut werden, doch aus irgendeinem grund bekommt der server keine nachricht, bzw. verarbeitet nichts. (im moment arbeite ich nur mit 127.0.0.1).

so sende ich:

private void Write(MessageBase ms)
        {
            try
            {
                BinaryFormatter b = new BinaryFormatter();
                b.Serialize(ns, ms);
                ns.Flush();
            }
            catch (Exception ex)
            {
                RaiseErrorEvent(ex.Message);
            }
        }

fehlermeldung oder so bekomm ihc keine, "reingebuggt" hab ich auch schon und die daten überprüft.

der server erhält die nachricht so:

NetworkStream ns = client.GetStream();
            BinaryReader br = new BinaryReader(ns);
            bool finish = false;
            do
            {
                if (ns.CanRead)
                {
                    BinaryFormatter b = new BinaryFormatter();
                    MessageBase basems = (MessageBase)b.Deserialize(ns);
                    //weiterer code

in der zeile "MessageBase basems = (MessageBase)b.Deserialize(ns);" bleibt er dann "hängen" und macht nicht mehr weiter. somit kommen glaube ich auch keine weiteren daten an und der server verarbeitet sie nicht, der client bekommt aber auch keinen fehler.
ich schätz mal, der fehler liegt hier wo im deserialize oder?

kleiner edit: beim connecten zum server sende ich ja noch keine daten mit, dass heißt es gibt noch kein serialisiertes messagebase objekt. kann das daran liegen?

22.12.2008 - 10:26 Uhr

hi, vielen dank für deine hilfe.

ich hab das jetzt so ähnlich realisiert wie du gesagt hast, nur weiß ich nicht ganz beim serialisieren wie ich dann wieder auf die abgeleitete klasse komme, deshalb hab ihc mir einfach so geholfen, indem ich nur eine klasse habe die dann nachricht oder file beinhaltet (eines von beiden ist dann einfach null):

public enum Type
    {
        NetMessage = 0,
        NetFile = 1,
    }

public class MessageBase
    {
        private Type type;

        public Type MessageType
        {
            get { return type; }
            set { type = value; }
        }
//noch weitere Properties
}

nach dem DeSerialisieren beim Empfangen prüfe ich einfach, ob Type == NetMessage ist zb.

eine Frage hätte ich allerdings noch ob das so stimmt, weil ich jetzt noch nicht testen kann. schreiben in den netzwerkstream tue ich so:

MessageBase ms = new MessageBase();
ms.MessageType = Type.NetMessage;
ms.Message = message;
ms.Flag = flag;
BinaryFormatter b = new BinaryFormatter();
b.Serialize(ns, ms);
ns.Flush();

(wobei ns mein NetworkStream ist).

stimmt das soweit?

lg

21.12.2008 - 13:01 Uhr

Hi Leute,

folgendes Problem. ich bekomme von einem Client zweierlei Daten, entweder strings oder Dateien, eben bytearrays. mein Problem ist nun, wie differenziere ich nun zwischen den beiden ohne eine neue verbindung aufzubauen. außerdem brauche ich auch den Dateiname.

mein bisheriger Code:

byte[] recs = new byte[32767];
                    recs = br.ReadBytes(recs.Length);
                    string very = System.Text.Encoding.ASCII.GetString(recs);
                    if (very.StartsWith("F"))
                    {
                        //F = File
                        very = very.Substring(1);
                        string filename = very.Substring(0, very.IndexOf('|'));

                    }
                    else if (very.StartsWith("M"))
                    {
                        //M = Message
                        string tmp = very.Substring(1);
                        //Nachricht wird weiter verarbeitet
}

eine nachricht, dass diese eine datei ist würde dann so in der art aussehen: "FC:\test.txt|"+ByteArray

ist der denkansatz richtig? bzw. wie kann ich dann anhand der nachricht aus dem "hauptarray" recs den ersten Teil der Nachricht "abschneiden" und den Rest als Datei dann abspeichern?

ich hab mir das so ungefähr überlegt:

using (FileStream fs = File.Create(filename)) 
                        {
                            fs.Write(recs, 0, recs.Length);
                        }

statt 0 könnte man ja dann vielleicht die länge (des Bytearrays) vom Teil nehmen, der die Identifizierung (F oder M) beinhaltet plus die länge (ebenfalls des Bytearrays) vom filename oder?

hoffentlich könnt ihr mir helfen 😉

lg

04.12.2008 - 16:47 Uhr

hi leute,

ich möchte ein kleines "überwachungsprogramm" schreiben, das heißt unter anderem herausfinden welche dateien immer geöffnet werden.
soweit so gut, also hab ich eine kleine klasse geschrieben, welche für jedes laufwerk einen filesystemwatcher ladet. das problem ist nur, dass alle möglichen programme (z.b. msn messenger) oder auch windows die ntuser.dat.log andauernd öffnen. somit hab ich eine "datenflut" von informationen die ich gar nicht benötige, eigentlich interessieren mich nur für bestimmte programme wie word oder notepad.

ist es möglich, anhand von den prozessen oder sonst irgendwie herauszufinden, welche dateien gerade geöffnet sind?

mfg seeker

09.11.2008 - 18:52 Uhr

das einzige was sonst noch dazu angeben, ist ein dns-server für die namensauflösung im lan. mehr nicht. hmm naja schade, dass das nicht geht aber trotzdem danke.

mfg SeekeR

08.11.2008 - 21:33 Uhr

hi burning snow,

danke für deine antwort. die hauptfunktionen von dhcp kannte ich eh bereits, sie sind auch sehr nützlich. ich dachte, dass bei uns in der schule über das tftp protokoll irgendwie läuft, aber ein domänen-logon-script hört sich viel wahrscheinlicher an.

wir wollen das nämlich für eine lan-party organisieren, da ist ein dhcp-server natürlich viel einfacher als jede ip statisch zu vergeben. ein script, der in einem webbrowser eine url ladet wäre auch toll, ist das auch möglich zu realisieren bei verbindung mit dem netzwerk ohne eine domäne zu erstellen? weil das wäre ja sonst ein noch höherer verwaltungsaufwand mit einer eigenen domäne..

mfg

08.11.2008 - 14:47 Uhr

Hi Leute,

Auf Wikipedia steht, dass ein DHCP-Paket vom Server unter anderem auch ein File "anhängen" bzw. definieren kann. steht so dort:
file (128 Byte, optional): Name einer Datei (z. B. System-Kernel), welche vom Server per TFTP an den Client gesendet werden soll

kurz nachgesehen, tftp ist eine vereinfachte version von ftp. Jetzt meine Frage:

Mit Windows Server 2003 kann man ja bequem einen DHCP Server erstellen, kann man dann eben auch ein File zur automatischen Dateiübertragen angeben? Wenn ja, wie denn weil ich find dazu einfach nichts auf google.
Kann man diese Datei dann auch direkt ausführen lassen? weil wenn ich mich zb bei uns in der schule anmelde, also per dhcp bekomm ich die ip, dann startet sich auch ein script der netzlaufwerke verbindet und den standardbrowser mit einer bestimmten uri startet. ich möchte eigentlich genau das selbe erreichen, nur netzlaufwerke brauch ich nicht unbedingt dabei.

Blöde Frage, aber kann man mit C# selber Pakete schreiben, also die genaue Datenstruktur? ich würde dazu einfach einen networkstream erstellen, und dann ein byte-array welches ich dann versende oder? weil dann könnte man einen simplen DHCP Server selber schreiben.

hoffentlich könnt ihr mir helfen,

mfg SeekeR

29.10.2008 - 10:35 Uhr

danke für die aufklärung über assembly. jetzt ist alles klar 😉

es bleibt eben alles in einem winform.

wenn ich wieder zuhause bin kann ich das mit den bereinigen probieren, wie gesagt wenn ich den obj ordner lösche funktioniert es wieder, beim 2ten mal aber dann wieder nicht. dann muss ich wieder den ordner neu löschen.

das problem ist ja nur beim debuggen vorhanden, ich kann mich jetzt nicht ganz genau erinnern aber ich glaub das problem bestand auch wenn man den debug ordner gelöscht hat..

mfg

28.10.2008 - 19:31 Uhr

ich weiß jetzt nicht genau was du mit assembly meinst, aber mit der program.cs wird der konstruktor in form1.cs gestartet.
wenn ich mit F6 einen build ausführe, dann hab ich die kompillierte exe ja im release ordner, diese funktioniert einwandfrei (so hab ich dann auch weiterentwickelt, nur ohne debuggen ist das langweilig ab einer zeit ^^)

edit: kurz in wikipedia geschaut, ich trau mich wetten, ich bleibe in einer assembly 😉

mfg

28.10.2008 - 18:28 Uhr

Hi Leute,

folgendes Problem: wenn ich per F5 debuggen möchte, dann nimmt er mir nach einer gewissen zeit nciht den aktuellen code, sondern irgendeine "ältere" version.
wenn ich dann den obj-ordner im projektverzeichnis lösche, funktioniert es wieder.

hat jemand eine ahnung, woran das liegen könnte?

mfg Seeker

24.09.2008 - 20:41 Uhr

danke für die antwort, ich habe mir schon gedacht, dass es etwas so was einfaches ist.

vielleicht hab ich es auch auf MSDN übersehen, bei den vielen code, danke jedenfalls.

LG SeekeR

24.09.2008 - 17:59 Uhr

Hi Leute,

sorry für diese Frage aber ich finde im Internet nicht wirklich etwas dazu, auch auf MSDN nicht. Ich möchte ganz einfach bei einem Listbox-Item den Text angeben, wenn ich den Index des Items als Integer hab.

Mein Versuch:

listBox1.Items[number].Text = "Test";

das funktioniert nicht, man findet ja genug Code für das eben ausgewählte Item, aber ich habe eben "nur" den Index.

Wahrscheinlich ist es ganz einfach, ich seh nur den Wald vor lauter Bäumen nicht 😉

danke schon im voraus,

LG SeekeR

02.09.2008 - 19:38 Uhr

danke für eure antworten, das hat zwar jetzt vom befehl her funktioniert, aber jetzt habe ich neue probleme, zwar nur logische aber die zu finden könnte dauern 😉

danke jedenfalls

02.09.2008 - 19:13 Uhr

Hi Leute, ich lösche vor allem Dateien und manchmal auch Ordner, und bei den Ordner bekomm ich dann immer folgende Fehlermeldung: der Ordner ist nicht leer. Ist eigentlich auch logisch, weil er ja mit den Subdirectories immer der Reihe nach vorgeht und nicht mit dem "hintesten" anfängt. Hier hab ich mal folgenden Code:

foreach (Deleteinfo di in filestodelete)
            {
                Console.WriteLine("Lösche Datei: " + di.filepath);
                try
                {
                    string newfilepath = to_path + @"DELETED\" + di.filepath.Replace(to_path, "");
                    DirectoryInfo df = new DirectoryInfo(di.filepath);
                    if (df.Exists)
                    {
                        df = new DirectoryInfo(newfilepath);
                        if(df.Exists)
                        {
                            df.Delete();
                        }
                        Directory.Move(di.filepath, newfilepath);
                    }
                    else
                    {
                        if (File.Exists(newfilepath))
                        {
                            File.Delete(newfilepath);
                        }
                        FileInfo fi = new FileInfo(newfilepath);
                        if (!Directory.Exists(fi.DirectoryName))
                        {
                            Directory.CreateDirectory(fi.DirectoryName);
                        }
                        File.Move(di.filepath, newfilepath);
                    }
                }
                catch (Exception ex)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Fehler: " + ex.Message);
                    Console.ResetColor();
                }
            }
            Console.WriteLine("Fertig mit Löschen. Insgesamt: " + filestodelete.Count + " Datei(en).");
            // Completet: List can be cleared
            filestodelete.Clear();

Ich weiß hier gibt es jetzt unter umständen vielleicht ein paar Codeteile die eine erklärung bedürfen, allerdings hätte ich eine Frage, die das ganze Thema schnell aus der Welt schaffen könnte; Ist es möglich einen Ordner zu löschen (in diesem Fall mit move) wo er einfach ignoriert, ob dieser Ordner noch einen Inhalt hat?

Ansonsten vielleicht grob die erklärung: das ganze ist ein Schulsicherungsprogramm, dass einen Ordner mit einen anderen vergleicht (in dem Fall ein Netzlaufwerk). Ich weiß es gibt sicherlich genug programme die diese funktion ebenfalls erfüllen, aber ich wollte mir halt selber eines schreiben.

in dem string to_path steht der Zielordner drinnen, der die Kopie ist, der string from_path beinhaltet den string des Quellordners, von dem die Kopie erstellt wird.

filestodelete ist einfach eine collection an strings mit den pfaden, welche gelöscht werden sollen. Achja und DELETED als Ordner im Sicherungspfad ist einfach ein Ordner, in denen Dateien hineinkopiert werden die im vorrigen Ordner gelöscht wurden.

ich hoffe ihr könnt mir helfen, mfg

SeekeR

24.07.2008 - 18:40 Uhr

hmm ok ich hab es jetzt geschafft dass es ohne exception mal läuft^^

das problem lag daran, dass der performance counter nicht die mac-adresse als angabe brauchte sondern den namen der netzwerkverbindung.

mit folgendem code bekomme ich mal immerhin daten:

static string adress, sKatName, sInstName, sCountName, auslastung;
    static float networkspeed;
    static PerformanceCounter Perfc;

        static void Main(string[] args)
        {
            
            
            foreach (NetworkInterface ointerface in NetworkInterface.GetAllNetworkInterfaces())
            {
                adress = ointerface.Description;
                if (!adress.Contains("TCP") && ointerface.OperationalStatus == OperationalStatus.Up)
                {
                    networkspeed = ointerface.Speed;
                    Console.WriteLine("Netzwerkkartenname: " + adress + ", Status: " + ointerface.OperationalStatus.ToString());
                    i++;
                }
            }
            if (i > 1)
            {
                Console.WriteLine("Dieses Progamm ist nicht für mehr als eine Netzwerkkarte ausgelegt.");
                Console.WriteLine("Drücken Sie eine beliebige Taste um zu Beenden.");
                Console.ReadLine();
            }
            else if (i <= 0)
            {
                Console.WriteLine("Es wurde keine aktive Netzwerkverbindung gefunden.");
                Console.WriteLine("Drücken Sie eine beliebige Taste um zu Beenden.");
                Console.ReadLine();
            }
            else
            {
                Console.WriteLine(i + " Netzwerkkarte(n) gefunden.");
                Console.WriteLine("Lade Diagnostic - Objekte.");
                sKatName = "Netzwerkschnittstelle";
                sCountName = "Empfangene Bytes/s";
                sInstName = adress;
                Perfc = new PerformanceCounter(sKatName, sCountName, sInstName);
                Timer tm = new Timer();
                tm.Interval = 1000;
                tm.Elapsed += new ElapsedEventHandler(tm_Elapsed);
                tm.Start();
                Console.WriteLine("Timer gestartet.");
                Console.ReadLine();
            }
        }

        static void tm_Elapsed(object sender, ElapsedEventArgs e)
        {
            float usage = Perfc.NextValue();
            float percent;
            percent = usage / (networkspeed / 100);
            Console.WriteLine(percent + " %");
            Console.ReadLine();
        }
    }

die netzwerkauslastung liegt laut diesem programm meistens bei 0 %, wenn ich dann über das netzlaufwerk etwas kopiere steigt sie auf 0,000799 oder so, und nie höher. wenn ich das mit dem taskmanager vergleiche liegt die netzwerkauslastung dabei bei 13% ungefähr.

Woran kann das liegen?

mfg SeekeR

24.07.2008 - 08:33 Uhr

zuerst einmal danke für deine antwort, auf msdn war ich zwar, hab aber nicht speziell nach der NextValue methode gesucht.

dort steht: Die Instanz ist keinem Leistungsindikator ordnungsgemäß zugeordnet.

Wie darf ich das verstehen? Dieser Performance Counter hat keine Bezugsqulle, mit der arbeiten kann blöd gesagt?

dann ist hier bereits der fehler im aufruf:

Perfc = new PerformanceCounter(sKatName, sCountName, sInstName);

anbei noch etwas: auf dieser seite hab ich mir ein bisschen etwas durchgelesen (http://www.microsoft.com/germany/msdn/coding4fun/magazin/artikel/LetzteSteckdoseVorDerAutobahn.mspx) und da hat einer das problem mit der netzwerkschnittstelle gehabt, dass statt [] Klammern, () Klammern zurückgegeben wurden und deshalb der performance counter die netzwerkkarte nicht finden konnte.

LG SeekeR

23.07.2008 - 20:31 Uhr

Hi Leute,

Ich möchte ein kleines Administrations-Tool schreiben, wo ich unter anderem die Netzwerkauslastung auslesen muss. Ich hab im Internet einen VB Code dazu gefunden den ich übersetzt hab in C#. Ich entwickle in Visual Studio 2005 mit .NET Framework 2.0. Um eine Prozentuelle Auslastung zu berechnen verwende ich einen PerformanceCounter.

Hier der Code wo die Exception kommt (InvalidOperationException):

auslastung = Perfc.NextValue().ToString();

hier der restliche Code:

static string macadress, sKatName, sInstName, sCountName, auslastung;
        static PerformanceCounter Perfc;
        static int testint;

        static void Main(string[] args)
        {
                //vorangehender Code
                sKatName = "Netzwerkschnittstelle";
                sCountName = "Empfangene Bytes/s";
                sInstName = macadress;
                Perfc = new PerformanceCounter(sKatName, sCountName, sInstName);
                Timer tm = new Timer();
                tm.Interval = 1000;
                tm.Elapsed += new ElapsedEventHandler(tm_Elapsed);
                tm.Start();
                Console.WriteLine("Timer gestartet.");
                Console.ReadLine();
        }

        static void tm_Elapsed(object sender, ElapsedEventArgs e)
        {
            auslastung = Perfc.NextValue().ToString();
        }

kleine anmerkung: die mac-adresse lass ich vorher schon bestimmen, das funktioniert einwandfrei. Ich bin leider ncoh ein anfänger im programmieren und bin erst vor kurzem von vb auf c# umgestiegen.

hoffentlich könnt ihr mir helfen,

LG SeekeR