第15回 設定ファイルを作成する

今回はxml形式での設定ファイルの保存/読み込み処理を作成します。
保存項目は現状では再生するフォルダ名と音量の2項目だけ。

「プロジェクト」メニューにある「クラスの追加」で「Option.cs」を追加して「Option」クラスを作成。
そこへ設定項目のプロパティと保存/読み込み処理を追加、
Form1内でそれを使うようにします。

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Windows.Forms;
using WMPLib;

namespace MP3Player
{
	public partial class Form1 : Form
	{
		WindowsMediaPlayer _mediaPlayer = new WindowsMediaPlayer();

		Timer _timer = new Timer();

		public static Option _option = new Option();		//追加


		class AudioItem
		{
			public string strFile = "";
			public int nEntryIndex = -1;

			public AudioItem(string strFile, int nEntryIndex = -1)
			{
				this.strFile = strFile;
				this.nEntryIndex = nEntryIndex;
			}
		}


		List<AudioItem> _listFiles;			//音楽ファイル一覧
		int _nCurrentIndex = -1;			//↑へのインデックス


		List<int> _listPlayHistory = new List<int>();		//過去の再生曲
		List<int> _listPlayNext = new List<int>();			//未来の再生曲。なければランダム


		bool _bStopButtonPushed = false;	//「停止」ボタンを押したらtrue

		public Form1()
		{
			InitializeComponent();

			//追加
			//設定の読み込み
			Option.Load(out _option, Utility.GetExeFolder() + "option.txt");

			Utility.CreateTmpFolder();			//tmpフォルダの作成

			//変更
			//mp3フォルダからの音楽ファイルリスト読み込み
			_listFiles = EnumFiles(_option.strFolder);


			//フォームが表示されたときの処理
			Shown += delegate
			{
				//シークバーにフォーカスがあると、再生位置が表示されないのでここで再生ボタンにフォーカスを与える
				buttonPlay.Focus();
			};


			//終了時処理
			FormClosed += delegate
			{
				Utility.CleanTempFolder();			//tmpフォルダ内の削除

				//追加
				//設定の保存
				_option.Save(Utility.GetExeFolder() + "option.txt");
			};


			//再生位置のシーク
			trackBarSeek.ValueChanged += delegate
			{
				if (trackBarSeek.Focused)
				{
					_mediaPlayer.controls.currentPosition = (double)trackBarSeek.Value / 100;
				}
			};


			//音量の調節
			_mediaPlayer.settings.volume = _option.nVolume;				//変更
			trackBarVolume.Maximum = 100;			//音量はゼロから100
			trackBarVolume.Value = _mediaPlayer.settings.volume;
			trackBarVolume.ValueChanged += delegate
			{
				_option.nVolume = (int)trackBarVolume.Value;		//追加
				_mediaPlayer.settings.volume = _option.nVolume;		//変更
			};


			_timer.Interval = 300;			//300msecごとに処理を実行
			_timer.Tick += delegate
			{
				if (_mediaPlayer.playState == WMPPlayState.wmppsPlaying || _mediaPlayer.playState == WMPPlayState.wmppsPaused)
				{
					trackBarSeek.Maximum = (int)(_mediaPlayer.controls.currentItem.duration * 100);
					//シークバーにフォーカスがないときだけ再生位置を表示する
					if (trackBarSeek.Focused == false)
					{
						try
						{
							//シークバーに再生位置を表示
							//曲変更タイミングによっては例外出る可能性ある
							trackBarSeek.Value = (int)(_mediaPlayer.controls.currentPosition * 100);
						}
						catch (Exception)
						{
						}
					}

					//再生時間の表示
					labelTime.Text = _mediaPlayer.controls.currentPositionString;
				}

				//止まっていたら再び再生。ただし停止ボタンが押されている場合は無視
				if (_mediaPlayer.playState == WMPPlayState.wmppsStopped)
				{
					if (_bStopButtonPushed == false)
						Play();
				}
			};
			_timer.Start();


			_mediaPlayer.PlayStateChange += delegate(int nNewState)
			{
				WMPPlayState state = (WMPPlayState)nNewState;

				switch (state)
				{
					case WMPPlayState.wmppsStopped:
						buttonPlay.Text = ">";
						trackBarSeek.Value = 0;
						break;

					case WMPPlayState.wmppsPaused:
						_timer.Stop();
						buttonPlay.Text = ">";
						break;

					case WMPPlayState.wmppsPlaying:
						_bStopButtonPushed = false;
						buttonPlay.Text = "||";
						_timer.Start();
						break;

					case WMPPlayState.wmppsTransitioning:
						break;
				}
			};

			Play();
		}

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace MP3Player
{
	[Serializable]
	public class Option
	{

		public int nVolume
		{
			get { return _nVolume; }
			set { _nVolume = value; }
		}
		int _nVolume = 20;


		public string strFolder
		{
			get { return _strFolder; }
			set { _strFolder = value; }
		}
		string _strFolder = @"G:\Desktop\mp3\";




		/// <summary>
		/// このクラスをXMLとして保存
		/// </summary>
		public bool Save(string strFilePath)
		{
			try
			{
				XmlSerializer serializer = new XmlSerializer(typeof(Option));
				using (FileStream fs = new FileStream(strFilePath, FileMode.Create))
				{
					serializer.Serialize(fs, this);
					fs.Close();
				}
				return true;
			}
			catch (Exception)
			{
			}
			return false;
		}



		/// <summary>
		/// このクラスをXMLから読み込み
		/// </summary>
		/// <returns>成功時true、失敗時false=new Option()で返す</returns>
		public static bool Load(out Option option, string strFilePath)
		{
			try
			{
				//↓で例外が発生するが、無視してOK 「型 'System.IO.FileNotFoundException' の初回例外が mscorlib.dll で発生しました」
				//http://yk.tea-nifty.com/netdev/2009/03/xmlserializer-a.html
				XmlSerializer serializer = new XmlSerializer(typeof(Option));
#if DEBUG
				Debug.WriteLine("↑'System.IO.FileNotFoundException'の例外が発生しても無視してOK");
#endif
				using (FileStream fs = new FileStream(strFilePath, FileMode.Open, FileAccess.Read))
				{
					option = (Option)serializer.Deserialize(fs);
					fs.Close();
				}

				return true;
			}
			catch (Exception)
			{
			}
			option = new Option();		//失敗時は新しいのを作る
			return false;
		}

	}
}

プロジェクトファイルをダウンロード


カテゴリー「MP3プレーヤーを作る(C#)」 のエントリー