Laden...

Eigener kleiner Explorer: Pfad der aktuellen Datei ermitteln

Erstellt von gelöschtem Konto vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.195 Views
Gelöschter Account
vor 10 Jahren
Eigener kleiner Explorer: Pfad der aktuellen Datei ermitteln

Moin alle zusammen,

ich baue mir gerade einen kleinen 2D-Editor wo auch die ganzen Grundfunktionen schon funktionieren. Nun wollte ich im unteren Bereich einen kleinen Explorer, wie bei Unity wenn es jemand kennt, hinzufüge mit einer kleinen PictureBox in der die gerade ausgewählte Grafik angezeigt wird. Da ich bisher noch nicht so viel mit C# gemacht habe und den bisherigen Explorer nur anhand von Tutorials zusammengeschraubt habe stehe ich im Moment ein wenig auf dem Schlauch.

Ich habe ein treeView in dem die Ordnerstruktur angezeigt wird und durch das ich auch navigieren kann während in meiner listBox alle Daten im aktuellen Ordner aufgelistet werden. Nun möchte ich in der listBox ein Item anklicken können um dann in der PictureBox ein kleines Vorschaubild zu sehen.

Das ist mein bisheriger Code:


        protected override void OnLoad( EventArgs e )
        {
            TreeNode rootNode = new TreeNode("C:\\");
            treeView1.Nodes.Add(rootNode);
            addCildNotes(rootNode);
            treeView1.Nodes[0].Expand();
            base.OnLoad(e);
        }

        private void addCildNotes(TreeNode dirNode)
        {
            DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath);
            try
            {
                foreach (DirectoryInfo dirItem in dir.GetDirectories())
                {
                    TreeNode newNode = new TreeNode(dirItem.Name);
                    dirNode.Nodes.Add(newNode);
                    newNode.Nodes.Add("*");
                }
            }
            catch (UnauthorizedAccessException error)
            {
                MessageBox.Show(error.ToString());
            }
        }

        private void treeView1_BeforeExpand_1(object sender, TreeViewCancelEventArgs e)
        {
            if (e.Node.Nodes[0].Text == "*")
            {
                treeView1.BeginUpdate();
                e.Node.Nodes.Clear();
                addCildNotes(e.Node);
                treeView1.EndUpdate();
            }
        }

        private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
        {
            DirectoryInfo dir = new DirectoryInfo(e.Node.FullPath);
            listBox1.Items.Clear();
            listBox1.Items.AddRange(dir.GetFiles());
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            DirectoryInfo dir = new DirectoryInfo(e.Node.FullPath);
            listBox1.Items.Clear();
            listBox1.Items.AddRange(dir.GetFiles());
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Code um das Bild in der PictureBox anzuzeigen
        }

Eigentlich brauche ich ja nur den Datenpfad vom Bild aber ich habe keine Ahnung wie ich den bekomme.

Ich bedanke mich jetzt schon mal!

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo BlackArma,

du kennst doch TreeNode.FullPath und benutzt es schon. Das musst du nur aus dem aktuellen/selektieren TreeNode auslesen und mit Path.Combine mit dem Dateinamen zusammenfügen.

Bitte beachte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore

Gelöschter Account
vor 10 Jahren

Das hat mir schon mal weiter geholfen.

Inzwischen habe ich es so gemacht:
Ich habe ein Get() und Set() für die TreeNode in addChildNotes gemacht da ich ja dort bereits den Pfad habe wo ich mich gerade befinde.

Jetzt wollte ich es so machen das wenn ich nun ein Item in meiner listBox selektiere den Pfad mit meiner Funktion hole und diesen mit dem Namen des aktuell selektieren Items aus der listBox verknüpfe so wie du es vorgeschlagen hast. Doch irgendwie geht da noch etwas schief da ich einen Datenpfad erhalte den Bitmap nicht nimmt und ungefähr folgend aussieht: C:\\Bilder\Test_Bild.png . Ich nehme mal an das es an den beiden Backslashes die zu viel sind liegt aber ich weiß nicht wo die her kommen ^^

M
7 Beiträge seit 2012
vor 10 Jahren

