Avatar billede jps6kb Novice
18. juli 2006 - 18:44 Der er 16 kommentarer og
1 løsning

File.Delete skrivebeskyttede filer

Hej,

Jeg sidder og bøvler med at slette filer.
Eller, de skrivebeskyttede filer.

string[] arrayFiles = Directory.GetFiles(strDirectory);
foreach (string f in arrayFiles)
{
  File.SetAttributes(f, (FileAttributes.Normal));
  File.Delete(f);
}

Det er min kode nu, men det virker bare ikke. :)
Hvad kan man gøre for at fjerne skrivebeskyttelsen?
Avatar billede nielle Nybegynder
18. juli 2006 - 18:59 #1
Prøv at ændre:

  File.SetAttributes(f, (FileAttributes.Normal));

- til:

  File.SetAttributes(f, FileAttributes.Normal);
Avatar billede jps6kb Novice
18. juli 2006 - 19:13 #2
Det gi'r det samme..
Avatar billede nielle Nybegynder
18. juli 2006 - 19:16 #3
Hvad sker der? Fejlbeskeder eller hvad?
Avatar billede jps6kb Novice
18. juli 2006 - 19:18 #4
Jep.

Ny Bitmapbillede (2) har jeg gjort skrivebeskyttet.


System.UnauthorizedAccessException: Access to the path 'Ny Bitmapbillede (2).bmp
' is denied.
  at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean
recursive)
  at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recur
sive)
  at System.IO.Directory.Delete(String path, Boolean recursive)
  at ClearUserDirectory.Program.Main(String[] args) in C:\Documents and Setting
s\Kim Bang\Dokumenter\Visual Studio 2005\Projects\ClearUserDirectory\ClearUserDi
rectory\Program.cs:line 27
-- MESSAGE --
Access to the path 'Ny Bitmapbillede (2).bmp' is denied.
Avatar billede jps6kb Novice
18. juli 2006 - 19:21 #5
-- MESSAGE --
Access to the path 'Ny Bitmapbillede (2).bmp' is denied.

er exception.Message

og det ovenover er exception.StackTrace().. ;)
Avatar billede nielle Nybegynder
18. juli 2006 - 19:35 #6
Ja, den besked stemmer jo pænt overens med at filen er skrivebeskyttet.

Imidlertid fungere den kode jeg har postet her i min egne test. Der må altså næsten være noget andet på færde. Kan det tænkes at den pågældende fil er låst fordi at den er i brug af et andet program?
Avatar billede jps6kb Novice
18. juli 2006 - 19:37 #7
Nej, for det er test data. Jeg har bare oprettet tomme filer.
Men den udviste samme opførsel ved de mapper som den egentlig skulle bruges til.
Avatar billede jps6kb Novice
18. juli 2006 - 19:38 #8
Du kan lige få det hele her hvis du vil prøve det af. :)




class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("2Vil du rense de markerede biblioteker? (J/N) ");
            string resp = Console.ReadKey().KeyChar.ToString();
            if (resp.ToLower().Equals("j"))
            {
                try
                {
                    Console.WriteLine();
                    Console.WriteLine("Rensning påbegyndt");
                    int counter = 0;
                    foreach (string strDirectory in args)
                    {
                        Console.WriteLine("Renser " + strDirectory);
                        string[] arrayDirectories = Directory.GetDirectories(strDirectory);
                        foreach (string d in arrayDirectories)
                        {
                            Directory.Delete(d, true);
                        }
                        string[] arrayFiles = Directory.GetFiles(strDirectory);
                        foreach (string f in arrayFiles)
                        {
                            File.SetAttributes(f, FileAttributes.Normal);
                            File.Delete(f);
                        }
                        Console.WriteLine("  .. .. .. Færdig");
                        Console.WriteLine();
                        counter++;
                    }
                    Console.WriteLine();
                    Console.WriteLine("#" + counter.ToString() + " bibliotek(er) blev renset");
                }
                catch (Exception exep)
                {
                    Console.WriteLine("!!!En fejl opstod!!!");
                    Console.WriteLine("--------------------");
                    Console.WriteLine(exep.ToString());
                    Console.WriteLine("-- MESSAGE --");
                    Console.WriteLine(exep.Message);
                }
            }
            else
            {
                Console.WriteLine();
                Console.WriteLine("#Handlingen blev afbrudt");
            }
            Console.ReadKey();
        }
    }
