型 | プロパティ | 内容 | 既定値 |
---|---|---|---|
string | InitialDirectory | 最初に表示されるディレクトリ | |
string | Title | ファイル ダイアログボックスのタイトル。これが空文字列ならば、「名前を付けて保存」または「開く」となる | |
bool | RestoreDirectory | trueならば、ダイアログが閉じられるときに現在のディレクトリを以前のものに復元する。falseならば現在のディレクトリが更新されるため、次回ダイアログを開いたときは最後に表示していたディレクトリが表示される | false |
string | FileName | ダイアログで選択されたファイル名。ダイアログ表示前にこれを指定すると、初期値として提示できる
ディレクトリも含めて設定するとその全体がファイル名として表示されるため、ディレクトリを指定したいならばInitialDirectoryプロパティを用いる。 |
|
string[] | FileNames | ダイアログで選択されたすべてのファイル名 | |
bool | AddExtension | trueならば、拡張子が指定されなかったときに自動で付加する | true |
string | DefaultExt | 既定の拡張子 |
値を設定しない場合は、一般的に次のパスが利用されます。FileDialog.InitialDirectory プロパティ (System.Windows.Forms) | MSDN
たとえばInitialDirectoryを指定せず、くり返しダイアログを開いた場合、
OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.ShowDialog(); openFileDialog.ShowDialog();
最初に何らかのファイルを選択してダイアログを閉じると、次にはそのファイルがある場所が初期ディレクトリとして表示されます。一方でファイルを選択しないでダイアログを閉じると、次も同じ場所が初期ディレクトリとして表示されます。
これが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とするか、作業ディレクトリに依存しないようにします。
ダイアログに表示するファイルを制限するフィルタを指定できます。フィルタの説明とその文字列は「|」で区切り、複数のフィルタを指定する場合にはそれも「|」で区切ります。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);
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 = new OpenFileDialog(); openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; openFileDialog.Multiselect = true; if (openFileDialog.ShowDialog() == DialogResult.OK) { string[] filenames = openFileDialog.FileNames; }
ユーザにファイルを保存する位置を選択するように促せます。
型 | プロパティ | 内容 | 既定値 |
---|---|---|---|
bool | CreatePrompt | trueならば、指定されたファイルが存在しないとき作成を確認する | false |
bool | OverwritePrompt | trueならば、指定されたファイルが存在するとき上書きを確認する | true |
Filterプロパティで提示したフィルタが選択されたとき、既定ではFileNameプロパティにそれが追加されます。この挙動は、AddExtensionやCheckFileExistsプロパティの設定によって異なります。
戻り値 | メソッド | 機能 |
---|---|---|
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();
}
}