C#で「名前を付けて保存」ダイアログを使ってみた

いわゆる「名前を付けて保存」とか「Save as」のダイアログを使ってみました。

目次

  1. 処理の流れ
  2. SaveFileDialogクラス
  3. 試してみた
    1. XAML
    2. コード
    3. 動かしてみた

処理の流れ

  1. SaveFileDialogクラスのインスタンスを作って、プロパティを設定する。

  2. インスタンスを表示して、ユーザーに入力させる。

  3. インスタンスのプロパティに選択されたファイル名が入っているので、取り出す。

  4. ファイルに書き込む処理をする。

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プロパティの中身をファイルに保存してます。

動かしてみた

実行するとこういうアプリが起動します。 image0 ちょっと小さすぎました。 ボタンを押すとこんな感じでダイアログが開きます。 image1 そして、ファイルを指定してOKすると、テキストボックスの中身がファイルに保存されます。 image2

公開日

広告