Avatar billede nielle Nybegynder
18. juli 2006 - 19:46 #9
Er du sikker på at din fejl ikke snarer kommer fra denne her linje:

Directory.Delete(d, true);

Den vil nemlig fejle hvis der er filer i biblioteket, og da helt bestemt hvis en af disse er skrivebeskyttet
Avatar billede jps6kb Novice
18. juli 2006 - 19:50 #10
Jo, det kan jeg godt se, men hvordan gør jeg så at jeg sletter filer i de dir's den finder?
Den kører jo dir's igennem først, og jeg kan ikke sætte variabler på der, kan jeg?
Avatar billede nielle Nybegynder
18. juli 2006 - 19:53 #11
Det kræver en radikalt anderledes kode - f.eks. rekursion:

Du bliver simpelthen nøde til at gå ud i de yderste grene af din bibliotekstruktur, slette filerne først, og så slette biblioteket bagefter.
Avatar billede jps6kb Novice
18. juli 2006 - 19:55 #12
Crap..

Directory.Delete(d, true); true gør jo at den bliver rekursiv selv.
Kan jeg ikke extende den på en eller anden måde?

Tilgiv mig, jeg er helt rå-grøn i .NET :p
Avatar billede nielle Nybegynder
18. juli 2006 - 19:59 #13
Korrekt, altså bortset fra at den ikke kan klare skrivebeskyttede filer.

Nej, den kan nok ikke lige extendes (overloades) sådan uden videre.

Øjeblik, så skal jeg bikse noget kode sammen til dig.
Avatar billede jps6kb Novice
18. juli 2006 - 20:00 #14
Super.. :) Taknemlighed
Avatar billede nielle Nybegynder
18. juli 2006 - 20:05 #15
Denne her burde virke:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Vil du rense de markerede biblioteker? (J/N) ");
            string resp = Console.ReadKey().KeyChar.ToString();
            if (resp.ToLower().Equals("j"))
            {
                try
                {
                    Console.WriteLine();
                    Console.WriteLine("Rensning påbegyndt");
                    int counter = 0;
                    foreach (string strDirectory in args)
                    {
                        SletBibilotek(strDirectory);
                    }
                    Console.WriteLine();
                    Console.WriteLine("#" + counter.ToString() + " bibliotek(er) blev renset");
                }
                catch (Exception exep)
                {
                    Console.WriteLine("!!!En fejl opstod!!!");
                    Console.WriteLine("--------------------");
                    Console.WriteLine(exep.ToString());
                    Console.WriteLine("-- MESSAGE --");
                    Console.WriteLine(exep.Message);
                }
            }
            else
            {
                Console.WriteLine();
                Console.WriteLine("#Handlingen blev afbrudt");
            }
            Console.ReadKey();
        }

        private static void SletBibilotek(string strDirectory)
        {
            // Sletter alle filerne i dette bibliotek.
            string[] arrayFiles = Directory.GetFiles(strDirectory);
            foreach (string f in arrayFiles)
            {
                File.SetAttributes(f, FileAttributes.Normal);
                File.Delete(f);
            }
           
            // Fortsætter ud i underbibliotekerne.
            string[] arrayDirectories = Directory.GetDirectories(strDirectory);
            foreach (string d in arrayDirectories)
            {
                SletBibilotek(d);
            }

            // Sletter dette bibliotek.
            Console.WriteLine("Renser " + strDirectory);
            Directory.Delete(strDirectory);
        }
    }
Avatar billede jps6kb Novice
18. juli 2006 - 20:13 #16
Det gjorde det bare. :) Mange tak for det.
Smider du lige et svar? :)
Avatar billede nielle Nybegynder
18. juli 2006 - 20:14 #17
Svar :^)
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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