UnauthorizedAccessException mit dem Pfad zur Datei im temporären Ordner aus dem Zip-Archiv

8

Ich versuche, meine Bildbetrachter-App mit Dateien zu arbeiten, die durch Klicken auf eine Bilddatei direkt in einem Zip-Ordner geöffnet werden (mit Windows Explorer zum Durchsuchen von Zip-Dateien). Die Anwendung scheint mit der richtigen Befehlszeile ausgeführt zu werden, die so aussieht:

%Vor%

Die Datei wird mit dem folgenden Code gelesen:

%Vor%

Und die Ausnahme wird auf diese Zeile geworfen:

  

Ausnahme: ausgelöst: "Der 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: "Der Zugriff auf den Pfad 'C: \ Benutzer \ Admin \ AppData \ Local \ Temp \ Temp1_Wallpapers.zip \ Wallpaper1.jpg' wird verweigert."

Ich dachte mir, das könnte ein Problem mit der Interpretation des Pfades sein. 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 direkte Öffnen einer Datei in diesem Pfad (nicht über das gezippte Ordner-Explorer-Fenster) führt zu derselben Ausnahme.

    
user1306322 28.07.2013, 18:45
quelle

3 Antworten

2

Ich habe gerade herausgefunden, was das Problem war. Dateien, die aus komprimierten Ordnern in einen temporären Ordner extrahiert werden, haben read-only -Attribut, was meine Bildbetrachter-App anscheinend nicht verarbeiten kann und UnauthorizedAccessException auslöst. Ich muss nur dieses Attribut entfernen und alles wird gut. Vermutete Leseversuche sind eine Art Zugriffsverletzung.

    
user1306322 10.08.2013, 23:41
quelle
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, es macht die Funktionen des Low-Level-Dateizugriffs nicht automatisch dazu fähig, dasselbe zu tun. Wie FileStream.

Sie müssen die Datei zuerst aus dem ZIP-Archiv kopieren und dann 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 habe ein Example.zip-Archiv mit einem einzelnen Bild erstellt und es in mein temporäres Verzeichnis kopiert. Dieser Code hat es abgerufen und zum Hintergrundbild eines Winforms-Formulars gemacht:

%Vor%     
Hans Passant 10.08.2013 18:28
quelle
1

Das Problem hat nichts mit dem . im temporären Dateipfad zu tun, da Perioden sowohl in Dateinamen als auch in Verzeichnisnamen zulässig sind.

Wie Sie es erwarten, wird beim Öffnen eines Zip-Ordners in der Shell und beim Öffnen einer Datei automatisch der Inhalt in einen temporären Ordner kopiert, der nur ein normaler Ordner ist. Das einzige, was hier seltsam aussieht, ist, dass es den Administrator temporären 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.

    
nemec 10.08.2013 23:34
quelle