Entwickler-Ecke

IO, XML und Registry - TempFiles löschen


Metrik - Mo 11.12.06 19:54
Titel: TempFiles löschen
Hallo
Ich bin gerade dabei ein Tool zu schreiben, dass einem den computer von Müll entfernt :D


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
    class Cleaner
    {
        static void Main(string[] args)
        {
            delFiles();
        }
        public static void delFiles()
        {
            string path = @"c:\";
            string searchpattern = "*.tmp";

            string[] directories = Directory.GetFiles(path,searchpattern,SearchOption.AllDirectories);

            foreach (string directory in directories)
            {
                File.Delete(directory);
                Console.WriteLine("Deleting {0}",directory);
            }
        }
    }


Das funktioniert eigentlich auch ganz nett, nur wenn ich auf ein Verzeichnis keinen Zugriff habe, geht gar nichts.

Wenn ich das ganz mit try abfange:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
    class Cleaner
    {
        static void Main(string[] args)
        {
            delFiles();
            Console.ReadLine();
        }
        public static void delFiles()
        {
            try
            {
                string path = @"c:\";
                string searchpattern = "*.tmp";

                string[] directories = Directory.GetFiles(path, searchpattern, SearchOption.AllDirectories);

                foreach (string directory in directories)
                {
                    File.Delete(directory);
                    Console.WriteLine("Deleting {0}", directory);
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
            }
        }
    }


Das Problem ist hier, wenn er einen Fehler finden (Zugriff verweigert auf ....) dann macht er nicht mehr weiter, sonder bleibt in der Exception stecken. Gibts nicht ne möglichkeit, damit er dieses Verzeichnis einfach überspringt?

Könnt ihr mir sagen wir ich das lösen kann ?

Metrik


DareDevil - Mo 11.12.06 23:35

Du musst das try catch anders setzen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
class Cleaner
{
    static void Main(string[] args)
    {
        delFiles();
    }
    public static void delFiles()
    {
        try
        {
            string path = @"c:\";
            string searchpattern = "*.tmp";
            string[] directories =   Directory.GetFiles(path,searchpattern,SearchOption.AllDirectories);
            foreach (string directory in directories)
            {
                File.Delete(directory);
                Console.WriteLine("Deleting {0}",directory);
            }
        }
        catch
        {
            Console.WriteLine(exception.Message);
        }
}


Der fehler tritt ja bei dem "File.Delete()" auf dann müsste der Quelletext so aussehen.
Da das try die ganze Anweisung umschließt sammt der Schleife wird die Schleife abgebrochen wenn "File.Delete()" nicht ausgeführt werden kann damit in das catch gesprungen werden kann.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
class Cleaner
{
    static void Main(string[] args)
    {
        delFiles();
    }
    public static void delFiles()
    {
        string path = @"c:\";
        string searchpattern = "*.tmp";
        string[] directories =   Directory.GetFiles(path,searchpattern,SearchOption.AllDirectories);
        foreach (string directory in directories)
        {
            try
            {
                <span style="color: red">File.Delete(directory);</span>
                Console.WriteLine("Deleting {0}",directory);
            }
            catch
            {
                Console.WriteLine(exception.Message);
            }
        }
    }
}


Greez

Pascal


Metrik - Mi 13.12.06 17:22

Hallo
Danke, hätte ich eigentlich selber draufkommen können :autsch:

Zitat:
try
{
File.Delete(directory);
Console.WriteLine("Deleting {0}",directory);
}
catch
{
Console.WriteLine(exception.Message);
}


Was machst du genau mit der Zeile File.Delete(directory); ?
Das mit den Farben ist mir nicht ganz klar. Hab das auch ausprobiert, hat bei mit nicht gefunzt :(

Metrik


Metrik - Mi 13.12.06 17:25

Hmm, hab das jetzt nochmal ausprobiert ...

Der Fehler wird in der zeile


C#-Quelltext
1:
2:
 string[] directories =   Directory.GetFiles(path,searchpattern,SearchOption.AllDirectories);
        foreach (string directory in directories)


erzeugt.

Was soll ich jetzt machen ?
Metrik


Kha - Mi 13.12.06 18:59

user profile iconMetrik hat folgendes geschrieben:
Danke, hätte ich eigentlich selber draufkommen können :autsch:
dann solltest du doch nun ebenfalls selbst herausfinden können, wo ein weiterer Catch-Block eingefügt werden muss.


Metrik - Fr 15.12.06 19:25

Hallo

Irgendwie hat mir bis jetzt noch keiner so richtig helfen könnnen ....

Geht mal von vollgendem source aus:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
    class Cleaner
    {
        static void Main(string[] args)
        {
            delFiles();
        }
        public static void delFiles()
        {
            string path = @"c:\";
            string searchpattern = "*.tmp";
            string[] directories = Directory.GetFiles(path,searchpattern,SearchOption.AllDirectories);
            foreach (string directory in directories)
            {
                File.Delete(directory);
                Console.WriteLine("Deleting {0}",directory);
            }
        }
    }


Jetzt mal die Testsituation, dass der ausführende Benutzer auf das Verzeichnis c:\test keinerlei Rechte hat.

Dann geht nämlich gar nichts :(
Kann mir wer eine Lösung zeigen, die dieses Problem löst? vielleicht ist auch mein Ansatz falsch zum das Problem zu lösen. Jeder Tipp willkommen.

Metrik


Christian S. - Fr 15.12.06 19:32

Laut Doku wirft File.Delete doch eine UnauthorizedAccessException, wenn es nicht geht. Die kannst doch abfangen.


Metrik - Sa 16.12.06 18:56

Hallo

Hat mir nicht wirklich geholfen... Ich verstehe das selber nicht, warum dass das auf keine Weise geht. Könnte nicht einer, einfach schnell den sourcecode kopieren und das bei sich ausporbieren ?

Aus meiner Sicher entsteht der Fehler nicht bei der Zeile

C#-Quelltext
1:
File.Delete(directory);                    


sondern hier bei SearchOption.AllDirectories

C#-Quelltext
1:
string[] directories = Directory.GetFiles(path,searchpattern,SearchOption.AllDirectories);                    


Wäre euch dankbar, wenn ihr mir helfen könntet

MEtrik


Metrik - Sa 16.12.06 19:05

Ich muss hier vielleicht noch anfügen, ich kann zwar den error abfangen, damit nicht alles abstürtz, aber dann sucht der nicht weiter nach Verzeichnissen.
Der soll aber alle durchsuchen, die er lesen darf.

MEtrik


Metrik - So 17.12.06 10:40

Hallo
Gibt es nicht eine Möglichkeit, um dem Programm zu sagen, dass es einfach dieses Verzeichnis überstpringen und weiterfahren soll ?


Metrik