Die 4 Backslashes sind nicht zuviel. So wird der Pfad nur angezeigt. Der effektive Werte beinhaltet nur 2 Backslashes. Diese gehören aber zu den "Sonderzeichen" welche in einem string im .Net mit vorangehendem Backslash als "normales" Zeichen interpretiert werden.
Es muss also etwas anderes sein, das verhindert, dass du an dein Bitmap kommst.

[...] Doch irgendwie geht da noch etwas schief[...]

Da musst du schon genauere Angaben machen.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo MatthiasDietschweiler,

Die 4 Backslashes sind nicht zuviel. So wird der Pfad nur angezeigt.

zumindest im Debugger. Wenn man den Pfad mit einer MessageBox (pfui) oder auf der Console ausgibt oder in eine Datei schreibt, dann werden nur soviele Backslashes angezeigt, wie im String tatsächlich enthalten sind.

Wenn weiter hinten im Pfad - wie angeben - tatsächlich nur ein Backslash steht, dann stehen vorne wohl wirklich vier.

Der effektive Werte beinhaltet nur 2 Backslashes

Wäre immer noch einer zuviel.

Diese gehören aber zu den "Sonderzeichen" welche in einem string im .Net mit vorangehendem Backslash als "normales" Zeichen interpretiert werden.

Nur in einem String-Literal, also einem String in Anführungszeichen im Quelltext. Dort interpretiert der Compiler (einmalig zur Übersetzungszeit) die Backslashes so, wie du geschrieben hast. Wir sprechen hier aber nicht über Literale, sondern über Strings, die zur Laufzeit erzeugt bzw. abgerufen werden. Da erfolgt keine solche Ersetzung.

Hallo BlackArma,

Da musst du schon genauere Angaben machen.

Dem will ich mit meiner Antwort allerdings nicht entgegen stehen (siehe [Hinweis] Wie poste ich richtig? Punkt 5), auch wenn ich schon eine Vermutung habe.

Hast du einen TreeNode (als Wurzel bzw. unter dem Knoten für das Laufwerk) im Baum, dessen Text nur aus einem Backslash besteht? Das würde dann den beschriebenen Effekt erzeugen. Der Windows Explorer hat keinen solchen Knoten. Lass ihn einfach weg.

Wenn es das nicht war, solltest du aufgrund der gegebenen Hinweise ermitteln, wieviele Backslashes denn nun tatsächlich enthalten sind. Allerdings denke ich auch, dass überflüssige Backslashes eigentlich ignoriert/übergangen werden sollten. Prüfe mal, ob sich die Datei tatsächlich da befindet, wo du sie vermutest.

herbivore

P
56 Beiträge seit 2013
vor 10 Jahren

ich kenn mich jetzt noch nicht so mit c# aus aber vllt geht das ja auch mit Directory.GetCurrentDirectory?
Hier der link
Directory.GetCurrentDirectory-Methode

In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo pikachu,

nur wenn man vorher das CurrentDirectory auf das gewünschte Verzeichnis gesetzt hat (und mit den Konsequenzen bei der Verwendung relative Pfade leben kann).

herbivore

Gelöschter Account
vor 10 Jahren

Hast du einen TreeNode (als Wurzel bzw. unter dem Knoten für das Laufwerk) im Baum, dessen Text nur aus einem Backslash besteht?

Nein, ich habe keine Wurzel im Baum die die aus Backslashes besteht, wenn ich mir den Pfad mit Path.Combine() zusammenführe und dann ausgeben lasse erscheint dieser in der richtigen Form, also nur mit zwei Backslashes nach dem C: .

Prüfe mal, ob sich die Datei tatsächlich da befindet, wo du sie vermutest.

Die Datei ist auch dort wo sie sein sollte, ich kann sie überall mit meine Explorer finden wo ich sie zuvor hinterlegt habe.

S
145 Beiträge seit 2013
vor 10 Jahren

Prüf mal was als PathSeparator in der TreeView angegeben ist.

Gelöschter Account
vor 10 Jahren

Prüf mal was als PathSeparator in der TreeView angegeben ist.

Der PathSeparator ist bei mir default, also der Backslash.

Langsam regt es mich ziemlich auf 🙁
Ich weiß einfach nicht wie ich das weg bekomme.