list.Sort(new SimpleComparer());
foreach(string dir in list) {
lvi = new ListViewItem(Path.GetFileName(dir));
lvi.ImageIndex = 0;
listView.Items.Add(lvi);
}
// Добавляем файлы
string[] files = Directory.GetFiles(path);
list = new ArrayList(files.Length);
for(int i = 0; i < files.Length; i++)
list.Add(files[i]);
list.Sort(new SimpleComparer());
foreach(string file in list) {
lvi = new ListViewItem(Path.GetFileName(file));
lvi.ImageIndex = 1;
listView.Items.Add(lvi);
}
listView.EndUpdate();
if (listView.Items.Count > 0) {
// выделяем первый элемент
listView.Items[0].Selected = true;
listView.Items[0].Focused = true;
}
Cursor.Current = Cursors.Default;
}
Итак, посмотрим, что делает метод fillList. Перед заполнением элемента списком файлов надо очистить его содержимое от предыдущих записей при помощи метода Clear. После очистки списка надо проверить, является ли папка корневой. Если папка не корневая, то в список добавляется специальная папка «На один уровень выше». Затем в список добавляются все папки в отсортированном порядке.
После этого наступает очередь файлов. Они сортируются и заносятся в список. Наконец, первый элемент списка выделяется другим цветом. Заодно на первом элементе устанавливается фокус ввода. Навигация по папкам и файлам осуществляется с помощью кнопок и дополняется кнопкой Action. Код навигации приведен в листинге 7.11.
///
/// Навигация по папкам и файлам
///
///
///
private void listView_ItemActivate(object sender, System.EventArgs e) {
Cursor.Current = Cursors.WaitCursor;
ListViewItem lvi = listView.Items[listView.SelectedIndices[0]];
bool isFolder = lvi.ImageIndex == 0;
if (lvi.Text == UPDIR) {
path = path.Substring(0,
path.Substring(0,
path.Length - 1).LastIndexOf(Path.DirectorySeparatorChar) + 1);
fillList();
} else if (isFolder) {
path += lvi.Text + Path.DirectorySeparatorChar;
fillList();
} else
ShellExecute.Start(path + lvi.Text);
Cursor.Current = Cursors.Default;
}
После нажатия кнопки действия приложение получает информацию о выделенном пункте. Если выделена специальная папка перехода на один уровень выше, то текущий путь заменяется путем к родительской папке. Если выделена папка, то путь меняется на путь к выделенной папке. Если выделен файл, то приложение пытается запустить его с помощью ассоциированной программы.
Теперь разберем код для команд меню. Для команды Вырезать код приведен в листинге 7.12.
private void cutMenuItem_Click(object sender, System.EventArgs e) {
ListViewItem lvi =
listView.Items[listView.SelectedIndices[0]];
clipboardFileName = this.path + lvi.Text;
clipboardAction = ClipboardAction.Cut;
}
Путь к текущему выбранному файлу сопоставляется с производимым действием. Код, выполняющийся после выбора команды Копировать, приведен в листинге 7.13.
private void copyMenuItem_Click(object sender, System.EventArgs e) {
ListViewItem lvi = listView.Items[listView.SelectedIndices[0]];
clipboardFileName = path + lvi.Text;
clipboardAction = ClipboardAction.Copy;
}
Для команды меню Вставить код немного усложняется. Он приведен в листинге 7.14.
private void pasteMenuItem_Click(object sender, System.EventArgs e) {
// Если файл существует
string dest = path + Path.GetFileName(clipboardFileName);
if (File.Exists(dest)) {