L’accesso al percorso è negato quando si utilizza Directory.GetFiles (…)

Sto eseguendo il codice qui sotto e ricevo un’eccezione di seguito. Sono obbligato a mettere questa funzione in try catch o c’è un altro modo per ottenere tutte le directory in modo ricorsivo? Potrei scrivere la mia funzione ricorsiva per ottenere file e directory. Ma mi chiedo se c’è un modo migliore.

// get all files in folder and sub-folders var d = Directory.GetFiles(@"C:\", "*", SearchOption.AllDirectories); // get all sub-directories var dirs = Directory.GetDirectories(@"C:\", "*", SearchOption.AllDirectories); 

“L’accesso al percorso ‘C: \ Documents and Settings \’ è negato.”

Se si desidera continuare con la cartella successiva dopo un errore, quindi sì; dovrai farlo da solo Raccomanderei una Stack (prima la profondità) o la Queue (prima di tutto) piuttosto che la ricorsione e un blocco iteratore ( yield return ); quindi eviti sia problemi di sovraccarico dello stack che di utilizzo della memoria.

Esempio:

  public static IEnumerable GetFiles(string root, string searchPattern) { Stack pending = new Stack(); pending.Push(root); while (pending.Count != 0) { var path = pending.Pop(); string[] next = null; try { next = Directory.GetFiles(path, searchPattern); } catch { } if(next != null && next.Length != 0) foreach (var file in next) yield return file; try { next = Directory.GetDirectories(path); foreach (var subdir in next) pending.Push(subdir); } catch { } } } 

È ansible impostare il programma in modo che sia ansible eseguire solo come amministratore.

In Visual Studio :

 Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings 

Dopo averlo fatto clic, verrà creato un file nella cartella delle proprietà del progetto chiamato app.manifest una volta creato, è ansible deselezionare l’opzione Enable ClickOnce Security Settings

Apri quel file e cambia questa linea:

  

a:

   

Ciò renderà il programma necessario i privilegi di amministratore e garantirà l’accesso a tale cartella.

Bene, o si evitano le directory per le quali non si dispone delle autorizzazioni, oppure non lo si fa, ma si risponde con garbo quando l’accesso viene negato.

Se si sceglie la prima opzione, è necessario assicurarsi di sapere quali directory sono e anche che le autorizzazioni per l’id quadro del thread non cambiano. Questo è difficile e incline all’errore; Non lo consiglierei per un sistema di qualità della produzione.

La seconda opzione sembra più appropriata. Usa un blocco try / catch e salta tutte le directory “vietate”.

So che questa domanda è piuttosto vecchia, ma oggi ho avuto lo stesso problema e ho trovato il seguente articolo che spiega in dettaglio una soluzione di “ricorsione delle cartelle”.

L’articolo riconosce i difetti del metodo GetDirectories() …:

Sfortunatamente, questo [ usando il metodo GetDirectories () ] ha dei problemi. La chiave tra queste è che alcune delle cartelle che si tenta di leggere potrebbero essere configurate in modo che l’utente corrente non possa accedervi. Anziché ignorare le cartelle a cui è stato limitato l’accesso, il metodo genera una eccezione non autorizzata. Tuttavia, possiamo aggirare questo problema creando il nostro codice di ricerca della cartella ricorsiva.

… e quindi introduce la soluzione in dettaglio:

http://www.blackwasp.co.uk/FolderRecursion.aspx

È già stato sottolineato che è necessario farlo da soli, così ho pensato di condividere la mia soluzione che evita le collezioni lungo la strada. Va notato che questo ignorerà tutti gli errori, non solo AccessDenied. Per cambiare puoi semplicemente rendere i blocchi di cattura più specifici.

  IEnumerable GetFiles(string folder, string filter, bool recursive) { string [] found = null; try { found = Directory.GetFiles(folder, filter); } catch { } if (found!=null) foreach (var x in found) yield return x; if (recursive) { found = null; try { found = Directory.GetDirectories(folder); } catch { } if (found != null) foreach (var x in found) foreach (var y in GetFiles(x, filter, recursive)) yield return y; } }