2013-07-28 14 views
8

イメージビューアアプリケーションを、Zipフォルダ内の画像ファイル(Windowsエクスプローラを使用してZipファイルを参照する)を直接クリックすると開くことができます。アプリケーションは次のようになり、正しいコマンドラインで実行しているように見える:Zipアーカイブのテンポラリフォルダ内のファイルへのパスを持つUnauthorizedAccessException

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

ファイルには、次のコードで読み取られている:

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

そして例外はその行にスローされます。

例外: "C:\ Users \ Admin \ AppData \ Local \ Temp \ Temp1_Wallpapers.zip \ Wallpaper1.jpg 'のパスへのアクセスが拒否されました。 (System.UnauthorizedAccessException)

System.UnauthorizedAccessExceptionがスローされました:「C:\ Users \ Admin \ AppData \ Local \ Temp \ Temp1_Wallpapers.zip \ Wallpaper1.jpg」へのアクセスが拒否されました。

これは、パスがどのように解釈されるかに問題があると考えました。途中に.zipがありますので、これが問題になるかもしれませんが、解決方法はわかりません。

また、そのパスでファイルを直接開くだけで(ZIPフォルダエクスプローラウィンドウではなく)、同じ例外が発生します。

答えて

2

私はちょうど問題が何かを知った。圧縮フォルダから一時フォルダに抽出されたファイルはread-onlyという属性を持ちますが、私の画像ビューアアプリケーションでは処理できないと思われます。UnauthorizedAccessExceptionを投げます。私はその属性を削除するだけですべてがうまくいくはずです。読み取り専用ファイルを読み込もうとしているのは、アクセス違反です。

+2

いいえ、読み取り専用ファイルの読み取りは許可されていませんが、読み取りに使用しているコードは過度の(読み取り/書き込み)権限を要求しています。それを修正し、エラーは消え去る。 – EricLaw

+0

@EricLawどのようにするかについてのヒント? – user1306322

+2

3番目のパラメータを追加してみてください:FileStreamコンストラクタに 'FileAccess.Read'を追加してください。それは愚かなことだ.Netは、デフォルトでは最も制限的な(ReadWrite)権限を持っているが、そうでなければフォーラムは「なぜ私はファイルストリームに書き込めないの? – nemec

5

Windowsエクスプローラでは、シェル名拡張ハンドラを使用して.zipアーカイブをフォルダとして扱うことができます。このようなハンドラは、シェルの機能を拡張します。しかし、これはシェル関数にのみ制限されています。自動的に低レベルのファイルアクセス関数を同じようにすることはできません。 FileStreamと同様です。

まず、.zipアーカイブからファイルをコピーしてから、FileStreamでファイルを開く必要があります。 SharpZipLibとDotNetZipの周りの多くの.zipサポートライブラリが人気があります。最終的にSystem.IO.Compression.ZipArchiveクラスを使用して.NET 4.5に追加されました。最も将来性のあるサンプルコードの1つを選んでみましょう。

私は、単一のイメージでExample.zipアーカイブを作成し、それを私の一時ディレクトリにコピーしました。このコードは、それを取得し、それの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

完全なパスは通常のフォルダに含まれているように見えますが、単に「.zip」と呼ばれますが、zipフォルダではありません。通常、zipフォルダの内容へのパスはフルパスバーに ".zip"と表示されないので、そうではありません。これがなぜ動作しないのだろうと思う理由です。 – user1306322

+2

それは正常に動作しない、それは私が答えにしようとした点だった。あなたが完全にそれを逃したように聞こえる。あのこんにちは、どうやって助けてくれるのか分からないので、私がお勧めすることをお勧めします。 –

+0

「temp」という単語をフルパスで2回使用するこの一時フォルダは、WindowsエクスプローラでZipフォルダをブラウズするのに比べて普通のフォルダのように見えます。私はそれがあなたが思うものではないことがほとんど確実であることを伝えることが他にどれほどあるかわかりません。 – user1306322

1

期間は、ファイル名だけでなく、ディレクトリ名に法的なので、問題は一時ファイルパスに.とは何の関係もありません。

期待どおり、シェルでZipフォルダを開いてファイルを開くと、通常のフォルダである一時フォルダにコンテンツが自動的に抽出されます。ここで奇妙に見えるのは、管理者一時フォルダが開かれていることだけです。あなたは通常のユーザーとしてexeを実行していますか? exeとシェルが別のユーザーで実行されている場合、exeはシェルが使用する一時フォルダにアクセスできないことがあります。

関連する問題