0

出力ファイル名を選択するためのカスタム コントロールを作成しました。典型的なものは、ファイル名のテキスト ボックス、「参照」ボタン、およびアプリケーション固有のその他の機能です。

ファイル名によってテキストボックスの色が変わります。ファイルの場所に書き込めない場合は、赤色になります。ファイルが既に存在する場合は、黄色に変わります。それ以外の場合は、システムが割り当てた色のままです。

ファイルが存在するかどうかを確認するには、IO.File.Exists を使用します。簡単です。

「ファイルに書き込むことができる場合」を、ファイルが実際に開かれ、何かが書き込まれ、閉じられ、削除される単純な try-catch ブロックとして実装しました。いずれかの時点で例外がスローされた場合、ユーザーがそのファイル名を使用できないことがわかっているので、テキスト ボックスを赤にします。

これはキャッチオールです。やろうとしている実際の操作を行っているので、フールプルーフです。しかし、それが可能かどうかを確認するためだけに、狂ったようにファイルを作成および削除するソフトウェアを用意するのは無責任に思えます。

私の質問は、ファイルを作成せずにこの機能を複製するにはどうすればよいですか? 私がしなければならないことがわかります:

  1. パスの正当性を確認してください (たとえば、「z:」は有効なファイル名ではありません)。これには、パスを解析し、すべてのディレクトリが存在することを確認する必要があります。
  2. 場所が存在する場合は、書き込み権限を確認する必要があります。(この目的のために、いくつかの回答済みの質問が存在します。)

他に何かありますか?

編集

数分以内に、実際の書き込みが行われる前に、ファイルにアクセスできることを私がまったくチェックしていないことを批判する回答がすでに投票されていることがわかります。私の質問から「離れて」、それを達成するためのまったく異なる方法があるかどうかを確認する専門家に感謝しますが、それを行うべきではないと言うことは、私の質問に対する答えではありません。

それでは、私のアプリケーションについて詳しく説明しましょう (同時に何百人ものユーザーがいるとは思っていません)。

私はこのファイル チューザー コントロールをデータ取得アプリケーションで使用しています。多くの場合、実行しようとしているテストは何らかの形で「高価」です。したがって、非常に慎重に設定することが重要です。データの上書きは非常にコストがかかる可能性があります (恐れのあるユーザーのために、日付と時刻をミリ秒単位でファイル名に追加するチェックボックスがあります)。

したがって、インジケーターの色の目的は、ソフトウェアがファイルに書き込むことができることを確実に知る方法を提供することではありません (そのチェックは、実際に必要なときに実行されます)。少なくとも彼はファイル名を正しく設定しているので、先に進んでも古いデータを上書きしないことが保証されており、土壇場での IO エラー (ファイル名のタイプミス) によって実験が記録されずに実行されることはほぼないと確信しています。

4

2 に答える 2

5

これをお勧めします-ユーザーがアクションをコミットする前に何もチェックしないでください。現在のアプローチでは、ファイルに問題がないことを確認したとしても、ユーザーが実際にファイルへの書き込みをコミットすると、5 秒後にロックされる可能性があります。事前チェックを行っても、ユーザーは成功と推定されるという誤った印象を与えるだけです。特に、100 人以上の同時ユーザーがいるターミナル サーバーでは、この点を考慮してください。

Retry/Cancel/etc でプロンプトを表示しても問題ありません。アクセスがない場合は、ユーザーに決定させます。

編集:

問題はありませんが、そのような衝突の処理方法に関する標準があります。Windows の標準では、ユーザーにプロンプ​​トを表示します。また、これも考慮してください - フォルダーへの書き込みアクセスが突然拒否された場合、これは想定外であり、おそらく別のシステム/ネットワーク管理者を雇う必要があります。

手術に費用がかかる場合は、この人に十分な報酬が支払われるようにしてください。さぁ、執筆中にネットワークがダウンしたら?ハードドライブ?ルーター?ファイルへの書き込みが中断される理由は多数あります。そのための準備をしておく必要があります。余裕がない場合は、優れたインフラストラクチャとそれをサポートする優れた人材に投資したことを確認してください。

実際には、ファイルのロックが成功する可能性を高めることができます。

  • 日時ベースのハッシュをサフィックス/プレフィックスとして使用して、一意のファイル名を選択します。
  • とも呼ばれるユーザーのホーム ディレクトリに書き込み%UserProfile%ます。成功する可能性があります。
于 2013-10-13T00:15:29.750 に答える