public void GetChildDirectories(string path, ref DirectoryInfos category) { var categories = new ObservableCollection<DirectoryInfos>(); string[] directories = new string[0]; try { directories = Directory.GetDirectories(path); } catch { } foreach (string directory in directories) { var attributes = new DirectoryInfo(directory).Attributes; if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden) { // 隠しファイルは対象外とする continue; } var directoryName = Path.GetFileName(directory); var categoryChild = new DirectoryInfos(); categoryChild.DirectoryName = directory; categoryChild.Name = directoryName; categories.Add(categoryChild); } category.SubDirectories = categories; }
public ObservableCollection<DirectoryInfos> GetDirectories(string path) { var categories = new ObservableCollection<DirectoryInfos>(); var directories = Directory.GetDirectories(path); foreach (string directory in directories) { var attributes = new DirectoryInfo(directory).Attributes; if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden) { // 隠しファイルは対象外とする continue; } var directoryName = Path.GetFileName(directory); var category = new DirectoryInfos(); category.DirectoryName = directory; category.Name = directoryName; GetChildDirectories(directory, ref category); categories.Add(category); } return categories; }
public void Initialize() { // *** ルートディレクトリ情報を作成したい *** var rootCategory = new DirectoryInfos(); rootCategory.DirectoryName = @"C:\"; rootCategory.Name = "C:"; // ルートディレクトリ配下のサブディレクトリ情報を作成 Model.GetInstance().DirectoryInfo.GetChildDirectories(@"C:\", ref rootCategory); // TreeViewに反映 Directories.Add(rootCategory); // *** 前回選択されたディレクトリ位置まで自動展開したい *** // 現在選択されているディレクトリ名を\で分割する var selectedDirectoryNames = DirectoryInfos.SelectedDirectoryName.Split('\\'); // ルートかどうかを知るためのフラグ bool isFirst = true; // ルートから1つずつディレクトリ階層の奥に進んでいくことを示すディレクトリ名 // (例) // 1回目:"C:\" // 2回目:"C:\Users" // 3回目:"C:\Users\atsushi" var targetDirectoryName = string.Empty; if (selectedDirectoryNames.Length <= 1) { // ここにくるということは、選択されたディレクトリがルートとなる // ルートなら展開する必要がないので以下の処理をしない return; } // 最後のサブディレクトリは展開の必要がないため要素を1つ減らす Array.Resize(ref selectedDirectoryNames, selectedDirectoryNames.Length - 1); // 下記ループ内で動的に変更されるディレクトリ情報 // ループが進むたびに次のサブディレクトリを指す var nowDirectoryInfos = new ObservableCollection<DirectoryInfos>(); foreach (var selectedDirectoryName in selectedDirectoryNames) { targetDirectoryName += selectedDirectoryName; if (isFirst) { // ルートなので特別処理 targetDirectoryName += @"\"; nowDirectoryInfos = Directories; } var targetDirectoryInfos = new DirectoryInfos(); // 展開するためのディレクトリ情報を検索 foreach (var eachDirectoryInfos in nowDirectoryInfos) { if (eachDirectoryInfos.DirectoryName == targetDirectoryName) { targetDirectoryInfos = eachDirectoryInfos; break; } } if (isFirst) { // ルートの場合はすでにルートのディレクトリ情報を作成済なので何もしない isFirst = false; } else { // ルート以外の場合、そのときのディレクトリ情報を作成 Model.GetInstance().DirectoryInfo.GetChildDirectories(targetDirectoryName, ref targetDirectoryInfos); targetDirectoryName += @"\"; } // 該当するディレクトリ情報を展開 targetDirectoryInfos.IsExpanded = true; // 次のサブディレクトリを設定 nowDirectoryInfos = targetDirectoryInfos.SubDirectories; } }