C#で「名前を付けて保存」ダイアログを使ってみた
いわゆる「名前を付けて保存」とか「Save as」のダイアログを使ってみました。
目次
処理の流れ
SaveFileDialogクラスのインスタンスを作って、プロパティを設定する。
インスタンスを表示して、ユーザーに入力させる。
インスタンスのプロパティに選択されたファイル名が入っているので、取り出す。
ファイルに書き込む処理をする。
SaveFileDialogクラス
SaveFileDialogクラスは、ユーザーがファイル名を指定できるコモンダイアログボックスを表示します。 ダイアログでユーザーが指定したファイル名は、FileNameプロパティにフルパスが、SafeFileNameプロパティにファイル名が入ります。それぞれのプロパティの型はstringです。 プロパティがいろいろ設定できます。
プロパティ |
型 |
規定値 |
説明 |
---|---|---|---|
AddExtension |
bool |
true |
ユーザーが拡張子を省略したときに、自動的に拡張子を付けるか。 |
CheckFileExists |
bool |
false |
ユーザーが存在しないファイルを指定したときに、警告するか。 |
CheckPathExists |
bool |
true |
ユーザーが存在しないパスを指定したときに、警告するか。 |
CreatePrompt |
bool |
false |
ユーザーが存在しないファイルを指定したときに、作成の許可を求めるか。 |
CustomPlaces |
IList |
ダイアログ左側のショートカットのリスト。 |
|
DefaultExt |
string |
Empty |
ダイアログに表示するファイルの拡張子。 |
DereferenceLinks |
bool |
false |
ショートカットが参照先を返す場合はtrue。リンクファイルを返す場合はfalse。 |
Filter |
string |
Empty |
ダイアログで表示するファイルの種類のフィルタを指定する文字列。 |
FilterIndex |
int |
1 |
選択されたFilterのインデックス。 |
InitialDirectory |
string |
Empty |
ダイアログの初期ディレクトリ。 |
OverwritePrompt |
bool |
true |
存在するファイルを指定したときに、警告するか。 |
Title |
string |
Empty |
ダイアログのタイトル。 |
ValidateNames |
bool |
false |
ファイル名がWin32に適合するか検査するかどうか。 |
FileName |
string |
Empty |
指定されたファイルのフルパス。 |
SafeFileName |
string |
指定されたファイルにファイル名。 |
このクラスのインスタンスを作って、そのインスタンスのShowDialogメソッドを呼び出してダイアログを表示させます。 メソッドの戻り値は、OKボタンが押されたらtrueで、それ以外はfalseです。
試してみた
テキストブロックに入力した文字列をファイルに保存するアプリを作ってみます。保存するときに、ユーザーにファイル名を指定させます。
XAML
まずはXAMLです。
<Window x:Class="trial_saveas.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:trial_saveas"
mc:Ignorable="d"
Title="MainWindow" Height="100" Width="200">
<Grid>
<StackPanel>
<TextBox Name="textbox" Margin="5" />
<Button Name="button" Content="名前を付けて保存" Margin="5" Click="button_Click"/>
</StackPanel>
</Grid>
</Window>
テキストボックスとボタンが縦に並んでいるだけです。
コード
コードはこうしました。
using System;
using System.Text;
using System.Windows;
using Microsoft.Win32;
using System.IO;
namespace trial_saveas
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.AddExtension = true; // ユーザーが拡張子を省略したときに、自動的に拡張子を付けるか。規定値はtrue。
dlg.CheckFileExists = false; // ユーザーが存在しないファイルを指定したときに、警告するか。規定値はfalse。
dlg.CheckPathExists = true; // ユーザーが存在しないパスを指定したときに、警告するか。規定値はtrue。
dlg.CreatePrompt = false; // ユーザーが存在しないファイルを指定したときに、作成の許可を求めるか。規定値はfalse。
dlg.CustomPlaces = null; // ダイアログ左側のショートカットのリスト。
dlg.DefaultExt = string.Empty; // ダイアログに表示するファイルの拡張子。規定値はEmpty。
dlg.DereferenceLinks = false; // ショートカットが参照先を返す場合はtrue。リンクファイルを返す場合はfalse。規定値はfalse。
dlg.FileName = string.Empty; // 選択されたファイルのフルパス。
dlg.Filter = string.Empty; // ダイアログで表示するファイルの種類のフィルタを指定する文字列。
dlg.FilterIndex = 1; // 選択されたFilterのインデックス。規定値は1。
dlg.InitialDirectory = @"c:\"; // ダイアログの初期ディレクトリ。規定値はEmpty。
dlg.OverwritePrompt = true; // 存在するファイルを指定したときに、警告するか。規定値はtrue。
dlg.Title = "保存するファイル名を入力してください。"; // ダイアログのタイトル。
dlg.ValidateNames = true; // ファイル名がWin32に適合するか検査するかどうか。規定値はfalse。
Nullable<bool> result = dlg.ShowDialog();
if (result == true)
{
string filename = dlg.FileName;
Encoding enc = Encoding.GetEncoding("shift_jis");
try
{
File.WriteAllText(filename, textbox.Text, enc);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
}
}
}
いや、プロパティはいちいち設定しなくてもほとんど規定値でOKですが、試しに設定してみました。 ダイアログがOKボタンで閉じられた場合だけ、テキストボックスのTextプロパティの中身をファイルに保存してます。
公開日
広告
C#の入出力カテゴリの投稿
- C#でCSVファイルを読み込んでコレクションに入れてみた
- C#でInputBoxを使ってみた
- C#で「名前を付けて保存」ダイアログを使ってみた
- C#でクリップボードから文字列を取得する
- C#でクリップボードにデータを入れる
- C#でコマンドライン引数を取得する
- C#でテキストファイルを読んでみた (File.ReadAllText編)
- C#でドロップされたファイルの名前を得る(WPF編 DragOver版)
- C#でドロップされたファイルの名前を得る(WPF編 PreviewDragOver版)
- C#でドロップされたファイルの名前を得る(Windowフォーム編)
- C#でパイプを使ってデータを入力してみる
- C#でメッセージボックスを使う