2013-07-28 11 views
8

Sto cercando di far funzionare l'app visualizzatore di immagini con i file che vengono aperti facendo clic su un file di immagine direttamente all'interno di una cartella Zip (utilizzando Windows Explorer per sfogliare i file Zip). L'applicazione sembra essere gestito con la riga di comando corretta, che assomiglia a questo:UnauthorizedAccessException con percorso al file nella cartella temp dall'archivio Zip

"C:\myApp.exe" "C:\Users\Admin\AppData\Local\Temp\Temp1_Wallpapers.zip\Wallpaper1.jpg" 

Il file viene letto con il seguente codice:

using (var fs = new FileStream(path, FileMode.Open)) 

E l'eccezione viene generata in quella linea:

Eccezione: generata: "Accesso al percorso" C: \ Users \ Admin \ AppData \ Local \ Temp \ Temp1_Wallpapers.zip \ Wallpaper1.jpg 'negato. " (System.UnauthorizedAccessException)

È stata generata un'eccezione System.UnauthorizedAccessException: "Accesso al percorso" C: \ Users \ Admin \ AppData \ Local \ Temp \ Temp1_Wallpapers.zip \ Wallpaper1.jpg "negato."

Ho pensato che questo potrebbe essere un problema con il modo in cui il percorso viene interpretato. C'è uno .zip nel mezzo, quindi questo potrebbe essere il problema, ma non so come risolverlo.

Inoltre, l'apertura di un file direttamente in quel percorso (non tramite la finestra di esplorazione della cartella zippata) comporta la stessa eccezione.

risposta

2

Ho appena scoperto qual era il problema. I file estratti dalle cartelle compresse nella cartella temporanea avranno l'attributo read-only, che apparentemente l'app visualizzatore di immagini non è in grado di gestire e genera UnauthorizedAccessException. Devo solo rimuovere quell'attributo e tutto andrà bene. Indovinare provare a leggere i file di sola lettura è una violazione di accesso di sorta.

+2

No, la lettura di file di sola lettura non è non autorizzata, ma il codice che si sta utilizzando per leggerli richiede autorizzazioni eccessive (in lettura/scrittura). Correggilo e l'errore scompare. – EricLaw

+0

@EricLaw qualche suggerimento su come farlo? – user1306322

+2

Prova ad aggiungere un terzo parametro: 'FileAccess.Read' al costruttore FileStream. È piuttosto stupido che .Net vada per il permesso più restrittivo ('ReadWrite') di default, anche se suppongo che altrimenti i forum sarebbero pieni di" Perché non posso scrivere sul mio filestream!?!?! " – nemec

5

Esplora risorse consente di trattare un archivio .zip come una cartella tramite un gestore dell'estensione nome shell. Tali gestori estendono la capacità della shell. Ma questo è comunque limitato alle sole funzioni di shell, non rende automagicamente le funzioni di accesso ai file di basso livello in grado di fare lo stesso. Come FileStream.

Per prima cosa è necessario copiare il file dall'archivio .zip, quindi aprirlo con FileStream. Un sacco di librerie di supporto .zip in giro, SharpZipLib e DotNetZip sono popolari. È stato finalmente aggiunto a .NET 4.5 con la classe System.IO.Compression.ZipArchive. Prendiamo quello per il codice di esempio più a prova di futuro.

Ho creato un archivio Example.zip con una singola immagine e l'ho copiato nella mia directory temporanea. Questo codice recuperato e ha reso l'immagine di sfondo di una forma WinForms:

using System.IO; 
using System.IO.Compression; // Add reference to System.IO.Compression 
... 

    private void button1_Click(object sender, EventArgs e) { 
     var srcePath = @"c:\users\hpass_000\appdata\local\temp\example.zip"; 
     using (var file = new FileStream(srcePath, FileMode.Open)) { 
      var zip = new ZipArchive(file, ZipArchiveMode.Read); 
      var entry = zip.GetEntry("Chrysanthemum.jpg"); 
      var destPath = Path.GetTempFileName(); 
      using (var srce = entry.Open()) 
      using (var dest = new FileStream(destPath, FileMode.Create)) { 
       srce.CopyTo(dest); 
      } 
      using (var img = Image.FromFile(destPath)) { 
       this.BackgroundImage = new Bitmap(img); 
      } 
      File.Delete(destPath); 
     } 
    } 
+0

Sembra che il percorso completo sia contenuto in una cartella normale, è appena chiamato ".zip", ma non è una cartella zip.Solitamente il percorso al contenuto di una cartella zippata non visualizza ".zip" nella barra del percorso completo, quindi non è il caso. Questo è il motivo per cui mi chiedo perché non funzioni. – user1306322

+2

È del tutto normale che non funzioni, questo è il punto che ho cercato di dare nella risposta. Sembra che tu l'abbia completamente perso. Non sono sicuro di come aiutarti su quella gobba, ti consiglierei di fare le cose che ho raccomandato. –

+0

Questa cartella temporanea, che ha la parola "temp" 2 volte all'interno del suo percorso completo, sembra una normale cartella, rispetto alla navigazione in una cartella zippata con Windows Explorer. Non so in quale altro modo posso comunicare che sono quasi certo che questo non è ciò che pensi sia. – user1306322

1

La questione non ha nulla a che fare con la . nel percorso di file temporaneo perché i periodi sono legali nei nomi di file e nomi delle directory.

Come previsto, l'apertura di una cartella Zip nella shell e l'apertura di un file estrae automaticamente il contenuto in una cartella temporanea, che è solo una normale cartella. L'unica cosa che sembra strana è che sta aprendo la cartella temporanea Administrator. Stai usando l'exe come utente normale? Se exe e shell sono in esecuzione con utenti separati, l'exe potrebbe non essere in grado di accedere alla cartella temp utilizzata dalla shell.

Problemi correlati