2013-07-28 6 views
8

Ich versuche, meine Bildbetrachter-App arbeiten mit Dateien, die durch Klicken auf eine Bilddatei direkt in einem Zip-Ordner geöffnet werden (mit Windows Explorer Zip-Dateien durchsuchen). Die Anwendung scheint mit dem richtigen Befehlszeile ausgeführt werden, die wie folgt aussieht:UnauthorizedAccessException mit Pfad zur Datei in Temp-Ordner aus Zip-Archiv

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

Die Datei mit dem folgenden Code gelesen wird:

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

Und die Ausnahme zu dieser Linie geworfen:

Ausnahme: Geworfen: "Zugriff auf den Pfad 'C: \ Benutzer \ Admin \ AppData \ Local \ Temp \ Temp1_Wallpapers.zip \ Wallpaper1.jpg' wird verweigert." (System.UnauthorizedAccessException)

Eine System.UnauthorizedAccessException wurde ausgelöst: "Zugriff auf den Pfad 'C: \ Benutzer \ Admin \ AppData \ Local \ Temp \ Temp1_Wallpapers.zip \ Wallpaper1.jpg' wird verweigert."

Ich dachte, dies könnte ein Problem sein, wie der Pfad interpretiert wird. Da ist ein .zip in der Mitte, also könnte das das Problem sein, aber ich weiß nicht, wie ich das lösen soll.

Auch das einfache Öffnen einer Datei in diesem Pfad direkt (nicht durch gezippte Ordner Explorer-Fenster) führt zu der gleichen Ausnahme.

Antwort

2

Ich habe gerade herausgefunden, was das Problem war. Dateien, die aus komprimierten Ordnern in den temporären Ordner extrahiert werden, haben das Attribut read-only, das von meiner Bildbetrachter-App offenbar nicht verarbeitet werden kann, und löst UnauthorizedAccessException aus. Ich muss nur dieses Attribut entfernen und alles wird gut. Vermutete Versuche, schreibgeschützte Dateien zu lesen, ist eine Art von Zugriffsverletzung.

+2

Nein, das Lesen von schreibgeschützten Dateien ist nicht unberechtigt, aber der Code, mit dem Sie sie lesen, verlangt nach übermäßigen (Lese-/Schreib-) Berechtigungen. Fix das und der Fehler verschwindet. – EricLaw

+0

@EricLaw irgendwelche Hinweise, wie man das macht? – user1306322

+2

Versuchen Sie, einen dritten Parameter hinzuzufügen: 'FileAccess.Read' zum FileStream-Konstruktor. Es ist irgendwie albern, dass .Net die restriktivste ('ReadWrite') Berechtigung standardmäßig wählt, obwohl ich denke, ansonsten wären die Foren voll von" Warum kann ich nicht in meinen Filestream schreiben!?!?! " – nemec

5

Windows Explorer bietet die Möglichkeit, ein .zip-Archiv über einen Shell-Namenerweiterungshandler als Ordner zu behandeln. Solche Handler erweitern die Fähigkeit der Shell. Dies ist jedoch nur auf Shell-Funktionen beschränkt, und es macht nicht automatisch die Low-Level-Dateizugriffsfunktionen in der Lage, dasselbe zu tun. Wie FileStream.

Sie müssen zuerst die Datei aus dem ZIP-Archiv kopieren, dann können Sie sie mit FileStream öffnen. Viele .zip-Bibliotheken, SharpZipLib und DotNetZip sind beliebt. Es wurde schließlich zu .NET 4.5 mit der System.IO.Compression.ZipArchive-Klasse hinzugefügt. Wählen wir diesen für den zukunftssichersten Beispielcode aus.

Ich erstellte ein Example.zip-Archiv mit einem einzelnen Bild und kopierte es in mein temporäres Verzeichnis. Dieser Code abgerufen, und es das Hintergrundbild einer WinForms Form gemacht:

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

Es scheint, dass der vollständige Pfad in einem normalen Ordner enthalten ist, es heißt nur ". Zip", aber es ist kein Zip-Ordner.Normalerweise zeigt der Pfad zum Inhalt eines gezippten Ordners in der vollständigen Pfadleiste nicht ".zip" an, was nicht der Fall ist. Deshalb frage ich mich, warum es nicht funktioniert. – user1306322

+2

Es ist völlig normal, dass es nicht funktioniert, das war der Punkt, den ich in der Antwort versucht habe. Klingt so, als hättest du es komplett vermisst. Ich bin mir nicht sicher, wie ich dir über diesen Buckel helfen kann. Ich würde dir empfehlen, die Dinge zu tun, die ich dir empfohlen habe. –

+0

Dieser temporäre Ordner, der das Wort "temp" zweimal innerhalb seines vollständigen Pfads enthält, sieht wie ein normaler Ordner aus, verglichen mit dem Durchsuchen eines gezippten Ordners mit Windows Explorer. Ich weiß nicht, wie ich sonst vermitteln könnte, dass ich fast sicher bin, dass dies nicht das ist, was Sie denken. – user1306322

1

Das Problem hat nichts mit den . im temporären Dateipfad zu tun, weil Perioden legal in Dateinamen sowie Verzeichnisnamen sind.

Wie Sie erwarten, extrahiert das Öffnen eines Zip-Ordners in der Shell und das Öffnen einer Datei den Inhalt automatisch in einen temporären Ordner, der nur ein normaler Ordner ist. Das einzige, was hier seltsam aussieht, ist, dass es den Administrator Temp-Ordner öffnet. Führst du die exe als normaler Benutzer aus? Wenn die EXE und die Shell unter separaten Benutzern ausgeführt werden, kann die EXE möglicherweise nicht auf den von der Shell verwendeten temporären Ordner zugreifen.

Verwandte Themen