This article is currently in the process of being translated into Japanese (~97% done).
The SaveFileDialog
SaveFileDialog はファイルを保存する時にその格納場所とファイル名の指定に役立ちます。その動作と見た目は、前の記事で扱った OpenFileDialog といくつかの微妙な部分を除いてよく似ています。OpenFileDialog と同じ様に、SaveFileDialog は共通のウィンドウズダイアログのラッパーであり、ユーザーは、あなたのアプリケーションや例えばノートパッドを使った時にだいたい同じようなダイアログを見ています。
単純な SaveFileDialog のサンプル
最初に、SaveFileDialog を使った大変簡単なサンプルから始めましょう。
<Window x:Class="WpfTutorialSamples.Dialogs.SaveFileDialogSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SaveFileDialogSample" Height="300" Width="300">
<DockPanel Margin="10">
<WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
<Button Name="btnSaveFile" Click="btnSaveFile_Click">Save file</Button>
</WrapPanel>
<TextBox Name="txtEditor" TextWrapping="Wrap" AcceptsReturn="True" ScrollViewer.VerticalScrollBarVisibility="Auto" />
</DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;
namespace WpfTutorialSamples.Dialogs
{
public partial class SaveFileDialogSample : Window
{
public SaveFileDialogSample()
{
InitializeComponent();
}
private void btnSaveFile_Click(object sender, RoutedEventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
if(saveFileDialog.ShowDialog() == true)
File.WriteAllText(saveFileDialog.FileName, txtEditor.Text);
}
}
}
このサンプルでは、SaveFileDialog のインスタンス化と ShowDialog() メソッドの呼び出しを行っています。もしメソッドの戻り値が真なら、 FileName プロパティ(これはユーザーの入力したファイル名と選んだパスを保持しています)をコンテンツを書き込むためのパスとして使います。
save ボタンをクリックすると、使っているウィンドウズのバージョンにもよりますが、次のようなダイアログが表示されます。
フィルタ
最初の例では、"Save as type" コンボボックスが空なので、セーブするファイル名に手動で .TXT 拡張子を追加しています。OpenFileDialog ダイアログと同じ様にこのコンボボックスは Filter プロパティによって制御され、全く同じ意味で使われます。
saveFileDialog.Filter = "Text file (*.txt)|*.txt|C# file (*.cs)|*.cs";
Filter プロパティの書式の詳細については、前の OpenFileDialog についての記事に詳しい説明がありますので、そちらを参照してください。
上記のような Filter を使うと、SaveFileDialog は次のようになります。
こすれば、拡張子の指定なしにファイル名を書けます。拡張子にはフィルタコンボボックスで指定されたものが使われます。これはアプリケーションでサポートしているファイルフォーマットを示す意味もあります。これは重要なことです。
初期ディレクトリの設定
SaveFileDialog で使われる初期ディレクトリはWindowsによって決められますが、InitialDirectory プロパティを使えば変更できます。普通はこの値をユーザーの指定したディレクトリやアプリケーションのディレクトリ、またはユーザーが最後に使ったディレクトリに設定します。この値は次のようにパスを文字列で指定します。
saveFileDialog.InitialDirectory = @"c:\temp\";
Windowsフォルダや My Documents フォルタ、Program Files ディレクトリ等の特別なフォルダを使う場合は特別な注意をしなければなりません。何故ならそれらはウィンドウズのバージョンや、どのユーザーがログインしているかによって変わるかもしれないからです。しかし .NET フレームワークの Environment クラスを使えば、そのメンバが特別なフォルダについて対応してくれます。
saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
この場合、My Documents フォルダのパスを取得しています。しかし、特別フォルダの一覧表を見てみると、興味深いパスがたくさん含まれています。全てのパスを知るには、ここを参照して下さい。 MSDN article
オプション
この記事ですでに紹介したオプションのほかに、以下の SaveFileDialog を必要に合わせてカスタマイズできるプロパティについても注目してほしい。
AddExtension - デフォルトは true で、ユーザーが拡張子を省略した場合に SaveFileDialog が自動的にファイル名に拡張子を追加するかどうかを決めます。拡張子は選択したフィルタに基づきますが、それが不可能な場合は、DefaultExt プロパティにフォールバックされます(指定されている場合)。アプリケーションで拡張子なしでファイルを保存したい場合は、このオプションを無効に知る必要があります。
OverwritePrompt - デフォルトは true で、SaveFileDialog がユーザーが既存のファイルを指定した場合に上書きする事を確認するかどうかを決めます。通常、特殊な場合を除いてこのオプションは有効のままにしておきます。
Title - ダイアログに任意のタイトルを付けたいときに上書きすると良いでしょう。デフォルトは "Save As" またはローカライズされた同等のものです。このプロパティは OpenFileDialog でも有効です。
ValidateNames - デフォルトは true で、無効にしない限り、ユーザーにウィンドウズの有効なファイル名を入力しないと続行しないようにします。