Frage von jundo324, 105

wie überspringe ich in cSharp bei einer Suche DAteien auf die ich keinen Zugriff habe?

Hi ich möchte per Button in einer Listbox alle Dateien im Laufwerk C angezeigt haben (wirklich alle also auch Unterordner). Mein Code sieht so aus:

private void button1_Click(object sender, EventArgs e)
        {

        try
            {
             
                listBox1.Items.Add(Directory.GetFiles(@"C:\", " * ", SearchOption.AllDirectories));
            }

                       
            catch (Exception ex)
            {
                listBox1.Items.Add(ex.Message);
            }

    }

allerdings sucht er zuerst in %recycle .... also in Dateien/Ordnern wo man keinen Zugriff hat. Wie kann ich sagen er soll diese überspringen oder zumindest nachdem er gemerkt hat er hat keinen Zugriff, trotzdem nach weiteren Dateien/Ordnern suchen?

Antwort
von DARKDacil, 46

Guten morgen, probier es mal mit einer for Schleife wo du Datei für Datei einzeln hinzufügst. Jeder listadd kommt in einen try. Du musst dann nur eine Funktion erstellen die einen Ordner durchsucht, dann alle files zurück gibt und danach die Unterverzeichnisse. Die Unterverzeichnisse rufen dann die Funktion erneut auf und werden so durchsucht. Wenn du weitere Hilfe benötigst bitte melden. Ich habe irgendwo etwas in der Art rum zu liegen. MfG DARKDacil

Kommentar von jundo324 ,

wäre nett wenn du das mal als Beispiel posten könntest ^^

Kommentar von DARKDacil ,

Ich hab jetzt schnell ein Script zum Kopieren von einem Verzeichniss rausgesucht. Ich kann das ganze auch noch umarbeiten zu deinem Zweck, aber das würde kurz dauern. Wenn ich es umarbeiten soll musst einmal Bescheid geben. Damit du aber erstmal einen Ansatz hast, poste ich das Script.

Anstatt dem File.CopyTo müsstest du einen try hinzufügen und in dem try machst du den listadd für eine Datei, wenn er es nicht schafft überspringt er die Datei und geht zur nächsten.

public void DirectoryCopy(String Source, String Destination, Boolean SubdirsCopy, Boolean FilesCopy)
{
System.IO.DirectoryInfo Dir = new System.IO.DirectoryInfo(Source);
if (!Dir.Exists)
throw new System.IO.DirectoryNotFoundException("Source does not exist or could not be found: " + Source);
System.IO.DirectoryInfo[] Dirs = Dir.GetDirectories();
if (!System.IO.Directory.Exists(Destination))
{
System.IO.Directory.CreateDirectory(Destination);
}
if (FilesCopy)
{
System.IO.FileInfo[] Files = Dir.GetFiles();
foreach (System.IO.FileInfo File in Files)
{
File.CopyTo(System.IO.Path.Combine(Destination, File.Name), true);
}
}
if (SubdirsCopy)
{
foreach (System.IO.DirectoryInfo Subdir in Dirs)
DirectoryCopy(Subdir.FullName, System.IO.Path.Combine(Destination, Subdir.Name), SubdirsCopy, FilesCopy);
}
}
Kommentar von jundo324 ,

Danke schonmal ^^
wäre cool wenn du das umgeschrieben posten könntest. Also er soll vom Laufwerk "C" alle Dateien in einer ListBox auflisten (also auch Dateien die in irgendwelchen Unterodnern sind)
Danke

Kommentar von DARKDacil ,

Ok folgendes sollte eigentlich funktionieren, konnte es aber nicht testen.

Du musst noch entscheiden ob der komplette Pfad oder nur der Dateiname eingefügt werden soll.

File.FullName sollte den kompletten Pfad zurückgeben und File.Name nur den Dateinamen.

public void List_Fill(String Source, Boolean SubdirsCopy)
{
System.IO.DirectoryInfo Dir = new System.IO.DirectoryInfo(Source);
if (!Dir.Exists)
throw new System.IO.DirectoryNotFoundException("Source does not exist or could not be found: " + Source);
System.IO.DirectoryInfo[] Dirs = Dir.GetDirectories();
System.IO.FileInfo[] Files = Dir.GetFiles();
foreach (System.IO.FileInfo File in Files)
{
try
{
listBox1.Items.Add(File.FullName));
}
catch (Exception ex)
{
listBox1.Items.Add(ex.Message);
}
}
if (SubdirsCopy)
{
foreach (System.IO.DirectoryInfo Subdir in Dirs)
List_Fill(Subdir.FullName, SubdirsCopy);
}
}

Nun musst du die komplette Funktion in deinen Programmcode einfügen und in das Button Event folgende Zeile:

List_Fill("C:\", true)

Einmal gibt man an welches Verzeichnis er durchsuchen soll und mit dem zweiten ob er auch die Unterverzeichnisse durchsuchen soll.

Falls das Startverzeichnis nicht existieren sollte, gibt er eine Fehlermeldung als Rückgabewert.

Kommentar von jundo324 ,

nun ja also es funktioniert, nur mit dem Problem, das wenn er auf einen Ordner stößt auf den er keine Zugriffsrechte hat, meldet er einen Fehler und sucht nicht weiter.

Kommentar von DARKDacil ,

Probier mal folgende zwei Zeilen auszutauschen mit dem was ich jetzt sende.

System.IO.DirectoryInfo[] Dirs = Dir.GetDirectories();
System.IO.FileInfo[] Files = Dir.GetFiles();
try
{
System.IO.DirectoryInfo[] Dirs = Dir.GetDirectories();
System.IO.FileInfo[] Files = Dir.GetFiles();
}
catch (Exception ex)
{
listBox1.Items.Add(ex.Message);
throw new System.IO.DirectoryNotFoundException("Read Access not granted: " + Source);
}
Kommentar von jundo324 ,

jo danke das funktioniert :D

Kommentar von jundo324 ,

ok es funktioniert doch nicht so, es funktioniert zwar perfekt in der Windows Forms Anwendung aber wenn ich das in einer Windows Universal App Anwedung mache funktioniert es nicht da der Pfad der eben bei der Windows Forms funktioniert hat hier jetzt nicht existiert. Weist du wie ich da Abhilfe schaffe?

Kommentar von DARKDacil ,

Welchen Pfad verwendest du? Die Fehlermeldung gibt ja zurück mit welchen Pfad er es probiert hat, ist das auch der richtige?

Kommentar von jundo324 ,

ganz normal Laufwerk C, aber es funktioniert ja auch in der Windows Forms anwendung nur nicht In der UniversalApp

Kommentar von DARKDacil ,

Probier es mal mit einem anderen Pfad, ob es dann eventuell funktioniert.

Kommentar von jundo324 ,
List_Fill(@"C:\", true);
Kommentar von DARKDacil ,

Probier einmal nur einen Unterordner zu überprüfen.

Kommentar von jundo324 ,

ich hatte jetzt mal hinten den "/" weggenommen und jetzt findet er auch Dateien aber nur Dateien die in dem Projekt Ordner liegen. Aber ich möchte ja das er alle Dateien findet und nicht nur die im App/Projekt Ordner

Kommentar von DARKDacil ,

Teste mal folgenden Pfad: \\127.0.0.1\c$

Kommentar von jundo324 ,

hm so eingegeben unterstreicht er es schon rot und nur die localhost zahlen bringt auch nix also geht auch nciht

Kommentar von DARKDacil ,

und folgendes

System.Combine("127.0.0.1", "C$")
Kommentar von DARKDacil ,

Ich vermute das er es unterschtrich, weil kein @ davor gesetzt wurde.

Kommentar von jundo324 ,

ne er erkennt Combine nicht

Kommentar von DARKDacil ,

Mir fällt gerade der Fehler auf sorry. Ich meinte folgendes:

System.Path.Combine("127.0.0.1", "C$")

Keine passende Antwort gefunden?

Fragen Sie die Community