C# 2 Fragen (Listview & DirectoryInfo)

logiz4

Cadet 3rd Year
Registriert
Sep. 2008
Beiträge
46
Ich arbeite Gerade an einem Projekt um eine Playlist für Winamp herstellen zu können, das ganze wird über Touchscreen gesteuert. Hier erstmal der Code:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;



namespace FileBrowser
{
    public partial class FileLister : UserControl
    {
        public FileLister()
        {
            InitializeComponent();
            PopulateTreeView();
            listView1.Columns.Add("Datei", 450);
            listView1.Columns.Add("Path");
            listView2.Columns.Add("Datei", 450);
            listView2.Columns.Add("Path");
        }       

        private void PopulateTreeView()
        {
            TreeNode rootNode;

            DirectoryInfo info = new DirectoryInfo(@"C:\"); // Hier gibts einen Fehler
            if (info.Exists)
            {
                rootNode = new TreeNode(info.Name);
                rootNode.Tag = info;
                GetDirectories(info.GetDirectories(), rootNode);
                treeView1.Nodes.Add(rootNode);
            }
        }

        private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
        {
            TreeNode aNode;
            DirectoryInfo[] subSubDirs;
            foreach (DirectoryInfo subDir in subDirs)
            {
                aNode = new TreeNode(subDir.Name, 0, 0);
                aNode.Tag = subDir;
                aNode.ImageKey = "folder";
                subSubDirs = subDir.GetDirectories();
                if (subSubDirs.Length != 0)
                {
                    GetDirectories(subSubDirs, aNode);
                }
                nodeToAddTo.Nodes.Add(aNode);
            }
        }

        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            int i=0;
            string[] seachfor = { "*.mp3", "*.flac", "*.wma", "*.wav", "*.ogg", "*.aac", "*.vbl", "*.cda", "*.nsa", "*.asf", "*.m3u", "*.m3u8", "*.pls", "*.b4s", "*wpl", "*.asx", "*."};
            TreeNode newSelected = e.Node;
            DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;
            listView1.Items.Clear();
            listView1.Columns.Clear();

            while (i != seachfor.Length)
            {
                foreach (FileInfo file in nodeDirInfo.GetFiles(seachfor[i]))
                {
                    string[] filepath = { file.Name, file.FullName };
                    ListViewItem item1 = new ListViewItem(filepath);
                    this.listView1.Items.AddRange(new ListViewItem[] { item1 });
                }
                i++;
            }
            listView1.Columns.Add("Datei", 450);
            listView1.Columns.Add("Path");
        }

        private void AddFilesButton_Click(object sender, EventArgs e)
        {

        }

        private void ClearFilesButton_Click(object sender, EventArgs e)
        {

        }
    }
}

1. Wenn ich beim DirectoryInfo den Pfad mit C:/ angebe, kommt bei mir eine Exeption das ich auf den Pfad nicht zugreifen kann/darf. Wie kann ich das beheben, habe VS 2010?

