6

ListViewコントロールの特定のフォルダーのコンテンツを表示するMetroアプリに取り組んでいます。MSは、開発者はSystem.IO.Directoryクラスを必要としないと判断し、フレームワークから完全に削除しました。

メトロスタイルアプリでC#のファイルを列挙するための代替品を探しています。MSが提供するすべての列挙サンプルを確認しましたが、それらはすべてKnownFolders、次のようなクラスを使用してWindowsライブラリのみを列挙しているようです。

StorageFolder picturesFolder = KnownFolders.PicturesLibrary;

必要に応じてGetFilesAsync()またはメソッドを呼び出します。GetFoldersAsync()写真や音楽ライブラリ内でのみ列挙したい場合、これらはすべてゴールドです。ただし、ライブラリに含まれていないディレクトリ上のファイルを列挙しようとしています。

WinRTでこれがどのように可能かは誰でも知っていますか?

4

4 に答える 4

14

設計上、Metroアプリのこの領域は非常に制限されています。アイデアは、Metroアプリには、アクセスが信頼されているものへのアクセスのみが許可されるため、次のいずれかを実行できるということです。

  1. アプリケーションに固有のローカルストレージにアクセスする
  2. いくつかの有名な保管場所にアクセスする、または
  3. 特別に許可された場所にアクセスします。

http://msdn.microsoft.com/en-us/library/windows/apps/hh464959.aspxを参照して、アクセスできるものについてのアイデアを入手してください。

于 2012-05-22T12:10:46.260 に答える
10

http://tirania.org/blog/archive/2011/Sep-15.htmlから:

C#とVBを使用する場合は、完全な.NETFrameworkを使用しています。しかし、彼らは、Windows 8の新しいビジョンを推進するために、APIのより小さなサブセットを開発者に公開することを選択しました。

そして、この新しいビジョンには、安全/サンドボックスシステムと非同期プログラミングが含まれます。これが、ファイルシステムへの直接アクセスやソケットアクセスを取得しない理由であり、使用していた同期APIが公開されない理由です。

さて、あなたは私が「なくなった」ではなく「露出した」と言ったことに気づきました。

彼らが行ったことは、Metroプロファイルをターゲットにしたときに、コンパイラーに一連のAPIのみを公開することでした。したがって、アプリケーションが誤ってFile.Createなどを呼び出すことはありません。ただし、実行時に、CLRはFile.Createを含む完全なクラスライブラリをロードするため、内部的には、CLRはFile.Createのようなものを呼び出すことができ、アクセスできないのはあなただけです。

この分割は、すべてのAPIが公開されているわけではなく、アプリケーションがシステムの安全性を確保する必要がないという権限がmscorlibに与えられている、Silverlightで過去に行われたことと似ています。

いくつかのトリックを使用できると考えているかもしれません(コンパイラ参照の代わりにGACライブラリを参照するか、リフレクションを使用してプライベートAPIにアクセスするか、Win32にP / Invokingします)。ただし、これらの使用はすべてAppStoreレビューアプリケーションによって検出され、Microsoftのストアからアプリを公開することはできません。

あなたはまだあなたのシステムであなたが好きな醜いハックをすることができます。AppStoreを通じてそれを公開することは不可能です。

したがって、おそらく公式の方法はなく、非公式の方法がある場合は、おそらくアプリストアに受け入れられません。

一般的に、これは理にかなっています。ハードドライブをスキャンして、銀行/クレジット情報を含む「budget.xls」スプレッドシートを見つけるためだけに、一見正当なアプリケーションをダウンロードしたくありません。

編集:WinRTのファイルピッカーを介して安全なファイル/フォルダーへの一時的なアクセスを許可することは可能ですが、ユーザーが明示的に呼び出して選択する必要があります。

于 2012-05-22T12:06:48.600 に答える
0

StorageFolder.GetFolderFromPathAsyncメソッドを使用して、パスからStorageFolderインスタンスを取得できます。

StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(@"C:\...");

ただし、マシン上のすべてのパスに対してこれを行う権限がない場合があることに注意してください。

于 2012-05-22T12:07:30.990 に答える
0

同様の状況。解析するChromeブックマークファイルにアクセスしたかった。最初はFileOpenPickerを使用する必要がありましたが、返されるファイルは、後で取得するためにfutureaccesslist(?)に「キャッシュ」できます。

于 2015-10-16T22:01:00.717 に答える