Avatar billede bulgroz Nybegynder
20. december 2007 - 16:05 Der er 8 kommentarer og
1 løsning

Delete Directory - UnauthorizedAccessException

Hej eksperter...

Jeg har lavet en stump kode som scanner efter nogle specielt navngivne folders.
Det er så meningen at min collection af folders skal slettes efterfølgende.
Al min kode til at scanne for folders osv. virker, men når jeg skal til at slette dem har jeg et problem.

Jeg får en System.UnauthorizedAccessException når jeg forsøget at kalde directoryInfo.Delete(true) (for at slette directory + files and subfolders).

Jeg har ingen problemer med at delete manuelt, så hvordan får jeg dekoreret min kode så jeg har de rette rettigheder?

De folders som deletes er Hidden, ReadOnly, og de indeholder filer som også er ReadOnly.

Jeg har prøvet mange forskellige tiltag, men får stadig den samme exception.
Jeg har ikke kunnet finde noget på nettet bortset fra generel security information og mangelfulde eksempler.

Er der én af jer der har et kort eksempel, som kan hjælpe mig på vej?
Avatar billede martchap Nybegynder
20. december 2007 - 16:32 #1
Er du logget ind som administrator?
Kører du Vista? I så fald, kører du Visual Studio med administrator rettighedder?
Har du nogle af filerne i folders'ne, åbne i nogen programmer?

Prøv at checke det, ellers så prøv at putte din kode in sådan her:

            try
            {
                dir2.Delete(true);
            }
            catch (UnauthorizedAccessException e)
            {
                MessageBox.Show("FEJL: " + e);
            }

MVH Martin
Avatar billede martchap Nybegynder
20. december 2007 - 16:35 #2
Undskyld den stump kode jeg skrev så sådan her ud:
            try
            {
                dir2.Delete(true);
            }
            catch (UnauthorizedAccessException e)
            {
                MessageBox.Show("FEJL: " + e);
            }

Der skal ikke stå dir2, men navnet på dit DirectoryInfo objekt.
MVH Martin
Avatar billede bulgroz Nybegynder
20. december 2007 - 17:18 #3
Ja jeg er administrator (& Vista), men spørsmålet er ikke vedrørende at fange en ekseption, men derimod hvorledes man dekorerer sin kode til at få samme rettigheder som aktuelle bruger. Jeg har puslet med områdeer så som Identity, DirectorySecurity og FileSystemAccessRule, men jeg har altså ikke fundet den korrekte løsning endnu.
Avatar billede martchap Nybegynder
20. december 2007 - 18:01 #4
Har selv lige sat det op, og har fundet ud af hvorfor du ikke kan (Brugte min Catch funktion til at få en mere detaljeret fejlmeddelse)

Det ser ud til, at du ikke kan slette dit dir, fordi det indeholder Read-Only filer.

Jeg har lige skrevet en løsning til dig:

            FileAttributes att = FileAttributes.Normal;

            try
            {


                for (int i = 0; i < dir.GetFiles().Length; i++)
                {
                    FileInfo fi = new FileInfo(dir.FullName + @"\" + dir.GetFiles().GetValue(i));

                    if (fi.IsReadOnly == true)
                    {
                        File.SetAttributes(fi.FullName, att);
                    }
                }


            }
            catch (UnauthorizedAccessException ex)
            {
                MessageBox.Show("FEJL: " + ex);
                return;
            }

            dir.Delete(true);

MVH Martin
Avatar billede martchap Nybegynder
20. december 2007 - 18:15 #5
Ovenstående kode skulle klare alle filer som er Read-Only. Men ikke dem i undermapperne.. Det kræver lige lidt ekstra kode. Men ovenstående skulle ihvertfald hjælpe dig godt på vej

MVH Martin
Avatar billede bulgroz Nybegynder
20. december 2007 - 19:27 #6
Ved du hvad... Du har ret! Problemet var at der dybt nede i den underliggende struktur, stadig var filer som var ReadOnly. Jeg havde ellers prøvet dette også, men åbenbart havde jeg ikke været grundig nok.

Tak for hjælpen og God Jul :-)
Avatar billede bulgroz Nybegynder
20. december 2007 - 19:27 #7
Smid lige et svar...
Avatar billede martchap Nybegynder
20. december 2007 - 19:38 #8
Det var da så lidt ;)
Og du må også have en god jul :-)
Avatar billede bulgroz Nybegynder
20. december 2007 - 20:13 #9
For lige at runde den af for andre interesserede... (hvis der er nogle...)

        private static void DeleteDirectory(string path)
        {
            DirectoryInfo directoryInfo = new DirectoryInfo(path);

            SetNormalAttribute(directoryInfo);

            directoryInfo.Delete(true);
        }

        private static void SetNormalAttribute(DirectoryInfo directoryInfo)
        {
            directoryInfo.Attributes = FileAttributes.Normal;

            foreach (FileInfo fileInfo in directoryInfo.GetFiles())
            {
                fileInfo.Attributes = FileAttributes.Normal;
            }

            foreach (DirectoryInfo directory in directoryInfo.GetDirectories())
            {
                SetNormalAttribute(directory);
            }
        }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester