Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_C#.doc
Скачиваний:
38
Добавлен:
15.11.2018
Размер:
2.72 Mб
Скачать

12.4 Класс Directory

Работать с каталогами файловой системы компьютера можно и при помощи класса Directory, функциональные возможности которого во многом совпадают с возможностями DirectoryInfo. Но члены данного класса реализованы статически, поэтому для их использования нет необходимости создавать объект.

Рассмотрим работу с методами данного класса на примерах.

Замечание. Удалите с диска d измененную папку prim. И еще раз скопируйте ее исходную версию из раздела 12 данного электронного учебника.

Directory.CreateDirectory(@"d:\prim\2008");//создали подкаталог 2008

Directory.Move(@"d:\prim\bmp",

@"d:\prim\2008\bmp");//перенесли каталог bmp в каталог 2008

Directory.Move(@"d:\prim\letter",

@"d:\prim\archives");//переименовали каталог letter в archives

Замечания.

  1. Удаление каталога возможно только тогда, когда он пуст.

  2. На практике комбинируют использование классов Directory и DirectoryInfo.

Пример. Рассмотрим пример windows - приложения, которое позволяет строить и просматривать дерево папок вашего ПК. При запуске приложения строится дерево дисков. Двойной щелчок покаждому диску позволяет раскрыть дерево папок. Для реализации интерфейса используется компонент TreeView

Приведем реализацию необходимых методов класса Form1

1. При запуске формы должно отображаться дерево всех дисков ПК. Для этого реализован обработчик события активации формы Form1_Activated

private void Form1_Activated(object sender, System.EventArgs e)

{// Получаем все диски (a:, c: и т.д.).

string [] drives = Environment.GetLogicalDrives();

foreach(string s in drives)

{

// Добавляем корневой элемент для каждого диска.

TreeNode tn = treeView1.Nodes.Add(s);

// Добавляем фиктивный подузел для каждого

// диска (для появления квадратика с плюсиком).

tn.Nodes.Add("");

// Устанавливаем свойство tag.

// Пустое значение свойства ("") - узел еще не раскрывался.

// Плюс ("+") - узел раскрывался и в него были

// добавлены нужные подузлы.

tn.Tag = "";

}

}

2. Реализуем метод, позволяющий получить по имени узла полное имя соответствующей папки

// Получение полного имени папки по узлу.

private String GetFullPath(TreeNode tn)

{

// Устанавливаем текуший узел на переданный в параметре.

TreeNode currNode = tn;

// В полное имя пока записываем текст,показываемый в текущем узле.

String fullPath = currNode.Text;

// Двигаемся к корню дерева.

while(currNode.Parent!=null)

{

// Переходим на родительский узел.

currNode = currNode.Parent;

// К полному имени приписываем текст родитеского узла.

fullPath= currNode.Text + @"\" + fullPath;

}

// Возвращаем полный путь.

return fullPath + @"\";

}

3. Добавление подузлов текущего узла

private void AddTreeNodes(TreeNode tn)

{

TreeNode aux;

// Получаем полный путь для папки узла.

DirectoryInfo d = new DirectoryInfo(GetFullPath(tn));

// Массив для хранения подпапок.

DirectoryInfo[] ds;

try

{

// Получаем все подпапки для папки.

ds = d.GetDirectories();

// Для каждой папки выводим ее имя и имена всех подпапок.

foreach (DirectoryInfo s in ds)

{

// Добавляем каждую подпапку.

aux = tn.Nodes.Add(s.Name);

// Устанавливаем для нее признак, что ее еще не раскрывали.

aux.Tag = "";

try

{

// Если она не пуста,

if(s.GetDirectories().GetLength(0)!=0)

{

// то добавляем в нее фиктивный узел.

aux.Nodes.Add("");

}

}

// Перехватываем исключение запрещенного доступа.

catch (UnauthorizedAccessException)

{

};

}

}

//Перехват общего исключения (например, если диск a: не вставлен).

catch(Exception) {}

}

4. Раскрытие ветки дерева

private void NodeExpand(TreeNode tn)

{

// Если есть подузлы.

if(tn.Nodes.Count!=0)

{

// Если раскрываем в первый раз.

if(((string)tn.Tag)=="")

{

// Удаляем фиктивный узел.

tn.Nodes.RemoveAt(0);

// Добавляем подузлы.

AddTreeNodes(tn);

// Устнавливаем признак того, что

// узел уже раскрывали и добавили в него все подузлы.

tn.Tag = "+";

}

}

}

5. Перед раскрытием ветки дерева необходимо добавить подузлы. Для этого необходимо реализовтаь обработчик события treeView1_BeforeExpand

private void treeView1_BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)

{ // Добавление подузлов перед раскрытием.

NodeExpand(e.Node);

}