2012-04-04 8 views
0

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

私は自分のパスを変更することを提案するプログラムを見ましたユーザーが操作できないパスを選択しようとするたびに「マイドキュメント」に移動しますが、どのように操作するのか把握できませんでした。 私はsaveFiledialogではなくfolderBrowseDialogを使用していることに注意してください。

だから、FileIOPermissionを使用して警告が表示されることがあります。一部のreasoneでは動作しません。ここに私が書いたクイックコードがありますが、例外はスローされません。 FileIOPremission on MSDN

using namespace System::Security::Permissions; 

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

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

答えて

1

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

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

確かに、制限されたユーザーがよく知っているディレクトリからダイアログ内を移動してください。彼女のドキュメントフォルダは彼女の "ホーム"ディレクトリです。選択したディレクトリにファイルをたくさんダンプすることが明らかでない場合は、ディレクトリ内に他のファイルがあれば、丁寧なリマインダを表示してください。 "Eek、あなたは何をしたのですか?"彼女がここでドキュメントディレクトリが突然多くのファイルを持っていることがわかったときの応答。最初の数回。わかりやすい名前を付けることができたら、自分自身のサブフォルダを作成することを躊躇しないでください。これは起こりません。日付/時刻が入っている名前は、通常動作します。

+0

あなたの答えはそれほど役に立ちません。私はちょうど画面撮影を保存する簡単なプログラムを作成しようとしています。私はこのフォルダに書き込むかどうかを確認する方法を尋ねました。 –

+0

ええと、私はそれに答えました。 IOExceptionをキャッチします。 DirectoryInfo :: GetAccessControl()を使用すると、任意に複雑にすることができます。それは多くのコードを追加しますが、あなたが正面を調べることができない他の理由のために例外をキャッチする必要からあなたを止めることはありません。その答えがなぜ役立ったのかを理解するためには、そのコードを記述する必要があります。 –

関連する問題