私は、ファイルシステム上の設定可能な場所からjpegおよびpdfファイルを読み取るアプリを開発しています。現在、WPFで実行中のバージョンが実装されており、現在、新しいWindowsユニバーサルアプリに移行しようとしています。
次のコードはWPFで正常に機能します。
public IList<string> GetFilesByNumber(string path, string number)
{
if (string.IsNullOrWhiteSpace(path))
throw new ArgumentNullException(nameof(path));
if (string.IsNullOrWhiteSpace(number))
throw new ArgumentNullException(nameof(number));
if (!Directory.Exists(path))
throw new DirectoryNotFoundException(path);
var files = Directory.GetFiles(path, "*" + number + "*",
SearchOption.AllDirectories);
if (files == null || files.Length == 0)
return null;
return files;
}
ユニバーサルアプリを使用すると、いくつかの問題が発生しました。
Directory.Exists
利用できませんアプリストレージ以外の別のディレクトリから読み取るために、次のことを試しました。
StorageFolder folder = StorageFolder.GetFolderFromPathAsync("D:\\texts\\");
var fileTypeFilter = new string[] { ".pdf", ".jpg" };
QueryOptions queryOptions = new QueryOptions(CommonFileQuery.OrderBySearchRank, fileTypeFilter);
queryOptions.UserSearchFilter = "142";
StorageFileQueryResult queryResult = folder.CreateFileQueryWithOptions(queryOptions);
IReadOnlyList<StorageFile> files = queryResult.GetFilesAsync().GetResults();
問題は次のとおりです。機能していませんが、例外が発生します。
タイプ「System.UnauthorizedAccessException」の例外がTextManager.Universal.DataAccess.dllで発生しましたが、ユーザーコードでは処理されませんでした追加情報:アクセスが拒否されました。 (HRESULTからの例外:0x80070005(E_ACCESSDENIED))
マニフェストでいくつかのアクセス許可を構成する必要があることは知っていますが、ファイルシステムに適したものを見つけることができませんIO操作...
誰かがそのような問題/可能な解決策を持っていますか?
解決策:@Rico Suterから提供されたソリューションから、FolderPickerと組み合わせてFutureAccessListを選択しました。プログラムの再起動後、トークンを使用してエントリにアクセスすることもできます。
X Guidlines およびこれ Githubサンプル もお勧めします。
どうもありがとうございました!
UWPアプリでは、次のファイルとフォルダーにのみアクセスできます。
D:\
内のすべてのファイルにアクセスする必要がある場合、ユーザーはFolderPickerを使用してD:\
ドライブを手動で選択する必要があり、このドライブ内のすべてにアクセスできます...
UPDATE:
Windows 10ビルド17134(2018年4月更新、バージョン1803)は、UWPアプリ用の追加のファイルシステムアクセス機能を追加しました:
AppExecutionAlias
を宣言するUWPアプリ(通常のウィンドウアプリまたはコンソールアプリ)は、現在の作業ディレクトリ内のファイルおよびフォルダーへの暗黙的なアクセスを許可されます。現在の作業ディレクトリは、ユーザーがAppExecutionAliasの実行を選択したファイルシステムの場所にあります。
新しいbroadFileSystemAccess
機能は、ファイルピッカースタイルのプロンプトなしで現在アプリを実行しているユーザーと同じファイルシステムへのアクセスをアプリに許可します。このアクセスは、次の方法でマニフェストに設定できます。
xmlns:rescap="http://schemas.Microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
...
IgnorableNamespaces="uap mp uap5 rescap">
...
<Capabilities>
<rescap:Capability Name="broadFileSystemAccess" />
</Capabilities>
これらの変更とその意図は、MSDN Magazineの記事 niversal Windows Platform-Closing UWP-Win32 Gaps で詳しく説明されています。記事では、次のことに注意しています。
制限された機能を宣言すると、公開のためにストアにパッケージを送信するときに追加の精査がトリガーされます。 ...この機能があれば、
AppExecutionAlias
は必要ありません。これは非常に強力な機能であるため、Microsoftはアプリ開発者が要求の説得力のある理由、これの使用方法の説明、ユーザーにとってのメリットの説明を提供する場合にのみ機能を許可します。
さらに:
broadFileSystemAccess
機能を宣言する場合、より狭いスコープのファイルシステム機能(ドキュメント、画像、またはビデオ)を宣言する必要はありません。実際、アプリはbroadFileSystemAccess
と他の3つのファイルシステム機能のいずれも宣言してはなりません。
最後に:
アプリに機能が許可された後でも、ランタイムチェックも行われます。これは、ユーザーのプライバシーの懸念を構成するためです。他のプライバシー問題と同様に、アプリは最初の使用時にユーザー同意プロンプトをトリガーします。ユーザーが許可を拒否することを選択した場合、アプリはこれに対して回復力がなければなりません。
受け入れられた答えは完全ではありません。アプリマニフェストでbroadFileSystemAccess
を宣言して、ファイルシステムを任意に読み取ることができるようになりました。
ファイルアクセス許可 ページに詳細があります。
ユーザーは、設定アプリを介してこの許可を取り消すことができます。
これは制限された機能です。アクセスはSettings> Privacy> File systemで設定できます。アプリのアクセスを有効にします。ユーザーは[設定]でいつでも許可を許可または拒否できるため、アプリがこれらの変更に対して回復力があることを確認する必要があります。アプリにアクセス権がないことがわかった場合は、Windows 10ファイルシステムへのアクセスとプライバシーに関する記事へのリンクを提供して、ユーザーに設定の変更を促すことを選択できます。ユーザーはアプリを閉じ、設定を切り替え、アプリを再起動する必要があることに注意してください。アプリの実行中に設定を切り替えると、プラットフォームはアプリを一時停止して状態を保存できるようにし、新しい設定を適用するためにアプリを強制終了します。 2018年4月の更新では、アクセス許可のデフォルトはオンです。 2018年10月の更新では、デフォルトはオフです。
これは正しくありません:ファイル拡張子の関連付けまたは共有を介して開かれたファイルは、メール(Outlook)またはデスクトップからファイルを開いて試してみてください...ファイルによって権限を付与する必要があります。ピッカー。だからこれは...
MSDNドキュメントによると、「ファイルピッカーにより、アプリはファイルとフォルダーにアクセスし、ファイルとフォルダーを添付し、ファイルを開き、ファイルを保存できます。」
https://msdn.Microsoft.com/en-us/library/windows/apps/hh465182.aspx
標準のユーザーインターフェイスを介して、filepickerを使用してファイルを読み取ることができます。
よろしく