Gå til innhold

C#: [LØST] GetFiles fra maskinen selvom bruker ikke har lesetilgang


Anbefalte innlegg

Jeg lager et program som skal liste opp filer på maskinen som er større enn bruker angir eller mindre enn bruker angir og presentere dette i en listview med størrelse på filen o.s.v.

 

Et problem jeg har er System.IO.Directory.GetFiles()

Bruk: string[] files = System.IO.Directory.GetFiles(@"C:\", "*.*", SearchOption.AllDirectories);

Problemet med dette er at dersom den kommer over en mappe eller fil som den ikke har tilgang til feiler den og ingen filer blir lagt til i arrayet.

 

Finnes det en metode som legger til alle filene den finner, og hopper over de filene eller mappene den ikke har tilgang til? Uten dette vil aldri mitt program fungere.

Endret av miXer
Lenke til kommentar
Videoannonse
Annonse

Du kan få UAC til å elevere programmet ditt.

 

Dette gjøres ved at du høyreklikker på prosjektet, trykker på Add->New Item, velger Application Manifest.

I denne finner du linjen

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

Bytt denne med

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Nå vil det dukke opp et UAC skjold på programfilen din. Når du starter programmet, vil UAC reagere.

Lenke til kommentar

Takk GeirGrusom, det hjalp en del, men fortsatt ikke helt i mål.

Nå kom feilmeldingen:

Message: 'Access to the path "C:\Windows\System32\LogFiles\WMI\RtBackup" is denied.'

Source: mscorlib

 

Noen måte å få absolutt full tilgang til alle mapper / filer på disken eller hoppe over de mappene / filene som ikke engang administrator har tilgang til?

Lenke til kommentar

Du kan ikke få Directory.GetFiles() til å hoppe over ting den ikke har tilgang til. Du blir nødt til å behandle hver mappe individuelt for å komme rundt problemet, i stedet for å bare bruke GetFiles på den øverste.

 

 

Heldigvis for deg så har jeg også hatt det problemet og har allerede skrevet en funksjon for det:

 

string[] GetAllFiles(string topFolder)
{
   List<string> folders = new List<string>();
   List<string> fileList = new List<string>();
   folders.Add(topFolder);

   while (folders.Count > 0)
   {
       string current = folders[folders.Count - 1];
       folders.RemoveAt(folders.Count - 1);

       try
       {
           string[] dirs = Directory.GetDirectories(current, "*", SearchOption.TopDirectoryOnly);
           string[] files = Directory.GetFiles(current, "*", SearchOption.TopDirectoryOnly);

           foreach (string dir in dirs) folders.Add(dir);
           foreach (string file in files) fileList.Add(file);
       }
       catch (UnauthorizedAccessException) { }
   }
   return fileList.ToArray();
}

Gjør hva du vil med den. :)

Endret av FLarsen
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...