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)) {
  if (MessageBox.Show('Файл уже существует, перезаписать?', this.Text,
   MessageBoxButtons.YesNo, MessageBoxIcon.Question,
   MessageBoxDefaultButton.Button2) == DialogResult.Yes)
   File.Delete(dest);
  else return;
 }
 // Перемещаем или копируем
 string s = path.Substring(0, path.Length - 1);
 switch(clipboardAction) {
 case ClipboardAction.Cut:
  File.Move(clipboardFileName, dest);
  break;
 case ClipboardAction.Copy:
  File.Copy(clipboardFileName, dest, false);
  break;
 }
 clipboardAction = ClipboardAction.None;
 clipboardFileName = string.Empty;
 fillList();
}
Перед тем как вставить файл в другую папку, нужно удостовериться, что в ней нет файла с таким именем. Если же такой файл существует, то надо предупредить пользователя и узнать, что он хочет сделать. Код для команды Вставить ярлык приведен в листинге 7.15.
private void pasteShortcutMenuItem_Click(object sender, System.EventArgs e) {
 int i = 2;
 string s = string.Empty;
 string dest;
 while(true) {
  dest = path + 'Shortcut' + s + ' to ' +
   Path.GetFileName(Path.GetFileNameWithoutExtension(clipboardFileName) +
   '.lnk');
  if (!File.Exists(dest)) break;
  s = ' (' + i.ToString() + ')';
  i++;
 }
 StreamWriter sw = new StreamWriter(dest);
 s = clipboardFileName;
 if(s.IndexOf(' ') > 0)
  s = ''' + s + ''';
 s = s. Length.ToString() + '#' + s;
 sw.WriteLine(s);
 sw.Close();
 fillList();
}
В этом коде создается уникальное имя ярлыка, которое затем записывается в виде файла с добавлением. К имени ярлыка добавляется расширение .LNK.
Код для команды Переименовать приведен в листинге 7.16.
private void renameMenuItem_Click(object sender, System.EventArgs e) {
 Cursor.Current = Cursors.WaitCursor;
 istViewItem lvi = listView.Items[listView.SelectedIndices[0]];
 bool isFolder = lvi.ImageIndex = 0;
 string s;
 if (isFolder)
  s = 'папку';

 
                