2013年2月27日水曜日

フォルダを参照するプログラム


フォルダ参照ダイアログボックスを表示し、選択したフォルダにある
サブフォルダをリストに表示するプログラムです。

なぜか、マイ ドキュメントのフォルダを選択すると
サブフォルダのリストを表示するところ( GetDirectories )で
My Music フォルダへのアクセス権が無いとエラーが出ます。
ちなみに OS は Win8です。

下のプログラムではエラーが出た時点で処理を中止していますが
エラーをスキップしてリスト表示を続ける、簡単な方法はないものだろうか。

FolderBrowser.exe  C#  WinDesktop
Form1 に button1 と listBox1 を配置

Form1.cs
=====================================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FolderBrowser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // FolderBrowserDialog の新しいインスタンスを生成する
            FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog();

            // ダイアログの説明を設定する
            folderBrowserDialog1.Description = "フォルダを選択";

            // ルートになる特殊フォルダを設定する (初期値 SpecialFolder.Desktop)
            // folderBrowserDialog1.RootFolder = System.Environment.SpecialFolder.MyDocuments;

            // 初期選択するパスを設定する
            // RootFolder以下にあるフォルダである必要がある
            folderBrowserDialog1.SelectedPath =
                Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

            // [新しいフォルダ] ボタンを表示する (初期値 true)
            folderBrowserDialog1.ShowNewFolderButton = false;

            // ダイアログを表示し、戻り値が [OK] の場合は、選択したディレクトリを表示する
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                MessageBox.Show(folderBrowserDialog1.SelectedPath);

                // 選択したフォルダ以下のサブフォルダをすべて取得する
                // ワイルドカード"*"は、すべてのフォルダを意味する
                try
                {
                    string[] subFolders = System.IO.Directory.GetDirectories(
                        folderBrowserDialog1.SelectedPath, "*",
                        System.IO.SearchOption.AllDirectories);

                    // ListBox1をクリアにする
                    listBox1.Items.Clear();

                    //ListBox1に結果を表示する
                    listBox1.Items.AddRange(subFolders);
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            // 不要になった時点で破棄する
            folderBrowserDialog1.Dispose();
        }
    }
}
=======================================================================


0 件のコメント:

コメントを投稿