0

私はfolderBrowseDialogを使用して、プログラムがいくつかのファイルを保存する場所をユーザーが選択できるようにしています。アプリケーションが操作できないパスをユーザーが選択できるという問題があります。たとえば、「c:\」(プログラムは管理者ではなくユーザーによって起動されます)

USERが操作できないパスを選択しようとすると、パスを「マイドキュメント」に変更するように提案するプログラムを見たことがありますが、その方法がわかりませんでした。savefiledialogではなくfolderBrowseDialogを使用していることに注意してください。

そのため、FileIOPermissionを使用して、警告を表示するのではないかと思いました。しかし、何らかの理由でそれは機能しません。これは私が書いた簡単なコードですが、例外がスローされることはありません。 MSDNのFileIOPremission

using namespace System::Security::Permissions;

FileIOPermission^ f2 = gcnew FileIOPermission( FileIOPermissionAccess::Write,"C:\\");

try {
    f2->Demand();
}
catch (System::Security::SecurityException^ s){
    MessageBox::Show(s->Message); 
}
4

1 に答える 1

1

あなたはこれで間違った道を進んでいます。はい、FileIOPermission は期待どおりの動作をしません。これは、サンドボックスで実行されるコードを記述できるようにするセキュリティ関連のクラスです。ブラウザーで実行されるコードのように、ユーザーのディスク全体にファイルが飛び散るのを防ぎます。または機密ファイルの読み取り。これはバニラの C++/CLI アプリでは機能しません。完全な信頼で実行され、ユーザーが通常アクセスできるすべてのディレクトリとファイルに制限を追加することなくアクセスできます。余分なものを追加する理由はありません。

ディスクへのファイルの書き込みは、一般に危険な操作です。多くのことがうまくいかない可能性があります。ファイルにアクセスしている他の多くのプロセスを持つオペレーティング システムでコードを実行しています。他のプロセスによって読み取られているファイルを上書きしようとすると、例外が発生します。ディスクがいっぱいになる可能性があります。ユーザーがアクセス権のないディレクトリの名前を入力した可能性があります。これは、もう 1 つの障害モードです。IOException をキャッチして、それについてユーザーに伝えるだけです。

もちろん、制限されたユーザーがよく知っているディレクトリからダイアログでジャーニーを開始してください。彼女の Documents フォルダは、彼女の「ホーム」ディレクトリです。選択したディレクトリにたくさんのファイルをダンプしようとしていることが明らかでない場合は、ディレクトリに他のファイルがある場合は、穏やかなリマインダーを表示します。「えー、何をしたの!」を回避します。彼女がここの Documents ディレクトリに突然多くのファイルがあることに気付いたときの応答。最初の数回。また、わかりやすい名前を付けることができる場合は、独自のサブフォルダーを作成することを躊躇しないでください。日付/時刻を含む名前は通常機能します。

于 2012-04-04T21:12:11.153 に答える