System.UnauthorizedAccessException beim Abrufen von Dateien

Ich habe eine sehr ähnliche Frage vor hier gestellt. Aber das war um Verzeichnisse zu bekommen, und das ist über Dateien. Und diese Codes unterscheiden sich ein wenig voneinander. Seit ich versuche, dies zu konvertieren, damit es wie die Antwort auf meine alte Frage aussieht, habe ich es nicht getan war in der Lage, es zum Laufen zu bringen.

string[] files = Directory.GetFiles(ScanPath, "*.*", System.IO.SearchOption.AllDirectories);
DateTime From = DateTime.Now.AddHours(-24);
DateTime To = DateTime.Now;

foreach (string name in files)
{
   FileInfo file = new FileInfo(name);
   string fullname = file.FullName;

   if (file.LastWriteTime >= From & file.LastWriteTime <= To && file.Length >= ScanSize)
      Console.WriteLine(file.FullName + " ; " + "last changed at  " + " ; " + file.LastWriteTime.ToString());
}

Ich habe die gleichen Fehler bekommen, wie ich es in der anderen Frage erklärt habe. Weil ich nicht weiß, wo ich den Code des foreach in eine Rekursion setzen soll. Da es keine Aufzählung ist, sondern ein Directory.GetFiles() .

Der Fehler tritt auf mit:

Directory.GetFiles (ScanPath, "*", SearchOption.AllDirectories);

weil das alle Dateien der Verzeichnisse gleichzeitig bekommt. Aber wenn ich es entferne, erhält es nur die Dateien im angegebenen Pfad, ohne die Dateien in den Unterverzeichnissen. Also wurde mir gesagt, Rekursion anzuwenden.

Ich bin der Administrator des Systems und ich plane, dies auf dem gesamten Datenlaufwerk auszuführen. D: \

Ich hoffe, dass hier jemand ein gutes Beispiel kennt.

0
Wenn Sie die Zeile erwähnen, wo Sie die Ausnahme erhalten. Vielen Dank
hinzugefügt der Autor Saghir A. Khatri, Quelle
scheint, als hätten Sie keine ausreichenden Berechtigungen. Wie Sie auf msdn sehen msdn.microsoft. com/de-de/library/ms143316% 28v = vs.110% 29.aspx
hinzugefügt der Autor Saghir A. Khatri, Quelle
Ich habe die Ausnahme mit der Systemdatei gemacht. Ansonsten funktioniert der Code einwandfrei
hinzugefügt der Autor Saghir A. Khatri, Quelle
Ich habe den gleichen Code ausprobiert, den Sie gepostet haben. Ich habe eine Ausnahme nur wenn Zeile versucht, Datei zu bekommen, die ursprünglich vom System selbst erstellt wurde.
hinzugefügt der Autor Saghir A. Khatri, Quelle
Ich habe vergessen, viele Details zu erwähnen, da ich die meiste Situation in der Frage, die ich verlinkt habe, erklärt habe, sorry. Ich werde etwas Kontext hinzufügen.
hinzugefügt der Autor user3095385, Quelle
@SAK über Rekursion? Oder aber? Kannst du mir sagen, wie du es gemacht hast?
hinzugefügt der Autor user3095385, Quelle
Von welchem ​​Pfad versuchen Sie Dateien zu erhalten? Welches OS? Sind Sie als Administrator angemeldet? Führen Sie VS als Administrator aus?
hinzugefügt der Autor Ondrej Janacek, Quelle

2 Antworten

Möglicherweise erhalten Sie "UnauthorizedAccessException" beim Zugriff auf einige der Systemverzeichnisse.Liste des Verzeichnisses, das die Probleme verursacht, sind Verzeichnisse, die eigentlich nur in ein anderes Verzeichnis umgeleitet werden. Vielleicht kannst du den folgenden Code ausprobieren, wenn es hilft:

try
{
    foreach (String file in Directory.GetFiles(directoryName, pattern, SearchOption.TopDirectoryOnly))
    {
      //do stuff
    }
catch (UnauthorizedAccessException uae)
{
           //handle
}
catch (Exception e) 
{ 
           //handle
}

Alternative:

string[] directories = Directory.GetDirectories(ScanPath);

    foreach (string directory in directories)
    {
        string[] filesinCurrentDirectory = Directory.GetFiles(directory, "*.*", System.IO.SearchOption.AllDirectories);
        foreach (string file in filesinCurrentDirectory)
        {
            MessageBox.Show(file);
        }

    }
0
hinzugefügt
Das ist mein aktuelles Format, aber ich muss rekursiv jede erreichbare Datei in jedem Verzeichnis/Unterverzeichnis eines bestimmten Verzeichnisses durchsuchen.
hinzugefügt der Autor user3095385, Quelle
kannst du bitte meine Frage lesen? Fehler treten auf, wenn ich mit den oberen Schichten meiner Festplatte scanne. Ich spreche über die versteckten Dateien, auf die selbst der Administrator nicht zugreifen kann. So funktioniert SearchOption.AllDirectories nicht.
hinzugefügt der Autor user3095385, Quelle
@ user3095385: Können Sie die alternative Option sehen? Also, wenn ich Directory.GetDirectories() mache, bekomme ich alle meine Verzeichnisse. Dann kann ich die Methode GetFiles() aufrufen, um die Liste der Dateien im aktuellen Verzeichnis abzurufen.
hinzugefügt der Autor Ramashankar, Quelle

Ihre App konnte keine Zugriffsrechte für einige Ordner haben, für andere können Sie den folgenden Code verwenden:

void DiscoverDirs(string where, List files, Func filter)
{
    try
    {
        var di = new DirectoryInfo(where);
        files.AddRange(di.EnumerateFiles().Where(filter).Select(x => x.FullName));

        foreach (var dir in Directory.GetDirectories(where))
        {
            DiscoverDirs(dir, files, filter);
        }
    }
    catch
    {
       //no access fo this dir, ignore
    }
}

Verwendung:

DateTime From = DateTime.Now.AddHours(-24);
DateTime To = DateTime.Now;
var ScanSize = 5*1024*1024;

var list = new List();
DiscoverDirs(@"C:\", list, 
    file => file.LastWriteTime >= From & file.LastWriteTime <= To && file.Length >= ScanSize);

foreach (string name in list)
{
    FileInfo file = new FileInfo(name);
    string fullname = file.FullName;

    Console.WriteLine(file.FullName + " ; " + "last changed at  " + " ; " + file.LastWriteTime.ToString());
}
0
hinzugefügt
Genau wie ich es in meiner Frage gesagt habe, hatte ich gehofft, dass es so aussieht wie das .
hinzugefügt der Autor user3095385, Quelle
Oh ja, Entschuldigung. Ich bin es gewohnt, Verzeichnisse zu durchsuchen, Dateien sind neu für mich. Vielen Dank für Ihre Hilfe und Zeit :)
hinzugefügt der Autor user3095385, Quelle
Es scheint zu funktionieren. Aber die Ausgabe ist falsch. Es zeigt viel zu wenig Dateien, die in einem Verzeichnis sind (zum Beispiel wenn ich Dateien größer oder gleich 1 MB haben möchte). Ich habe 8 Photoshop-Dateien von mehr als 50 MB, und das Programm zeigt nur 1. Der Code scheint aber korrekt zu sein.
hinzugefügt der Autor user3095385, Quelle
Ich habe den Fehler: "Keine Überladung für die Methode 'DiscoverDirs' dauert 2 Argumente" bei DiscoverDirs (dir, Dateien); am foreach im void DiscoverDirs . Hattest du das auch?
hinzugefügt der Autor user3095385, Quelle
@ user3095385 Sorry, ich habe es behoben.
hinzugefügt der Autor Tony, Quelle
@ user3095385 Ok, siehe meine aktualisierte Antwort.
hinzugefügt der Autor Tony, Quelle
@ user3095385 Möglicherweise wurden diese Dateien nach dieser Klausel gefiltert file.LastWriteTime> = Von & file.LastWriteTime <= Bis ? Sie möchten Dateien finden, die innerhalb der letzten 24 Stunden geändert wurden.
hinzugefügt der Autor Tony, Quelle