2. Dann zu meiner Listview ich will die mit einer Checkbock oder einfach nur markierten Einträge von beiden Colums/Spalten in eine 2 Listview übertragen. Wie geht das? Hab schon in bei google angefragt aber das Orakel konnte mir nicht helfen und hier im Forum hab ich auch nichts gefunden.:(

Danke im Vorraus

logiz4
 
zu 1. :

hab grad kein vs hier, aber ich vermute stark es hat was mit / zu tun... probier mal "C:\" aus oder escape das zeichen

oder poste mal auch den genauen fehler damit auch andere sich dazu äußern können
 
Zu 1: Wenn du das Programm ohne Admin-Rechte laufen lässt darfst du wahrscheinlich nicht direkt auf C:\ zugreifen. Probier mal ob der Fehler auch kommt wenn du das Programm mit Rechtsklick -> Als Administrator ausführen ausführst.

Zu 2.: Kopieren geht nicht. Du musst über eine Schleife neue ListViewItems erstellen.

Zum Beispiel so

Code:
foreach (ListViewItem lvi in listview1.SelectedItems)
{
     ListViewItem newlvi = new ListViewItem();
     newlvi.Text = lvi.Text;
     foreach (ListViewItem.ListViewSubItem lvisub in lvi.subitems)
    {
        newlvi.subitems.add(lvisub.text);
    }
    listview2.items.add(newlvi);
}

Der Code ist aus demm Kopf und ohne Berücksichtigung der Groß-/Kleinschreibung hingepfuscht.
Es sollte aber klar sein worum es geht.
 
Zuletzt bearbeitet:
Ab Vista hat ein normaler User keine Zugriffsrechte mehr auf C:
 
Also hier mal die Exeption:
System.UnauthorizedAccessException wurde nicht behandelt.
Message=Der Zugriff auf den Pfad "C:\Documents and Settings\" wurde verweigert. ... Hier kommt noch en Haufen anderes zeug...

hab das Prg auch schon im Admin-Mode laufen aber des will nicht. Ich hab das per Manifest geregelt (siehe hier). hat aber leider nicht hingehauen.
Ergänzung ()

MacGyver schrieb:
Zu 1: Wenn du das Programm ohne Admin-Rechte laufen lässt darfst du wahrscheinlich nicht direkt auf C:\ zugreifen. Probier mal ob der Fehler auch kommt wenn du das Programm mit Rechtsklick -> Als Administrator ausführen ausführst.

Zu 2.: Kopieren geht nicht. Du musst über eine Schleife neue ListViewItems erstellen.

Zum Beispiel so

Code:
foreach (ListViewItem lvi in listview1.SelectedItems)
{
     ListViewItem newlvi = new ListViewItem();
     newlvi.Text = lvi.Text;
     foreach (ListViewItem.ListViewSubItem lvisub in lvi.subitems)
    {
        newlvi.subitems.add(lvisub.text);
    }
    listview2.items.add(newlvi);
}

Der Code ist aus demm Kopf und ohne Berücksichtigung der Groß-/Kleinschreibung hingepfuscht.
Es sollte aber klar sein worum es geht.

:o Hat fast alles geklapt :o blos des hat mir irgendwie nur den Dateinamen also nur eine Spalte der zwei ausgelesen und in beide Spalten eingelesen. Wie geht das das ich auch die 2. Spalte einlese? mit [] ? Und wenn ioch mir dann die Playlist speichern will wie mache ich das das ich alle Items von der 2. Spalte einlese?
 
Habs mal selbst kurz ausprobiert und nen kleinen Denkfehler gefunden.
So sollte es gehen:

Code:
 foreach (ListViewItem lvi in listView1.SelectedItems)
            {
                ListViewItem newlvi = new ListViewItem();
                newlvi.Text = lvi.Text;
                for (int i=1;i<lvi.SubItems.Count;i++)
                {
                    newlvi.SubItems.Add(lvi.SubItems[i].Text);
                }
                listView2.Items.Add(newlvi);
            }

EDIT 1:

Bei der Exception könnte dir aufgefallen sein, dass in der Exception selbst "C:\Documents and Settings" steht und nicht "c:\", wie in deinem Parameter wo der Fehler anscheinend auftritt (erster Post).

Daher glaube ich dass der Fehler ganz woanders auftritt, der Debugger aber ganz woanders stehen bleibt.

Es gibt jetzt 2 Möglichkeiten. Entweder hat dein Programm dank UAC keinen Zugriff auf c:\Documents and Settings oder das Programm stört sich daran dass es sich um einen Hardlink handelt. Eigentlich liegen die Benutzerprofile nämlich in c:\Users.

EDIT 2:

Es ist Möglichkeit 2 ;)

So gehts:

Code:
 try
                {
                    subSubDirs = subDir.GetDirectories();
                    if (subSubDirs.Length != 0)
                    {
                        GetDirectories(subSubDirs);
                    }
                }
                catch { }
[CODE]
 
Zuletzt bearbeitet:
Danke MacGyver für die Hilfe jetzt blick ich des auch mal...

Ich hab des jetzt einfach so gemacht das ich mit einen FolderBrowserDialog genommen hab da kann ich mir den Ordner einfach aussuchen. Das ganze in eine try-catch rein und es gibt die Fehlermeldung :"In diesem Pfad haben sie nichts zu suchen" oder so änlich, die Standart Exeption halt.

Jetzt müsst ich nurnoch wissen wie ich das ganze in eine Playlist speichern kann...
google ich komme :).
Dann wärer auch diese Hürde genommen um mein eigenens Car-Pc-Programm fertigzustellen.:D
Wenns fertig ist stell ich das ganze mal Hier in Forum.

thx noch an Alle

logiz4
 
Inne Datei schreiben ist recht einfach. Kannste Byteweise oder Zeilenweise machen.

So etwa:

Code:
FileStream fs = new FileStream("Dateiname.ext",FileMode.Create);
StreamWriter sw = new StreamWriter(fs);

sw.WriteLine("Das was du schreiben willst");

Man kann auch die StringBuilder-Klasse verwenden, dort alle Ausgaben reinschreiben und dann
mit

System.IO.File.WriteAllText("Dateiname.ext", strbu.ToString());

alles wegschreiben.

Wenn du den StreamWriter weglässt kannste auch direkt über FileStream schreiben, aber eben nur Byteweise.
 
Hatte das selbe Problem aber mit der try catch anweisung gehts
 
Zuletzt bearbeitet:
Zurück
Oben