FileDialog

クラス階層

  • System.ComponentModel.Component
    • System.Windows.Forms.CommonDialog
      • System.Windows.Forms.FileDialog
        • System.Windows.Forms.OpenFileDialog
        • System.Windows.Forms.SaveFileDialog
      • System.Windows.Forms.FolderBrowserDialog
継承階層 - FileDialog クラス (System.Windows.Forms) | MSDN

プロパティ

プロパティ 内容 既定値
string InitialDirectory 最初に表示されるディレクトリ  
string Title ファイル ダイアログボックスのタイトル。これが空文字列ならば、「名前を付けて保存」または「開く」となる  
bool RestoreDirectory trueならば、ダイアログが閉じられるときに現在のディレクトリを以前のものに復元する。falseならば現在のディレクトリが更新されるため、次回ダイアログを開いたときは最後に表示していたディレクトリが表示される false
string FileName ダイアログで選択されたファイル名。ダイアログ表示前にこれを指定すると、初期値として提示できる

ディレクトリも含めて設定するとその全体がファイル名として表示されるため、ディレクトリを指定したいならばInitialDirectoryプロパティを用いる。

 
string[] FileNames ダイアログで選択されたすべてのファイル名  
bool AddExtension trueならば、拡張子が指定されなかったときに自動で付加する true
string DefaultExt 既定の拡張子  
プロパティ - FileDialog クラス (System.Windows.Forms) | MSDN

InitialDirectory

値を設定しない場合は、一般的に次のパスが利用されます。FileDialog.InitialDirectory プロパティ (System.Windows.Forms) | MSDN

  • プログラムで以前に使用したパス
  • アプリケーション設定、レジストリ、文字列リソースなどの永続的なソースから読み込んだパス
  • Program Filesなどの標準的なWindowsシステムや、MyDocumentsなどのユーザーパス
  • 起動ディレクトリなど現在のアプリケーションに関連するパス

たとえばInitialDirectoryを指定せず、くり返しダイアログを開いた場合、

OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.ShowDialog();
openFileDialog.ShowDialog();

最初に何らかのファイルを選択してダイアログを閉じると、次にはそのファイルがある場所が初期ディレクトリとして表示されます。一方でファイルを選択しないでダイアログを閉じると、次も同じ場所が初期ディレクトリとして表示されます。

RestoreDirectory

これがfalseだとディレクトリが復元されず、現在の作業ディレクトリが変更されることがあります。 Remarks - FileDialog Class (System.Windows.Forms) | Microsoft Learn .net - Why does OpenFileDialog change my working directory? - Stack Overflow

string dir1 = Directory.GetCurrentDirectory();

OpenFileDialog openFileDialog = new OpenFileDialog()
{
    RestoreDirectory = false
};
openFileDialog.ShowDialog();

string dir2 = Directory.GetCurrentDirectory(); // ユーザーによって選択されたディレクトリになることがある

よってこの動作が問題となるならばRestoreDirectoryをtrueとするか、作業ディレクトリに依存しないようにします。

Filter

ダイアログに表示するファイルを制限するフィルタを指定できます。フィルタの説明とその文字列は「|」で区切り、複数のフィルタを指定する場合にはそれも「|」で区切ります。FileDialog.Filter プロパティ (System.Windows.Forms) | MSDN

Text files (*.txt)|*.txt|All files (*.*)|*.*

指定が複雑になる場合には、次のように記述するとまとまります。

string AudioFomat = "*.wav;*.mp3";
string VideoFomat = "*.avi;*.mp4";

string[] filters = new string[]
{
    string.Format( "All supported files ({0};{1})|{0};{1}", AudioFomat, VideoFomat ),
    string.Format( "Audio Files ({0})|{0}", AudioFomat ),
    string.Format( "Video Files ({0})|{0}", VideoFomat ),
    "All files (*.*)|*.*"
};

string filter = string.Join( "|", filters);

メソッド

ShowDialog()

InitialDirectoryで指定されているパスが存在しないと、このメソッドの呼び出し時に「指定されたファイルが見つかりません。」としてFileNotFoundExceptionが投げられます。c# - OpenFileDialog throwing System.IO.FileNotFoundException before it shows the browse dialog - Stack Overflow

RestoreDirectoryがfalseだとダイアログが閉じられるときに現在のディレクトリが更新されるため、そこで存在するパスを指定すれば、再びShowDialog()を呼び出してもFileNotFoundExceptionは投げられません。

また「System.IO.FileNotFoundException: ファイルまたはアセンブリ 'SharpShell, Version=*.*.*.*, Culture=neutral, PublicKeyToken=f14dc899472fe6fb'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。」としてMDAのBindingFailureが検出されることもあります。そのときデバッガの設定で[ネイティブ コード デバッグを有効にする]をチェックすると、「0x00007FFD017D837A (KernelBase.dll) で例外がスローされました (***.exe 内): 0x000006BA: RPC サーバーを利用できません。(The RPC server is unavailable.)」となります。

派生クラス

OpenFileDialogクラス

ユーザーにファイルを開くように促す、標準的なダイアログボックスを表示できます。

OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
openFileDialog.Multiselect = true;

if (openFileDialog.ShowDialog() == DialogResult.OK)
{
    string[] filenames = openFileDialog.FileNames;
}

SaveFileDialog クラス

ユーザにファイルを保存する位置を選択するように促せます。

プロパティ
プロパティ 内容 既定値
bool CreatePrompt trueならば、指定されたファイルが存在しないとき作成を確認する false
bool OverwritePrompt trueならば、指定されたファイルが存在するとき上書きを確認する true

Filterプロパティで提示したフィルタが選択されたとき、既定ではFileNameプロパティにそれが追加されます。この挙動は、AddExtensionやCheckFileExistsプロパティの設定によって異なります。

  • CheckFileExistsが、true
    • 一致するファイルがある … Filterプロパティの最初の値
    • 一致するファイルがない … DefaultExtプロパティの値
  • CheckFileExistsが、false
    • Filterプロパティに有効な拡張子がある … Filterプロパティの最初の値
    • Filterプロパティに有効な拡張子がない … DefaultExtプロパティの値
メソッド
戻り値 メソッド 機能
Stream OpenFile() FileNameプロパティの名前で、読み書き用にファイルを作成する。追記はできないため、そのような用途ではFileクラスを用いる
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "txt files (*.txt)|*.txt";

if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
    System.IO.Stream stream = saveFileDialog.OpenFile();
    if (stream != null)
    {
        //
        stream.Close();
    }
}
Microsoft Learnから検索