Как написать свой проводник

Сегодня мы расширим использование модели в QListView.  Мы напишем свою версию Проводника Windows. Конечно, она не будет обладать всем функционалом, но, для демонстрации возможностей виджета, этого будет достаточно.

Источником данных для модели может быть любой источник данных, на этот раз этим источником будет файловая система ПК.

Создание модели

Создадим новый проект Qt Widgets и назовем его QListViewExplorer.

Добавим на форму QListView

Добавим класс для нашей модели – QListViewExplorerModel

Заголовок:

#ifndef QLISTVIEWEXPLORERMODEL_H
#define QLISTVIEWEXPLORERMODEL_H

#include <QDir>
#include <QModelIndex>

class QListViewExplorerModel: public QAbstractListModel
{
public:
    QListViewExplorerModel(QObject *parent=nullptr);
    int rowCount(const QModelIndex &) const;
    QVariant data(const QModelIndex &index, int role) const;

    void getFolderList(QString folderPath, QFileInfoList *dirList);

private:
    QFileInfoList *aDirList;

};

#endif // QLISTVIEWEXPLORERMODEL_H

Реализация:

#include "qlistviewexplorermodel.h"

QListViewExplorerModel::QListViewExplorerModel(QObject *parent)
    :QAbstractListModel(parent)
{

}

void QListViewExplorerModel::getFolderList(QString folderPath, QFileInfoList *dirList)
{
    QDir dir = QDir(folderPath);

    *dirList = dir.entryInfoList();

    this->aDirList = dirList;
}

int QListViewExplorerModel::rowCount(const QModelIndex &) const
{
    return this->aDirList->count();
}

QVariant QListViewExplorerModel::data( const QModelIndex &index, int role ) const
{

    QVariant value;

        switch ( role )
        {
            case Qt::DisplayRole: //string
            {
                value = this->aDirList->at(index.row()).fileName();
            }
            break;

            case Qt::UserRole: //data
            {
                value = this->aDirList->at(index.row()).fileName();
            }
            break;

            default:
                break;
        }

    return value;
}

Добавим код в конструктор формы MainWindow::MainWindow(QWidget *parent)

    this->aDirList = new QFileInfoList(); 

    this->model = new QListViewExplorerModel(); 

    this->model->getFolderList(".",this->aDirList); 

    this->ui->listView->setModel(model);

Добавим поля в заголовок:

private:
    Ui::MainWindow *ui;

    QFileInfoList *aDirList;

    QListViewExplorerModel *model;

Запустим

2020-12-17_16-26-45.png

Мы и получили список файлов папки, из которой производится запуск нашей программы.

Рассмотрим код модели:

В методе getFolderList() мы создаем экземпляр класса QDir. Данный класс позволяет получать доступ к файлам и папкам файловой системы, а также виртуально перемещаться по ним.

После этого мы получаем список файлов и папок, указанной папки и через указатель присваиваем значение этого списка полю класса, объявленному в нашей главной форме.

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

Метод data() в нашем случае для всех ролей возвращает имя файла или папки, которые мы выбрали. В данный момент это несущественно.

Сортируем список папок и файлов

У нас есть список файлов и папок, но проблема в том, что содержимое списка отсортировано непонятно как — неясно где папка, а где файл.

Применим сортировку к списку. В методе модели getFolderList() изменим строку

    *dirList = dir.entryInfoList( QDir::NoFilter, QDir::DirsFirst);

QDir::NoFilter – указывает, что нам не нужна фильтрация (подробнее в документации Qt5 — https://doc.qt.io/qt-5/qdir.html#Filter-enum)

QDir::DirsFirst – задаёт метод сортировки – папки первыми, потом файлы (подробнее в документации Qt5 — https://doc.qt.io/qt-5/qdir.html#SortFlag-enum).

Запустим

2020-12-17_17-03-15.png

Уже лучше, но всё равно непонятно, где папка, а где файл. Давайте добавим иконки для каждой строки.

Для начала нам понадобятся сами иконки, скачать вы их можете с Яндекс.Диска — https://yadi.sk/d/_N4v7pySleb07A или с Github.

Создадим в корне проекта папку img и скопируем в нее файлы с иконками.

Создадим файл ресурса resource.qrc со следующим содержимым:

<RCC>
    <qresource prefix="/">
        <file>img/file.png</file>
        <file>img/folder.png</file>
        <file>img/zip.png</file>
        <file>img/folderup.png</file>
        <file>img/iconlist.png</file>
        <file>img/list.png</file>
    </qresource>
</RCC>

Добавим его к проекту.

Изменим метод модели data():

QVariant QListViewExplorerModel::data( const QModelIndex &index, int role ) const
{
    QVariant value;

        switch ( role )
        {
            case Qt::DisplayRole: //string
            {
                value = this->aDirList->at(index.row()).fileName();
            }
            break;

            case Qt::DecorationRole: //icon
            {
                if (this->aDirList->at(index.row()).isDir()) {
                    QPixmap icon = QPixmap(":/img/folder.png");
                    QPixmap tmp = icon.scaled(30, 30, Qt::KeepAspectRatio);
                    value = tmp;
                    break;
                }

                if (this->aDirList->at(index.row()).isFile()) {
                    QPixmap icon = QPixmap(":/img/file.png");
                    QPixmap tmp = icon.scaled(30, 30, Qt::KeepAspectRatio);
                    value = tmp;
                    break;
                }

                value = this->aDirList->at(index.row()).fileName();
            }
            break;

            case Qt::UserRole: //data
            {
                value = this->aDirList->at(index.row()).fileName();
            }
            break;

            default:
                break;
        }

    return value;
}

Запустим:

2020-12-17_17-52-25.png 

Здесь все просто, для роли Qt::DecorationRole мы возвращаем экземпляр класса QPixmap, в зависимости от типа элемента мы используем разные иконки и каждую, дополнительно, масштабируем.

Обратите внимание, мы используем временную переменную, для того, чтобы создать саму ионку. Если вы попробуете написать вот так:

value = QPixmap(":/img/file.png").scaled(30, 30, Qt::KeepAspectRatio);

То всё будет работать, но вы можете получить множество ошибок:

QPixmap::scaled: Pixmap is a null pixmap

У меня на одном ПК они появлялись, а на другом нет, неясно с чем это связано, поэтому я и использую временную переменную.

Фильтруем элементы списка

Осталось убрать папку с именем «.»

Для этого мы можем использовать фильтры метода entryInfoList()

    *dirList = dir.entryInfoList(QDir::NoDot | QDir::Files | QDir::Dirs, QDir::DirsFirst);

В данном случае мы использовали фильтр:

QDir::NoDot | QDir::Files | QDir::Dirs

Что означает: не показывать пункт с одной точкой, показывать файлы и папки.

Вы можете избавиться и от пункта с двумя точками, для этого достаточно добавить к фильтру еще одно значение:

QDir::NoDot | QDir::Files | QDir::Dirs | QDir::NoDotDot

Или переписать так:

QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs

Что даст тот же результат.

Добавляем иконку для zip архивов

Давайте добавим еще кое-что, у всех файлов независимо от расширения, одна и та же иконка, давайте сделаем для отдельную zip-файлов.

Для таких файлов у нас уже есть иконка, осталось добавить код. Модернизируем метод data() нашей модели:

QVariant QListViewExplorerModel::data( const QModelIndex &index, int role ) const
{

    QVariant value;

        switch ( role )
        {
            case Qt::DisplayRole: //string
            {
                value = this->aDirList->at(index.row()).fileName();
            }
            break;

            case Qt::DecorationRole: //icon
            {
                if (this->aDirList->at(index.row()).isDir()) {
                    QPixmap icon = QPixmap(":/img/folder.png");
                    QPixmap tmp = icon.scaled(30, 30, Qt::KeepAspectRatio);
                    value = tmp;
                    break;
                }

                if (this->aDirList->at(index.row()).isFile()) {
                    QString fileExt = this->aDirList->at(index.row()).completeSuffix();

                    if (fileExt == "zip") {

                        QPixmap icon = QPixmap(":/img/zip.png");
                        QPixmap tmp = icon.scaled(30, 30, Qt::KeepAspectRatio);
                        value = tmp;
                        break;

                    }

                    QPixmap icon = QPixmap(":/img/file.png");
                    QPixmap tmp = icon.scaled(30, 30, Qt::KeepAspectRatio);
                    value = tmp;
                    break;
                }

                value = this->aDirList->at(index.row()).fileName();
            }
            break;

            case Qt::UserRole: //data
            {
                value = this->aDirList->at(index.row()).fileName();
            }
            break;

            default:
                break;
        }

    return value;
}

Теперь вам нужно создать архив в папке, где осуществляется сборка проекта, у меня это папка на уровень выше, чем папка с проектом и называется она:

build-QListViewExplorer-Desktop_Qt_MinGW_w64_64bit_MSYS2-Debug

Запускаем:

2020-12-18_12-52-46.png

У архива своя иконка.

Обратите внимание, если у вас имя архива начинается с точки, он не будет нормально обработан, я случайно столкнулся с этим, создавая архив. В принципе с точки начинаются только системные или служебные файлы, так что это не важно.

Таким же образом вы можете добавить иконки для других расширений файлов.

Открываем файлы, как в Проводнике Windows

Попробуем реализовать схожий функционал проводника – запуск/открытие файла при двойном щелчке.

Добавим слот для нашего QListView:

void MainWindow::on_listView_doubleClicked(const QModelIndex &index)
{
    QDesktopServices::openUrl(QUrl(this->aDirList->at(index.row()).absoluteFilePath()));
}

При двойном щелчке на архиве запускается 7-Zip, как и ожидалось.

Добавляем адресную строку

Добавим адресную строку сверху от нашего QListView, чтобы пользователь мог видеть текущий каталог.

На форму добавим компонент LineEdit и разместим его выше QListView.

Добавим в конец конструктора формы строку:

this->ui->lineEdit->setText(QDir::currentPath());

Запустим:

2020-12-18_14-01-56.png

Путь появился в строке.

Меняем текущую папки при двойном щелчке

Давайте добавим функционал перехода в папку, при двойном щелчке на нее.

Изменим метод слота on_listView_doubleClicked()

void MainWindow::on_listView_doubleClicked(const QModelIndex &index)
{
    if (this->aDirList->at(index.row()).isDir())
    {
        QString tmp = this->aDirList->at(index.row()).absoluteFilePath();
        model->getFolderList(this->aDirList->at(index.row()).absoluteFilePath(),this->aDirList);
        this->ui->lineEdit->setText(tmp);
    } else {
        QDesktopServices::openUrl(QUrl(this->aDirList->at(index.row()).absoluteFilePath()));
    }
}

Внесем изменения в метод модели getFolderList() 

void QListViewExplorerModel::getFolderList(QString folderPath, QFileInfoList *dirList)
{
    QDir dir = QDir(folderPath);

    *dirList = dir.entryInfoList(QDir::NoDot | QDir::Files | QDir::Dirs, QDir::DirsFirst);

    this->beginResetModel();
        this->aDirList = dirList;
    this->endResetModel();
}

Запустим.

Теперь вы можете сменить текущую папку, с помощью двойного щелчка по пункту «..» или имени папки.

Рассмотрим получившийся код: 

В слоте по двойному щечку мы проверяем является ли выбранный элемент папкой, если является, то мы вызываем метод модели и заново загружаем элементов список элементов с помощью getFolderList(), но уже для новой папки. Не забываем обновить имя текущей папки в строке адреса.

В методе модели getFolderList(), после того как мы получили список элементов указанной папки мы используем методы beginResetModel() и endResetModel() чтобы уведомить модель о том, что произошел сброс модели, так как данные у нас целиком поменялись.

Переходим на уровень выше с помощью кнопки

Добавим кнопку, чтобы перейти в папку на уровень выше, чем текущая.

На форму добавим кнопку QPushButton.

Назначим ей иконку folderup.png  из ресурса

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

Добавим к кнопке слот на одиночный щелчок: 

void MainWindow::on_pushButton_clicked()
{
    currentFolder.cdUp();

    this->ui->lineEdit->setText(currentFolder.absolutePath());
    model->getFolderList(currentFolder.absolutePath(),this->aDirList);
}

Изменим конструктор формы:

заменим

    this->model->getFolderList(".",this->aDirList);

на

    this->currentFolder = QDir(QDir::currentPath());

    this->model->getFolderList(this->currentFolder.absolutePath(),this->aDirList);

Добавим в заголовок формы приватное поле

private:
	QDir currentFolder;

Оно нам понадобится, чтобы хранить информацию о текущей папке.

Запускаем. Теперь по щелчку по этой кнопке, мы можем перейти на каталог выше.

Переключаемся между списком и иконками

Доработаем нашу программу еще немного – добавим две кнопки для переключения между отображением списком и иконками.

Добавим две кнопки на форму

Назначим одной иконку из ресурса list.png, а другой iconlist.png

2020-12-18_17-49-12.png

Добавим слоты для кнопок

Для перехода в режим списка:

void MainWindow::on_pushButton_3_clicked()
{
    this->ui->listView->setViewMode(QListView::ListMode);
}

Для перехода в режим иконок:

void MainWindow::on_pushButton_2_clicked()
{
    this->ui->listView->setViewMode(QListView::IconMode);
}

Запускаем:

 2020-12-18_17-51-07.png

При переходе в режим иконок всё съезжает и выглядит очень некрасиво. Доработает методы:

void MainWindow::on_pushButton_3_clicked()
{
    this->ui->listView->setUniformItemSizes(false);
    this->ui->listView->setViewMode(QListView::ListMode);

}

void MainWindow::on_pushButton_2_clicked()
{
    this->ui->listView->setUniformItemSizes(true);
    this->ui->listView->setViewMode(QListView::IconMode);
}

Запускаем:

2020-12-18_17-52-50.png

Уже лучше.

Управляем отображением иконок в окне:

Добавим в конструктор окна строку 

this->ui->listView->setWrapping(true);

Теперь у нас папки отображаются в несколько колонок.

2020-12-19_14-42-46.png

Заменим эту строку на

this->ui->listView->setWordWrap(true);

2020-12-19_14-47-13.png

Имена файлов будут переноситься на новую строку, чтобы вместиться по ширине.

Заключение

Сегодня мы начали создание собственного файлового менеджера, с файлами и папками…

Был создан новый проект, на форму добавлен QListView

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

Настроили сортировку элементов списка таким образом, чтобы папки шли перед файлами.

Добавили иконки в ресурсы проекта.

Доработали модель таким образом, чтобы папки и файлы имели разные иконки.

Реализовали механизм, который при двойном щелчке на файл, открывает так же, как это делает Windows Explorer.

Добавили отдельную иконку для zip-файлов

Добавили кнопку для перехода на папку выше уровнем.

Добавили две кнопки для смены режима отображения между обычным списком и иконками.

Время на прочтение
10 мин

Количество просмотров 13K

Всем привет!

Я захотел обобщить свои знания питона и решил написать файловый менеджер для пк.

Внимание!

Это всего лишь игрушка и не более, это не реальная ОС!

Импорт библиотек:

import tkinter
import os
import subprocess
from tkinter import messagebox
from tkinter import simpledialog

Главное меню:

class MainContextMenu(tkinter.Menu):
	''' Контекстное меню для внутренней области директории'''
	def __init__(self, main_window, parent):
		super(MainContextMenu, self).__init__(parent, tearoff = 0)
		self.main_window = main_window
		self.add_command(label="Создать директорию", command = self.create_dir)
		self.add_command(label="Создать файл", command = self.create_file)

	def popup_menu(self, event):
		''' функция для активации контекстного меню'''
		#если активны другие меню - отменяем их
		if self.main_window.file_context_menu:
			self.main_window.file_context_menu.unpost()
		if self.main_window.dir_context_menu:
			self.main_window.dir_context_menu.unpost()
		self.post(event.x_root, event.y_root)

	def create_dir(self):
		''' функция для создания новой директории в текущей'''
		dir_name = simpledialog.askstring("Новая директория", "Введите название новой директории")
		if dir_name:
			command = "mkdir {0}".format(dir_name).split(' ')
			#выполняем команду отдельным процессом
			process = subprocess.Popen(command, cwd=self.main_window.path_text.get(), stdout = subprocess.PIPE, stderr = subprocess.PIPE)
			out, err = process.communicate()
			#при возникновении ошибки выводим сообщение
			if err:
				messagebox.showwarning("Операция невозможна!","Отказано в доступе.")
			self.main_window.refresh_window()


	def create_file(self):
		''' функция для создания нового файла в текущей директории'''
		dir_name = simpledialog.askstring("Новый файл", "Введите название нового файла")
		if dir_name:
			command = "touch {0}".format(dir_name).split(' ')
			#выполняем команду отдельным процессом
			process = subprocess.Popen(command, cwd=self.main_window.path_text.get(), stdout = subprocess.PIPE, stderr = subprocess.PIPE)
			out, err = process.communicate()
			#при возникновении ошибки выводим сообщение
			if err:
				messagebox.showwarning("Операция невозможна!","Отказано в доступе.")
			self.main_window.refresh_window()



	def insert_to_dir(self):
		''' функция для копирования файла или директории в текущую директорию'''
		copy_obj = self.main_window.buff
		to_dir = self.main_window.path_text.get()
		if os.path.isdir(self.main_window.buff):
			#выполняем команду отдельным процессом
			process = subprocess.Popen(['cp', '-r', copy_obj, to_dir], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
			out, err = process.communicate()
			if err:
				messagebox.showwarning("Операция невозможна!", err.decode("utf-8"))
		else:
			#выполняем команду отдельным процессом
			process = subprocess.Popen(['cp', '-n', copy_obj, to_dir], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
			out, err = process.communicate()
			#при возникновении ошибки выводим сообщение
			if err:
				messagebox.showwarning("Операция невозможна!",err.decode("utf-8"))
		self.main_window.refresh_window()

При нажатии на файл должно выводиться контекстное меню:

image

class FileContextMenu(tkinter.Menu):
	def __init__(self, main_window, parent):
		super(FileContextMenu, self).__init__(parent, tearoff = 0)
		self.main_window = main_window
		self.add_command(label="Открыть файл", command = self.open_file)
		self.add_separator()
		self.add_command(label="Копировать", command = self.copy_file)
		self.add_command(label="Переименовать", command = self.rename_file)
		self.add_separator()
		self.add_command(label="Удалить", command = self.delete_file)


	def open_file(self):
		''' функция для открытия файла сторонними программами'''
		ext = self.main_window.take_extention_file(self.main_window.selected_file)
		full_path = self.main_window.path_text.get() + self.main_window.selected_file

		if ext in ['txt', 'py', 'html', 'css', 'js']:
			if 'mousepad' in self.main_window.all_program:
				subprocess.Popen(["mousepad", full_path], start_new_session = True)
			else:
				self.problem_message()
		elif ext == 'pdf':
			if 'evince' in self.main_window.all_program:
				subprocess.run(["evince", full_path], start_new_session = True)
			else:
				self.problem_message()
		elif ext in ['png', 'jpeg', 'jpg', 'gif']:
			if 'ristretto' in self.main_window.all_program:
				subprocess.run(["ristretto", full_path], start_new_session = True)
			else:
				self.problem_message()
		else:
			self.problem_message()

	def problem_message(self):
		messagebox.showwarning("Проблема при открытии файла", 'Прости, но я не могу открыть этот файл')

	def copy_file(self):
		''' функция для копирования файла'''
		#заносим полный путь к файлу в буффер
		self.main_window.buff = self.main_window.path_text.get() + self.main_window.selected_file
		self.main_window.refresh_window()


	def delete_file(self):
		''' функция для удаления выбранного файла'''
		full_path = self.main_window.path_text.get() + self.main_window.selected_file
		#выполняем команду отдельным процессом
		process = subprocess.Popen(['rm', full_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
		output, err = process.communicate()
		#при возникновении ошибки выводим сообщение
		if err:
			messagebox.showwarning("Проблема при удалении файла", 'У Вас нет прав для удаления данного файла')
		self.main_window.refresh_window()

	def rename_file(self):
		''' функция для переименования выбранного файла'''
		new_name = simpledialog.askstring("Переименование файла", "Введите новое название файла")
		if new_name:
			old_file = self.main_window.path_text.get() + self.main_window.selected_file
			new_file = self.main_window.path_text.get() + new_name
			#выполняем команду отдельным процессом
			process = subprocess.Popen(['mv', old_file, new_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
			output, err = process.communicate()
			#при возникновении ошибки выводим сообщение
			if err:
				messagebox.showwarning("Проблема при переименовании файла", 'У Вас нет прав для переименования данного файла')
			self.main_window.refresh_window()

	def popup_menu(self, event):
		''' функция для активации контекстного меню'''
		self.post(event.x_root, event.y_root)
		#если активны другие меню - отменяем их
		if self.main_window.main_context_menu:
			self.main_window.main_context_menu.unpost()
		if self.main_window.dir_context_menu:
			self.main_window.dir_context_menu.unpost()
		self.main_window.selected_file = event.widget["text"]

То же самое для директории:

class DirContextMenu(tkinter.Menu):
	def __init__(self, main_window, parent):
		super(DirContextMenu, self).__init__(parent, tearoff = 0)
		self.main_window = main_window
		self.add_command(label="Переименовать", command = self.rename_dir)
		self.add_command(label="Копировать", command = self.copy_dir)
		self.add_separator()
		self.add_command(label="Удалить", command = self.delete_dir)

	def copy_dir(self):
		''' функция для копирования директории'''
		self.main_window.buff = self.main_window.path_text.get() + self.main_window.selected_file
		self.main_window.refresh_window()


	def delete_dir(self):
		''' функция для удаления выбранной директории'''
		full_path = self.main_window.path_text.get() + self.main_window.selected_file
		if os.path.isdir(full_path):
			#выполняем команду отдельным процессом
			process = subprocess.Popen(['rm', '-rf', full_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
			output, err = process.communicate()
			#при возникновении ошибки выводим сообщение
			if err:
				messagebox.showwarning("Проблема при удалении директории", 'У Вас нет прав для удаления данной директории')
		self.main_window.refresh_window()

	def rename_dir(self):
		''' функция для переименования выбранной директории'''
		new_name = simpledialog.askstring("Переименование директории", "Введите новое название директории")
		if new_name:
			old_dir = self.main_window.path_text.get() + self.main_window.selected_file
			new_dir = self.main_window.path_text.get() + new_name
			#выполняем команду отдельным процессом
			process = subprocess.Popen(['mv', old_dir, new_dir], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
			output, err = process.communicate()
			#при возникновении ошибки выводим сообщение
			if err:
				messagebox.showwarning("Проблема при переименовании директории", 'У Вас нет прав для переименования данной директории')
			self.main_window.refresh_window()

	def popup_menu(self, event):
		''' функция для активации контекстного меню'''
		self.post(event.x_root, event.y_root)
		#если активны другие меню - отменяем их
		if self.main_window.main_context_menu:
			self.main_window.main_context_menu.unpost()
		if self.main_window.file_context_menu:
			self.main_window.file_context_menu.unpost()
		self.main_window.selected_file = event.widget["text"]

Класс основного окна:


class MainWindow():
	''' Класс основного окна'''
	def __init__(self):
		self.root = tkinter.Tk()
		self.root.title("FileManager")
		self.root.resizable(width = False, height = False)
		self.root.geometry('450x300')

		self.hidden_dir = tkinter.IntVar()
		self.buff = None
		self.all_program = os.listdir('C:/')

		self.root.bind('<Button-1>', self.root_click)
		self.root.bind('<FocusOut>', self.root_click)

		#top frame
		self.title_frame = tkinter.Frame(self.root)
		self.title_frame.pack(fill = 'both', expand = True)

		#back button
		self.back_button = tkinter.Button(self.title_frame, text = "..", command = self.parent_dir, width = 1, height = 1)
		self.back_button.pack(side = 'left')

		#path entry
		self.path_text = tkinter.StringVar()
		self.path_text.set('/')
		self.current_path = tkinter.Entry(self.title_frame, textvariable = self.path_text, width = 40, state='readonly')
		self.current_path.pack(side = 'left')

		#button show/hidde hidden dir/file
		self.check_button = tkinter.Checkbutton(self.title_frame, text = "Hidden", font = ("Helvetica", 10), padx = 1, pady = 1, variable = self.hidden_dir, command = self.refresh_window)
		self.check_button.pack(side = 'left')

		#main frame
		self.main_frame = tkinter.Frame(self.root)
		self.main_frame.pack()

		# scroll bar
		self.scrollbar_vert = tkinter.Scrollbar(self.main_frame, orient="vertical")
		self.scrollbar_vert.pack(side = 'right', fill = 'y')

		self.scrollbar_hor = tkinter.Scrollbar(self.main_frame, orient="horizontal")
		self.scrollbar_hor.pack(side = 'bottom', fill = 'x')

		#canvas
		self.canvas = tkinter.Canvas(self.main_frame, borderwidth=0,  bg = 'white')
		self.inner_frame = tkinter.Frame(self.canvas,  bg = 'white')

		#команды для прокрутки
		self.scrollbar_vert["command"] = self.canvas.yview
		self.scrollbar_hor["command"] = self.canvas.xview

		#настройки для canvas
		self.canvas.configure(yscrollcommand=self.scrollbar_vert.set, xscrollcommand = self.scrollbar_hor.set, width=400, heigh=250)

		self.canvas.pack(side='left', fill='both', expand=True)
		self.canvas.create_window((0,0), window=self.inner_frame, anchor="nw")


		#отрисовываем содержимое лиректории
		self.dir_content()


	def root_click(self, event):
		''' функция для обработки события клика в root'''
		#если есть контекстные меню - отменяем
		if self.file_context_menu:
			self.file_context_menu.unpost()
		if self.main_context_menu:
			self.main_context_menu.unpost()
		if self.dir_context_menu:
			self.dir_context_menu.unpost()

	def dir_content(self):
		''' функция для определения содержимого текущей директории'''
		#содержимое в текущей директории
		dir_list = os.listdir(self.path_text.get())
		path = self.path_text.get()

		if not dir_list:
			#общее контекстное меню
			self.main_context_menu = MainContextMenu(self, self.canvas)
			self.canvas.bind('<Button-3>', self.main_context_menu.popup_menu)
			if self.buff:
				self.main_context_menu.add_command(label="Вставить", command = self.main_context_menu.insert_to_dir)
			self.inner_frame.bind('<Button-3>', self.main_context_menu.popup_menu)
			#контекстное меню для файлов
			self.file_context_menu = None
			#контекстное меню для директории
			self.dir_context_menu = None
			return None

		#общее контекстное меню
		self.main_context_menu = MainContextMenu(self, self.canvas)
		self.canvas.bind('<Button-3>', self.main_context_menu.popup_menu)
		if self.buff:
			self.main_context_menu.add_command(label="Вставить", command = self.main_context_menu.insert_to_dir)
		#контекстное меню для файлов
		self.file_context_menu = FileContextMenu(self, self.inner_frame)
		#контекстное меню для директории
		self.dir_context_menu = DirContextMenu(self, self.inner_frame)


		i = 0
		for item in dir_list:

			if os.path.isdir(str(path) + item):
				#обрабатываем директории
				if os.access(str(path) + item, os.R_OK):
					if (not self.hidden_dir.get() and  not item.startswith('.')) or self.hidden_dir.get():
						photo = tkinter.PhotoImage(file ="img/folder.png")

						icon = tkinter.Label(self.inner_frame, image=photo,  bg = 'white')
						icon.image = photo
						icon.grid(row=i+1, column=0)

						folder_name = tkinter.Label(self.inner_frame, text=item,  bg = 'white', cursor = 'hand1')
						folder_name.bind("<Button-1>", self.move_to_dir)
						folder_name.bind("<Button-3>", self.dir_context_menu.popup_menu)
						folder_name.grid(row=i+1, column=1, sticky='w')
				else:
					if (not self.hidden_dir.get() and not item.startswith('.')) or self.hidden_dir.get():
						photo = tkinter.PhotoImage(file ="img/folder_access.png")

						icon = tkinter.Label(self.inner_frame, image=photo,  bg = 'white')
						icon.image = photo
						icon.grid(row=i+1, column=0)

						folder_name = tkinter.Label(self.inner_frame, text=item,  bg = 'white')
						folder_name.bind("<Button-1>", self.move_to_dir)
						folder_name.grid(row=i+1, column=1, sticky='w')

			else:
				#обрабатываем файлы
				if (not self.hidden_dir.get() and not item.startswith('.')) or self.hidden_dir.get():
					ext = self.take_extention_file(item)
					#фото, картинки
					if ext in ['jpeg', 'jpg', 'png', 'gif']:
						photo = tkinter.PhotoImage(file ="img/photo.png")

						icon = tkinter.Label(self.inner_frame, image=photo,  bg = 'white')
						icon.image = photo
						icon.grid(row=i+1, column=0)

						file_name = tkinter.Label(self.inner_frame, text=item,  bg = 'white')
						file_name.grid(row=i+1, column=1, sticky='w')

						file_name.bind("<Button-3>", self.file_context_menu.popup_menu)
					else:
						#другие файлы
						if os.access(str(path) + item, os.R_OK):
							photo = tkinter.PhotoImage(file ="img/file.png")

							icon = tkinter.Label(self.inner_frame, image=photo,  bg = 'white')
							icon.image = photo
							icon.grid(row=i+1, column=0)

							folder_name = tkinter.Label(self.inner_frame, text=item,  bg = 'white')
							folder_name.grid(row=i+1, column=1, sticky='w')

							folder_name.bind("<Button-3>", self.file_context_menu.popup_menu)

						else:
							photo = tkinter.PhotoImage(file ="img/file_access.png")

							icon = tkinter.Label(self.inner_frame, image=photo,  bg = 'white')
							icon.image = photo
							icon.grid(row=i+1, column=0)

							folder_name = tkinter.Label(self.inner_frame, text=item,  bg = 'white')
							folder_name.grid(row=i+1, column=1, sticky='w')
			i += 1
		#обновляем inner_frame и устанавливаем прокрутку для нового содержимого
		self.inner_frame.update()
		self.canvas.configure(scrollregion=self.canvas.bbox("all"))

	def move_to_dir(self, event):
		''' функция для перехода в выбранную директорию'''
		elem = event.widget
		dir_name = elem["text"]
		fool_path = self.path_text.get() + dir_name
		if os.path.isdir(fool_path) and os.access(fool_path, os.R_OK):
			old_path = self.path_text.get()
			self.path_text.set(old_path + dir_name + '/')
			self.root_click('<Button-1>')
			self.refresh_window()


	def parent_dir(self):
		''' функция для перемещения в родительскую директорию'''
		old_path = [i for i in self.path_text.get().split('/') if i]
		new_path = '/'+'/'.join(old_path[:-1])
		if not new_path:
			new_path = '/'
		if os.path.isdir(new_path):
			if new_path == '/':
				self.path_text.set(new_path)

			else:
				self.path_text.set(new_path + '/')
			self.refresh_window()


	def take_extention_file(self, file_name):
		''' функция для получения расширения файла'''
		ls = file_name.split('.')
		if len(ls)>1:
			return ls[-1]
		else:
			return None

	def refresh_window(self):
		''' функция для обновления текущего отображения директорий/файлов'''
		for widget in self.inner_frame.winfo_children():
				widget.destroy()
		self.dir_content()
		self.canvas.yview_moveto(0)

И наконец, создание окна и запаковка виджетов:

win = MainWindow()
win.root.mainloop()

Файлы, ассеты, бинарники здесь

Буду рад, если вы поделитесь со мной улучшенной версией этой программы!
Пишите: ki1killer@yandex.ru

16 / 16 / 0

Регистрация: 10.04.2011

Сообщений: 271

1

.NET 4.x

14.05.2012, 14:58. Показов 22200. Ответов 18


Здравствуйте.
В учебном заведении на экзамен, срок которого — неделя, мне выпало «написать проводник».) В целом, должно выйти «нечто, похожее на проводник винды», конечно не идеально точь в точь похоже, но хотя-бы основные функции должны присутствовать.

Вопрос заключается в том.. с чего вообще начать? Я честно говоря даже не знаю, с какой стороны подступиться к подобному заданию.
Хотелось бы набросать «план действий»..
Для начала, как я понимаю, нужно создать ListView, как-то ( основная сложность ) прикрутить к нему отображение файлов и папок в определенной директории, и что не менее сложно — научить его переходить из папки в папку. Потом можно как-то прикрутить отображение «даты изменения», «типа», «размера» и т.д., если это возможно..

В общем, буду очень благодарен за дельные советы)

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Etrimus

398 / 365 / 54

Регистрация: 23.05.2010

Сообщений: 716

15.05.2012, 10:47

2

Для начала посмотри про классы и методы получения списков файлов и папок.
Класс File — http://msdn.microsoft.com/ru-r… .file.aspx
Класс FileInfo — http://msdn.microsoft.com/ru-r… einfo.aspx
Класс Directory — http://msdn.microsoft.com/ru-r… ctory.aspx
Класс DirectoryInfo — http://msdn.microsoft.com/ru-r… yinfo.aspx
С их помощью можно вывести в ЛистВью списки файлов и папок, а потом можно копировать, перемещать и т.д. На этом форуме есть тема про это — Пространство имен — System.IO (Работа с файлами, директориями, дисками, памятью)
Например, начни с того, что при запуске программы отображаются локальные диски. Тут помогает класс DriveInfo, у него есть метод GetDrives()

C#
1
DriveInfo[] allDrives = DriveInfo.GetDrives();

Дальше обрабатываешь события двойного клика на элементы в ЛистВью и отображаешь список файлав и папок в той папке, по которой кликнуто в ЛистВью.
Можно сделать контектстное меню у элементов ЛистВью, из которого можно, например, удалять, переименовывать файлы и папки.
В классах File и FileInfo есть возможности узнать атрибуты файлов, такие как размер, даты создания/изменения, и можно визуально скрывать в ЛистВью файлы с атрибутом Скрытый, ну и так далее, полёт фантазии.



1



16 / 16 / 0

Регистрация: 10.04.2011

Сообщений: 271

16.05.2012, 14:41

 [ТС]

3

Посмотрел на msdn-е и взял за основу это:
http://msdn.microsoft.com/ru-ru/library/ms171645
Создал текстбокс, в который пользователь забивает путь, кнопку «перейти» и «вверх», реализовал. Работает.)
Возникли следующие проблемы:

Проблема 1:
При попытке поиска по пути C: или D: выдает ошибку о правах доступа куда-то. В обычные папки заходит нормально.
Проблема 2:
Как удалить предыдущий узел? А то после каждой «перейти» создается в левом окошке новый узел, а старый не исчезает?
Проблема 3:
Как реализовать разные значки для разных расширений файлов?
И да — можно ли «вытащить» значки из проводника винды, или откуда-то из винды вообще, чтобы не нужно было их принтскринить?) А то принтскринить значки — изврат.



0



Etrimus

398 / 365 / 54

Регистрация: 23.05.2010

Сообщений: 716

16.05.2012, 19:22

4

Пишу с нетбука, где нет студии, не отвечу на вопросы про код.

Цитата
Сообщение от Arimand
Посмотреть сообщение

Как реализовать разные значки для разных расширений файлов?

Средствами C# можно так — http://msdn.microsoft.com/ru-r… .icon.aspx
Но это только для файлов. А вообще системные значки лежать в

Код

%SystemRoot%system32SHELL32.dll

Там куча системных картинок, вот только средствами одного NET достать их вроде как не выйдет, для этого придётся использовать WinAPI или сторонние классы. Поэтому для файлов можно брать иконки как я показал, я для папок задавать жестко, например, засунуть в ресурсы программы готовый файл.

И да — можно ли «вытащить» значки из проводника винды, или откуда-то из винды вообще

Что бы просто сохранить к себе на компьютер, есть специальные программы, например Resource Hacker или подобные.

Добавлено через 14 минут

Цитата
Сообщение от Arimand
Посмотреть сообщение

Как удалить предыдущий узел? А то после каждой «перейти» создается в левом окошке новый узел, а старый не исчезает?

У Treeview есть свойство Nodes, которое является массивом всех корневых элементов. Вот так можно удалить самый верхний элемент

C#
1
treeview1.Nodes[0].Remove()



1



16 / 16 / 0

Регистрация: 10.04.2011

Сообщений: 271

17.05.2012, 11:56

 [ТС]

5

Благодарю)
А что с дисками делать?
Ввожу в свою «адресную строку» диск C, выдает ошибку:

************** Текст исключения **************
System.UnauthorizedAccessException: Отказано в доступе по пути «C:Documents and Settings».

Ввожу диск D — начинает что-то ОЧЕНЬ долго грузить почему-то, а потом — снова же «отказано в доступе» к D:System Volume Information
Что нужно сделать, чтобы оно хотя-бы игнорировала те папки, к которым не может получить доступ?



0



398 / 365 / 54

Регистрация: 23.05.2010

Сообщений: 716

17.05.2012, 12:45

6

Цитата
Сообщение от Arimand
Посмотреть сообщение

Ввожу в свою «адресную строку» диск C

Цитата
Сообщение от Arimand
Посмотреть сообщение

Отказано в доступе по пути «C:Documents and Settings».

Прочитай обе строчки ещё раз. Из них видно, что ты чего-то не то вводишь, потому что по факту программа пытается зайти не на диск С, а на C:Documents and Settings. В коде значит где-то намудрил.
Это конкретно про код, а вообще про ошибку Отказано в доступе по пути. Она вылетает, если у пользователя нет прав для входа в указанную папку. Попробуй даже сам, не из своей программы зайти на компе в папку D:System Volume Information, получишь тоже самое.
В Documents and Settings у меня нормально заходит, может быть прав твоей учётной записи не достаточно доя этого.
То что пускает не во все папки, это нормально, в Семерке вообще много куда не пустит.



2



Arimand

16 / 16 / 0

Регистрация: 10.04.2011

Сообщений: 271

17.05.2012, 13:06

 [ТС]

7

Цитата
Сообщение от Etrimus
Посмотреть сообщение

Прочитай обе строчки ещё раз. Из них видно, что ты чего-то не то вводишь, потому что по факту программа пытается зайти не на диск С, а на C:Documents and Settings. В коде значит где-то намудрил.
Это конкретно про код, а вообще про ошибку Отказано в доступе по пути. Она вылетает, если у пользователя нет прав для входа в указанную папку. Попробуй даже сам, не из своей программы зайти на компе в папку D:System Volume Information, получишь тоже самое.
В Documents and Settings у меня нормально заходит, может быть прав твоей учётной записи не достаточно доя этого.
То что пускает не во все папки, это нормально, в Семерке вообще много куда не пустит.

Посмотрел еще раз на код, понял, в чем проблема: программа рекурсивно перебирает все папки внутри заданой, и таким образом формирует «дерево» папок.
Моя же задача ( насколько я понимаю ) заключается в том, чтобы переделать данный код на такой, который формировал бы только список папок в _данной_ дирректории.
Права учетной записи — администраторские. И да — семерка)

То, что оно «не пускает» — это понятно. Как сделать исключение, чтобы оно «обходило стороной» такие гадкие папки?
Прошу прощения за ламерский вопрос Проблему решил с помощью:

C#
1
try{ ...код... }



0



Etrimus

398 / 365 / 54

Регистрация: 23.05.2010

Сообщений: 716

17.05.2012, 13:14

8

Цитата
Сообщение от Arimand
Посмотреть сообщение

формировал бы только список папок в _данной_ дирректории.

Можно сразу получить массив с путями и к файлам, и к папкам. Удобно.

C#
1
string[] array = Directory.GetFileSystemEntries(@"C:");

Добавлено через 3 минуты

Цитата
Сообщение от Arimand
Посмотреть сообщение

Как сделать исключение, чтобы оно «обходило стороной» такие гадкие папки?

Обрабатывай исключения в программе. Вот простой пример, почитай про исключения в C#.

C#
1
2
3
4
5
6
7
8
9
            try
            {
                //DirectoryInfo dir = new DirectoryInfo(@"C:System Volume Information");
                string[] arr = Directory.GetFileSystemEntries(@"C:System Volume Information");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }



1



16 / 16 / 0

Регистрация: 10.04.2011

Сообщений: 271

17.05.2012, 13:23

 [ТС]

9

Спасибо, проблему с обработкой я решил.)
Теперь вопрос уже другой:
Как лучше реализовать вырезание/копирование/вставку файлов?
В принципе, по логике вещей — к узлам ( файлам и папкам ) привязывается контекстное меню, к нему уже привязываются функции: с помощью класса FileInfo:
-самое простое — удаление: Delete()
-MoveTo() — использовать для вырезания/вставки, а заодно можно и для переименования
А вот как лучше реализовать копирование?

+К этому: как заставить программу открыть файл ( так, как они открываются через проводник — в смысле .txt через блокнот, приложение — как приложение, .doc — через офис и т.д. ) ?



0



Etrimus

398 / 365 / 54

Регистрация: 23.05.2010

Сообщений: 716

17.05.2012, 13:34

10

Цитата
Сообщение от Arimand
Посмотреть сообщение

А вот как лучше реализовать копирование?

Для файлов просто

C#
1
File.Copy

Для папок. Ну тут придётся руками… Создаём в нужном месте папку, и в неё циклом копируем (File.Copy) все файлы из копируемой папки.
Либо можно халяву замутить…
Добавяем в проект ссылку на пространство имен Microsoft.VisualBasic. И пишем.

C#
1
Microsoft.VisualBasic.FileIO.FileSystem.

И после символа точки ВизуалСтудия вывалит всё, что нужно. Копировать, перемещать, удалять, переименовывать файлы и папки. Халява полная, но это если прокатит у тебя перед преподом.



1



16 / 16 / 0

Регистрация: 10.04.2011

Сообщений: 271

17.05.2012, 13:45

 [ТС]

11

Замечательно, буду кодить) Еще раз благодарю)
Халявой пожалуй воспользуюсь. Политика учебного заведения — стимулирование людей к «самостоятельному получению знаний», так что будет только в плюс.



0



Etrimus

398 / 365 / 54

Регистрация: 23.05.2010

Сообщений: 716

17.05.2012, 13:49

12

Ну тогда всё ОК, вот ещё про запуск файлов.

C#
1
System.Diagnostics.Process.Start(@"C:ВасяФайл.xlsx");

К стати, если написать туда не путь к файлу, а интернет-адрес, то запустится браузер и перейдёт на этот адрес.



0



16 / 16 / 0

Регистрация: 10.04.2011

Сообщений: 271

17.05.2012, 14:21

 [ТС]

13

Снова появилась неожиданная проблема:
Как подключить ContextMenuStrip к элементу listView? К TreeView подключается нормально.



0



Etrimus

398 / 365 / 54

Регистрация: 23.05.2010

Сообщений: 716

17.05.2012, 15:31

14

А в чём проблема, подключаешь через Студию контекстное меню. У каждого элемента контекстного меню есть событие Click. Подписываешься на него, а в событии уже работаешь с выделенными в ЛистВью элементами.

C#
1
2
3
4
        private void копироватьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show(listView1.SelectedItems[0].Text);
        }

Показал в окошке текс первого выделенного элемента в ЛистВью.



0



16 / 16 / 0

Регистрация: 10.04.2011

Сообщений: 271

17.05.2012, 15:57

 [ТС]

15

Нет, я не о том.
Мне нужно, чтобы при нажатии правой кнопкой на элемент listView вылазило контекстное меню ( как в проводнике ), а не обрабатывать выделенный элемент через ToolStripMenu.



0



Местный Ёжидзе

42 / 44 / 4

Регистрация: 03.03.2010

Сообщений: 225

17.05.2012, 19:14

16

Arimand,
Используй ContextMenuStrip. Что бы привязать его к элементу управления. В элементе управления укажи имя контекстного меню. И всё будет работать.

В визуальном редакторе в свойствах listView увидишь ContextMenuStrip. Вот и всё.
Далее настраиваешь контекстное меню под себя.



0



16 / 16 / 0

Регистрация: 10.04.2011

Сообщений: 271

19.05.2012, 01:01

 [ТС]

17

Я не вижу возможности привязать ContextMenuStrip к итему listView. К самому listView оно привязывается легко. А к итему как привязать?

Добавлено через 22 минуты

Не по теме:

Предчувствую, мне предстоит бессонная ночка.



0



hitmen047

Местный Ёжидзе

42 / 44 / 4

Регистрация: 03.03.2010

Сообщений: 225

19.05.2012, 18:07

18

Arimand, что бы обратиться к выделенному итему в listView используй:

C#
1
string s = ListView.Items[track_list.SelectedIndices[0]].Text // пример получение текста выбранного элемента в ListView



0



IBe3yH4uk

0 / 0 / 0

Регистрация: 04.10.2012

Сообщений: 4

05.10.2012, 00:12

19

Доброго времени суток! тоже пишу файловый менеджер, хотелось бы спросить как реализовывали поднятие на уровень вверх. Вот моя реализация:

Реализация обработчика:

C#
1
2
3
4
5
6
7
8
private void button1_Click(object sender, EventArgs e)
        {
            OneLevelUp();
            listView1.Items.Clear();
            DisplayFolder();
            DisplayFiles();
            
        }

Реализация метода реализующего поднятие на один уровень вверх:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private void OneLevelUp()
        {
                int position = 0;
 
            // Find position of last "" - (разделитель в пути к файлу)
                for (int counter = Fullpath.Length - 1; counter != 0; counter--)
                {
                    if (Fullpath[counter].ToString(CultureInfo.InvariantCulture) =="\")
                    {
 
                        position = counter;
                        break;
                    }
                }
 
                // Get substring
            
                string result = Fullpath.Substring(0, position);
                //Console.WriteLine(result);
 
                if (result[result.Length - 1] == ':')
                {
                    
                    result += "\";
                    LogicalDriver = result;
                    Fullpath = LogicalDriver;
                    Console.WriteLine("IF");
                    
                }
                else
                {
                    LogicalDriver = result;
                    Fullpath = LogicalDriver;
                    Console.WriteLine("ELSE");
                }
        }

Но вся проблема в том что когда я нажимаю на кнопку он почему то два раза заходит в метод, а по идеи должен всего 1 раз зайти. Помогите пожалуйста разобраться.



0



Introduction

Its easy to create a woindows explorer in WPF
Useing C#. This article defines how to create windows explorer in WPF using C#,
to create window explorer follow the bellow steps.

Take on combo box to your  in to your windows
and set the name property to cmbDirve, in the load event of windows  bind the
drives available in the system with combobox . see the bellow code

private
void Window_Loaded(object
sender, RoutedEventArgs e)

{

    this.cmbDrive.ItemsSource
= DriveInfo.GetDrives().Where(dr => dr.IsReady == true).ToList();

    this.cmbDrive.DisplayMemberPath
= «Name»;

    this.cmbDrive.SelectedValuePath
= «Name»;

}


Note:- the code ‘this.cmbDrive.ItemsSource = DriveInfo.GetDrives().Where(dr =>
dr.IsReady == true).ToList();’ Lists the Drives that is ready in the system.

Take  a Tree view controls in to your project
and set the name to tvDirectories. Create a custom Tree View Item buy creating a
class that inherits from Tree View Item class.

Declare two string  properties having name
Path and Type that will store Name and path of directory.

Again take a List Box Control to lists
contained file of current directory.

In the Select Index Changed event of Combo box
clear the items of combo Box and create the object of Directory Info class. In
the constructor of Directory info class pass the pass the selected value of
combo box as string.

Using while loop retrieve the directories of
current directory and pass to the custom tree view item and to the tree view

Add the files of current directory in to the
items of List box.

Again retrieve the list of child directory,
pass it to the custom tree view item and add it into the items of current tree
view item.

  
Above step 5, 6 and 7 will list the Directories, child directories and files of
parent directory into the tree view. See the bellow code     

     
private

void cmbDrive_SelectionChanged(object
sender, SelectionChangedEventArgs e)

      {

           this.tvwDirectory.Items.Clear();

          DirectoryInfo DIR =
new DirectoryInfo(this.cmbDrive.SelectedValue.ToString());

           foreach
(DirectoryInfo DR in DIR.GetDirectories())

           {

                 MyTreeViewItem
TVI = new MyTreeViewItem();

               TVI.Header =
DR.Name;

              TVI.Path =
DR.FullName;

               TVI.Expanded
+= new RoutedEventHandler(CTVI_Expanded);

               if
(!DR.Attributes.ToString().Contains(«Hidden»))

               {

                     foreach
(DirectoryInfo CDIR in DR.GetDirectories())

                    {

                        MyTreeViewItem
CTVI = new MyTreeViewItem();

                       CTVI.Expanded
+= new RoutedEventHandler(CTVI_Expanded);

                      CTVI.Header
= CDIR.Name;

                      CTVI.Path
= CDIR.FullName;

                        CTVI.Type
= CDIR.GetType().Name;

                         TVI.Items.Add(CTVI);

                     }

                  this.tvwDirectory.Items.Add(TVI);

                }

             }

             foreach
(FileInfo FL in DIR.GetFiles())

            {               

               this.ltbExplorer.Items.Add(FL.Name);

          }

In the expand event of Tree View control again
retrieve the child directories of current directory’s child directory and add
that in to the child items of current item’s(treeview’s current item)items
collection. See the bellow code.

   
void
CTVI_Expanded(object sender,
RoutedEventArgs e)

    {

        MyTreeViewItem TVI =
(MyTreeViewItem)sender;

       
foreach (MyTreeViewItem CTVI
in TVI.Items)

        {

           
if (CTVI.Type == «DirectoryInfo»)

            {

                DirectoryInfo
DIR = new DirectoryInfo(CTVI.Path);

               
foreach (DirectoryInfo CDIR
in DIR.GetDirectories())

                {

                   
MyTreeViewItem CTVI1 = new MyTreeViewItem();

                   
CTVI1.Expanded += new
RoutedEventHandler(CTVI_Expanded);

                   
CTVI1.Header = CDIR.Name;

                   
CTVI1.Path = CDIR.FullName;

                   
CTVI1.Type = CDIR.GetType().Name;

                   
if (CTVI.Items.Contains(CTVI1.Header) ==
false)

                       
CTVI.Items.Add(CTVI1);

                }

               
//foreach (FileInfo FL in DIR.GetFiles())

               
//{

               
//    MyTreeViewItem CTVI2 = new
MyTreeViewItem();

               
//    CTVI2.Expanded += new
RoutedEventHandler(CTVI_Expanded);

               
//    CTVI2.Header = FL.Name;

               
//    CTVI2.Path = FL.FullName;

               
//    CTVI2.Type = FL.GetType().Name;

               
//    CTVI.Items.Add(CTVI2);

               
//}

            }

        }

        e.Handled =
true;

    }

 In the selected changed event of tree
view controls retrieve the files of current directory and add that in to the
items of list box.

   
private

void tvwDirectory_SelectedItemChanged(object
sender, RoutedPropertyChangedEventArgs<object>
e)

    {

       
if (e.NewValue != null)

        {

           
this.ltbExplorer.Items.Clear();

            MyTreeViewItem
TVI = (MyTreeViewItem)e.NewValue;

            DirectoryInfo DIR
= new DirectoryInfo(TVI.Path);

           
foreach (FileInfo FL in
DIR.GetFiles())

            {

               
//MyTreeViewItem CTVI2 = new
MyTreeViewItem();

               
//CTVI2.Expanded += new
RoutedEventHandler(CTVI_Expanded);

               
//CTVI2.Header = FL.Name;

               
//CTVI2.Path = FL.FullName;

               
//CTVI2.Type = FL.GetType().Name;

               
ltbExplorer.Items.Add(FL.Name);

            }

        }

        e.Handled =
true;

    }

 
END

If any query, please feel free to comment, if
you like this article please don’t forget to liske.
 

Introduction

Its easy to create a woindows explorer in WPF
Useing C#. This article defines how to create windows explorer in WPF using C#,
to create window explorer follow the bellow steps.

Take on combo box to your  in to your windows
and set the name property to cmbDirve, in the load event of windows  bind the
drives available in the system with combobox . see the bellow code

private
void Window_Loaded(object
sender, RoutedEventArgs e)

{

    this.cmbDrive.ItemsSource
= DriveInfo.GetDrives().Where(dr => dr.IsReady == true).ToList();

    this.cmbDrive.DisplayMemberPath
= «Name»;

    this.cmbDrive.SelectedValuePath
= «Name»;

}


Note:- the code ‘this.cmbDrive.ItemsSource = DriveInfo.GetDrives().Where(dr =>
dr.IsReady == true).ToList();’ Lists the Drives that is ready in the system.

Take  a Tree view controls in to your project
and set the name to tvDirectories. Create a custom Tree View Item buy creating a
class that inherits from Tree View Item class.

Declare two string  properties having name
Path and Type that will store Name and path of directory.

Again take a List Box Control to lists
contained file of current directory.

In the Select Index Changed event of Combo box
clear the items of combo Box and create the object of Directory Info class. In
the constructor of Directory info class pass the pass the selected value of
combo box as string.

Using while loop retrieve the directories of
current directory and pass to the custom tree view item and to the tree view

Add the files of current directory in to the
items of List box.

Again retrieve the list of child directory,
pass it to the custom tree view item and add it into the items of current tree
view item.

  
Above step 5, 6 and 7 will list the Directories, child directories and files of
parent directory into the tree view. See the bellow code     

     
private

void cmbDrive_SelectionChanged(object
sender, SelectionChangedEventArgs e)

      {

           this.tvwDirectory.Items.Clear();

          DirectoryInfo DIR =
new DirectoryInfo(this.cmbDrive.SelectedValue.ToString());

           foreach
(DirectoryInfo DR in DIR.GetDirectories())

           {

                 MyTreeViewItem
TVI = new MyTreeViewItem();

               TVI.Header =
DR.Name;

              TVI.Path =
DR.FullName;

               TVI.Expanded
+= new RoutedEventHandler(CTVI_Expanded);

               if
(!DR.Attributes.ToString().Contains(«Hidden»))

               {

                     foreach
(DirectoryInfo CDIR in DR.GetDirectories())

                    {

                        MyTreeViewItem
CTVI = new MyTreeViewItem();

                       CTVI.Expanded
+= new RoutedEventHandler(CTVI_Expanded);

                      CTVI.Header
= CDIR.Name;

                      CTVI.Path
= CDIR.FullName;

                        CTVI.Type
= CDIR.GetType().Name;

                         TVI.Items.Add(CTVI);

                     }

                  this.tvwDirectory.Items.Add(TVI);

                }

             }

             foreach
(FileInfo FL in DIR.GetFiles())

            {               

               this.ltbExplorer.Items.Add(FL.Name);

          }

In the expand event of Tree View control again
retrieve the child directories of current directory’s child directory and add
that in to the child items of current item’s(treeview’s current item)items
collection. See the bellow code.

   
void
CTVI_Expanded(object sender,
RoutedEventArgs e)

    {

        MyTreeViewItem TVI =
(MyTreeViewItem)sender;

       
foreach (MyTreeViewItem CTVI
in TVI.Items)

        {

           
if (CTVI.Type == «DirectoryInfo»)

            {

                DirectoryInfo
DIR = new DirectoryInfo(CTVI.Path);

               
foreach (DirectoryInfo CDIR
in DIR.GetDirectories())

                {

                   
MyTreeViewItem CTVI1 = new MyTreeViewItem();

                   
CTVI1.Expanded += new
RoutedEventHandler(CTVI_Expanded);

                   
CTVI1.Header = CDIR.Name;

                   
CTVI1.Path = CDIR.FullName;

                   
CTVI1.Type = CDIR.GetType().Name;

                   
if (CTVI.Items.Contains(CTVI1.Header) ==
false)

                       
CTVI.Items.Add(CTVI1);

                }

               
//foreach (FileInfo FL in DIR.GetFiles())

               
//{

               
//    MyTreeViewItem CTVI2 = new
MyTreeViewItem();

               
//    CTVI2.Expanded += new
RoutedEventHandler(CTVI_Expanded);

               
//    CTVI2.Header = FL.Name;

               
//    CTVI2.Path = FL.FullName;

               
//    CTVI2.Type = FL.GetType().Name;

               
//    CTVI.Items.Add(CTVI2);

               
//}

            }

        }

        e.Handled =
true;

    }

 In the selected changed event of tree
view controls retrieve the files of current directory and add that in to the
items of list box.

   
private

void tvwDirectory_SelectedItemChanged(object
sender, RoutedPropertyChangedEventArgs<object>
e)

    {

       
if (e.NewValue != null)

        {

           
this.ltbExplorer.Items.Clear();

            MyTreeViewItem
TVI = (MyTreeViewItem)e.NewValue;

            DirectoryInfo DIR
= new DirectoryInfo(TVI.Path);

           
foreach (FileInfo FL in
DIR.GetFiles())

            {

               
//MyTreeViewItem CTVI2 = new
MyTreeViewItem();

               
//CTVI2.Expanded += new
RoutedEventHandler(CTVI_Expanded);

               
//CTVI2.Header = FL.Name;

               
//CTVI2.Path = FL.FullName;

               
//CTVI2.Type = FL.GetType().Name;

               
ltbExplorer.Items.Add(FL.Name);

            }

        }

        e.Handled =
true;

    }

 
END

If any query, please feel free to comment, if
you like this article please don’t forget to liske.
 

Содержание

  1. Как создать свой проводник для windows
  2. Подключение USB-накопителя.
  3. Создание новой папки в ПРОВОДНИКЕ
  4. Удаление папок из ПРОВОДНИКА.
  5. Копирование папок и файлов в ПРОВОДНИКЕ.
  6. Попробовал Files — файловый менеджер для Windows. Подходит тем, кому надоел стандартный «Проводник»
  7. Попробовал Files — файловый менеджер для Windows. Подходит тем, кому надоел стандартный «Проводник»
  8. Что понравилось в файловом менеджере Files
  9. Проводник Windows
  10. Содержание:
  11. Clover 3.4.5 beta
  12. Сравнение с платным аналогом
  13. Установка программы
  14. Настройки программы Clover
  15. Работа с закладками
  16. Работа с вкладками
  17. Достоинства и недостатки программы
  18. Выводы

Как создать свой проводник для windows

Продолжая тему прошлого занятия, в котором мы узнали, что такое программа Проводник в Windows 10 приступим к практическим действиям и научимся манипулировать файлами и папками с помощью данного ПО.

Умение управлять информацией на компьютере является одним из основных навыков которые должен знать каждый пользователь, поэтому Вам следует изучить этот урок и самостоятельно потренироваться для закрепления знаний.

Все действия будем выполнять на конкретном примере. Моделируем следующую ситуацию:

У нас есть флешка, на которой лежат три папки с новогодними фотографиями. Пусть они будут называться: 1 января, 2 января и 3 января. Нам же необходимо скопировать данные папке к себе на компьютер.

Далее будет описана последовательность некоторых действий, на протяжении которых мы шаг за шагом изучим тему данного урока.

Подключение USB-накопителя.

Подключаем носитель информации (в нашем случае флешку) к компьютеру в результате чего:

  1. Прозвучит характерный звуковой сигнал, информирующий о подключении нового оборудования.
  2. Система определит это оборудование и присвоит ему букву диска.
  3. Произойдет автоматический запуск окна Проводника, в котором будет отображаться содержимое флешки.

Возможен такой вариант, что вместо автозапуска система попросит выбрать действие с подключенной флешкой. Жмем по данному сообщению (изображение ниже).

Далее выбираем пункт: «Открыть папку для просмотра файлов».

Если же вдруг, по каким-либо причинам окно не запустится автоматом, то открываем ПРОВОДНИК вручную (как это сделать Вы должны знать из предыдущего урока). В левой части ищем нужную флешку и кликаем по ней левой кнопкой мыши. Соответственно в правой части отображается ее содержимое.

Совет на случай если Вы не понимаете как найти нужную флэш карту в ПРОВОДНИКЕ:

  • Извлекаете (выдергивайте) флэшку из компьютера, соответственно в левой части ПРОВОДНИКА она пропадает.
  • Вставляете ее обратно наблюдая изменения в левой части ПРОВОДНИКА. То устройство, которое отобразится (добавится в существующий список) и есть нужная нам флэшка.

Итак, идем дальше.

Создание новой папки в ПРОВОДНИКЕ

Придерживаясь нашей легенды, мы имеем фотографии на переносном носителе информации, которые надо сохранить на компьютер. Для этого удобнее будет на жестком диске компьютера создать папку и назвать ее соответствующим именем (чтобы в дальнейшем не заблудится в своих фото). Работать будем в уже имеющейся папке ИЗОБРАЖЕНИЯ. Для этого:

  1. Открываем ПРОВОДНИК если он еще не открыт
  2. Слева выбираем ЭТОТ КОМПЬЮТЕР
  3. Справа щелкаем два раза левой кнопкой мыши по ИЗОБРАЖЕНИЯ, тем самым заходим в эту папку.

  1. На панели инструментов (в ленте) нажимаем левой кнопкой мыши Создать
  2. Из выпадающего меню выбираем Новая папка

Тем самым мы создали новую папку, которую желательно переименовать. Для этого:

  1. Щелкаем по ней ПРАВОЙ кнопкой мыши
  2. Из контекстного меню выбираем Переименовать
  3. С клавиатуры набираем подходящее название. В нашем случае назовем «Новый год 2019».

Так же существуют и другие способы для создания папок в ПРОВОДНИКЕ. Это можно сделать следующим образом:

  1. В правой части ПРОВОДНИКА щелкаем ПРАВОЙ кнопкой мыши по пустому месту
  2. Из контекстного меню выбираем Создать
  3. Выпадает еще одно меню где выбираем Папку

Еще один способ создания папки с помощью клавиатуры. Для этого, находясь в ПРОВОДНИКЕ зажимаем одновременно клавиши Ctrl + Shift + N

Для закрепления потренируйтесь в создании папок различными способами.

Удаление папок из ПРОВОДНИКА.

В результате тренировок мы создали ненужные папки, которые сейчас удалим. Для этого так же воспользуемся несколькими способами:

  1. Выделяем ненужную папку щелкнув по ней один раз левой кнопкой мыши.
  2. На панели инструментов нажимаем красный крестик.

  1. Выделяем папку которую будем удалять.
  2. На клавиатуре нажимаем кнопку Delete (иногда пишут Del).
  1. Нажимаем ПРАВОЙ кнопкой мыши по ненужной папке.
  2. Выбираем из открывшегося списка пункт меню Удалить.

Таким образом мы очищаем свой компьютер от ненужных файлов и папок.

Копирование папок и файлов в ПРОВОДНИКЕ.

Итак, нужную нам папку мы создали. Далее предстоит скопировать информацию с флэшки в эту папку. И снова разберем несколько способов.

  1. Подключаем карту памяти (флэшку) к компьютеру если она еще не подключена
  2. Запускаем ПРОВОДНИК и открываем флэшку.
  3. ПРАВОЙ кнопкой мыши жмем по папке 1 ЯНВАРЯ (в правой или левой части не имеет значения).
  4. Из контекстного меню выбираем Копировать.

  1. Переходим в созданную ранее папку на компьютере. Для этого в левой части ПРОВОДНИКа два раза левой кнопкой мыши открываем Этот компьютер, далее Изображения, далее щелкаем по Новый год 2019
  2. В правой части опять вызываем контекстное меню щелкнув ПРАВОЙ кнопкой мыши по свободному месту и выбираем Вставить.

Вторую папку скопируем следующим образом:

  1. В правой части ПРОВОДНИКА остается все по-прежнему (то есть открыта созданная нами папка Новый год 2019, в которой уже лежит скопированная ранее папка 1 января ).
  2. В левой же части снова раскрываем содержимое флешки путем нажатия стрелочек слева (это важно поскольку данный метод позволяет переходить по папкам в левой части ПРОВОДНИКа не меняя тем самым отображения информации в правой его части).
  3. Щелкаем левой кнопкой мыши по папке 2 января и не отпуская кнопки перетягиваем папку в правую часть.
  4. Отпускаем кнопку мыши в свободном месте тем самым скопировав папку.

И еще один способ — с помощью клавиатуры. Для этого:

  1. На флешке выделяем папку 3 января
  2. Нажимаем на клавиатуре комбинацию клавиш Ctrl+C тем самым скопировав данную папку
  3. Переходим в созданную нами папку Новый год 2019
  4. Нажимаем комбинацию клавиш Ctrl+V что приведет к вставке скопированной информации в нужную нам папку.

Работа с файлами происходит аналогично. Так же есть возможность выделять и копировать не по одному файлу или папке а сразу все или же выборочно. С этим Вам может помочь как ЛЕНТА, так и определенные клавиши на клавиатуре. Здесь работа происходит в правой части ПРОВОДНИКа. Для того чтобы выделить некоторые файлы или папки, следует зажать клавишу Ctrl на клавиатуре и затем, не отжимая ее, левой кнопкой мыши щелкать по нужным файлам (папкам). Таким же способом можно использовать клавишу Shift. Эта клавиша дает другой «эффект». Потренируйтесь самостоятельно и увидите разницу.

Ну а на сегодня все. Для усвоения материала данного урока потребуется много упорства и тренировок. С определенным опытом все манипуляции будут проходить на автомате, пальцы будут сами нажимать по нужным кнопкам не задействовав при этом голову. Так что экспериментируйте и набирайтесь опыта.

Попробовал Files — файловый менеджер для Windows. Подходит тем, кому надоел стандартный «Проводник»

Попробовал Files — файловый менеджер для Windows. Подходит тем, кому надоел стандартный «Проводник»

Мне кажется, что «Проводник» сильно отстал от жизни и в плане дизайна, и с точки зрения функциональности. Я пытался выбрать другой файловый менеджер для Windows, но так и не нашёл подходящий вариант. Либо слишком много функций, как в Total Commander, либо отвратительный внешний вид.

А потом я нашёл Files и понял, что это отличная замена стандартному «Проводнику». Для работы с ним не нужно перестраиваться, есть кастомизация и несколько интересных фишек.

По умолчанию Files открывается на стартовой странице, но можно выбрать любую папку

Files — файловый менеджер с открытым исходным кодом, который использует последние возможности Windows, включая Fluent Design. По функциональности он не сравнится с Total Commander и другими файловыми менеджерами. Но Files неплохо закрывает потребности обычных пользователей.

Что понравилось в файловом менеджере Files

  • Есть вкладки, которые обещают добавить в «Проводник» уже больше 3 лет. QTTabBar и Clover всегда казались мне плохой альтернативой.
  • Внешний вид — наконец-то Fluent Design.
  • Изменение светлой/тёмной темы. Отдельная настройка, только для файлового менеджера, а не для всей Windows.
  • Настройки запуска — можно сразу начинать с новой вкладки, открывать определённую папку или продолжить с места, на котором закрыл менеджер.
  • Двойная панель — можно открывать все новые вкладки в ней по умолчанию или выбирать этот режим вручную.
  • Опция «Открыть в терминале» — можно выбрать CMD или PowerShell.

Классический вид файлового менеджера для удобной работы с файлами

Какие-то функции мигрировали из стандартного «Проводника» и просто стали чуть более удобными — например, управление сортировкой и отображением. Больше нет страшной верхней панели со всеми этими настройками. Все параметры кастомизации находятся на отдельной странице.

Настроек не очень много, но все полезные

В итоге я убрал стандартный «Проводник» с таскбара и прикрепил Files. Можно также перенастроить сочетание Win + E, чтобы оно запускало новый файловый менеджер для Windows. В документации Files предлагают два способа:

  • скрипт, добавленный через программу AutoHotKey;
  • редактирование реестра.

Первый способ безопаснее и проще. Если выберете редактирование реестра, не забудьте сначала сделать его резервную копию.

Проводник Windows

Содержание:

Проводник Windows (англ. Explorer) — это встроенное в ОС семейства Windows средство визуального управления файлами и папками на жестком диске и подключаемых устройствах.

Многие пользователи привыкают к Проводнику настолько, что даже не хотят замечать его очевидных недостатков в плане навигации и работы с файлами, тогда как другие полностью отказываются от него в пользу полновесных файловых менеджеров.

Если Вы причисляете себя к первому типу пользователей и отказываться от Проводника не желаете, то возможно Вам захочется как-то улучшить его. В данном случае Вам поможет программа, размещенная на этой страничке. Она позволяет сохранить привычный вид Проводника, но при этом существенно улучшает его функциональные возможности.

Clover 3.4.5 beta

Интерфейс: Русский/Английский Платформа: Лицензия: FreeWare Обновлено: 2019-03-21

Версия 3.4.5 beta, 23 июня 2018 г.

  • исправлена ошибка при работе на Windows 10;
  • исправлена ошибка авторизации.

Версия 3.4.3 beta, 10 апреля 2018 г.

  • добавлена функция дублирования вкладок кнопками CTRL+K;
  • исправлена ошибка экспорта закладок;
  • исправлена ошибка зависания Проводника.

Версия 3.4.0 beta, 27 сентября 2017 г.

  • улучшен интерфейс менеджера закладок;
  • исправлена ошибка при переименовании закладок;
  • исправлено отображение некоторых иконок.

Версия 3.3.5 beta, 12 мая 2017 г.

  • оптимизирован интерфейс окна авторизации;
  • добавлен механизм создания ярлыков для открытия окон;
  • исправлена ошибка копирования тегов;
  • исправлена поддержка Windows Server 2012.

Версия 3.2.7 beta, 19 января 2017 г.

  • добавлена возможность создания учётных записей пользователей;
  • добавлена VIP-возможность скрытия рекламы;
  • улучшено открытие закладки в текущей вкладке;
  • исправлена ошибка импорта и экспорта закладок.

Версия 3.2.0 beta, 25 июля 2016 г.

  • добавлена возможность копировать страницы во вкладках;
  • добавлена возможность показывать и скрывать панель закладок клавишами CTRL+B;
  • улучшено контекстное меню;
  • улучшен механизм автообновления;
  • исправлен ряд ошибок.

Версия 3.0.406, 26 января 2014 г.

  • улучшена скорость создания вкладок;
  • улучшена цветовая гамма элементов интерфейса в контрастных и темных темах;
  • исправлены конфликты с Windows 8 и 8.1;
  • несколько других исправлений.

Программа для улучшения функционала стандартного Проводника Windows. Она позволяет интегрировать в Проводник некоторые функции популярного браузера Google Chrome, такие как работа с несколькими вкладками в одном окне и создание закладок для часто используемых файлов и папок.

Многие часто отпускают разные шуточки по поводу работы операционных систем семейства Windows. Это – чаще всего «продвинутые» пользователи, которые перешли на Linux и иже с ними :).

Многие, скрепя сердце, терпят неудобства в работе с ПК, постепенно привыкая к ним. И лишь немногие пытаются как-либо улучшить свою систему, добавляя к ней разнообразные полезные функции, которые существенно облегчают выполнение повседневных задач.

В нашей сегодняшней статье я хотел бы коснуться темы улучшения Проводника Windows. Некоторые пользователи раз и навсегда решили для себя избавиться от него и пользоваться сторонними файловыми менеджерами.

Это тоже вариант, но обычно многие так и остаются «привязанными» к стандартному средству доступа к файлам. И именно для таких пользователей сторонние разработчики пишут десятки разнообразных приложений, которые существенно улучшают старый добрый Проводник.

Не секрет, что в основе Проводника лежит пресловутый Internet Explorer, только урезанный и адаптированный для работы с локальной файловой системой. Разработчики программы Clover, о которой сегодня и пойдет речь, решили, что раз уж основой для стандартного просмотрщика файлов Windows является браузер, то пусть им будет… Chrome!

Соответственно, установив Clover, мы получим «хромоподобный» внешний вид Проводника с возможностями создания нескольких вкладок (вместо открытия новых окон) и закладок для быстрого перехода в нужные директории!

Но обо всем в свое время, а пока предлагаю небольшое сравнение Clover с платным аналогом, улучшающим работу с файлами в Проводнике – Xplorer 2 :

Сравнение с платным аналогом

Особенности Clover Xplorer 2
Стоимость бесплатно 1144,98 руб.
Создание нескольких вкладок + +
Создание ссылок на часто открываемые папки + +
Двухпанельный интерфейс +
Предпросмотр текста +
Сравнение и синхронизация папок +
Изменения в Проводнике добавляется панель вверху полная подмена интерфейса

Clover – не такой функциональный, как другие подобные утилиты, но понравился мне прежде всего тем, что практически не изменяет внешнего вида Проводника Windows. Это позволяет комфортно использовать стандартную боковую панель задач. То есть не нужно переучиваться и запоминать, что и где (в плане функций) теперь находится – все остается как было, и даже лучше 🙂

Установка программы

Установка не займет у Вас много времени. Достаточно скачать архив с программой и запустить из него установочный файл. В появившемся окошке жмем кнопку «Next», а в следующем выбираем (если нужно) место для установки, жмем кнопку «Install» и дожидаемся окончания процесса инсталляции.

После завершения установки на Вашем рабочем столе появится иконка программы и запустится окно «Мой компьютер», которое теперь будет иметь такой внешний вид:

Как видим, фактически все осталось на своих местах, однако добавилось три новых пунктика: появилась возможность создавать вкладки, активировалась панель закладок и добавилась кнопка в виде гаечного ключа для настройки нашей программы.

Настройки программы Clover

Первым делом, давайте заглянем в меню настроек Clover:

Если честно, то оно меня слегка разочаровало… Дело в том, что настроек-то, по сути, и нет никаких :). Все, что мы можем – это открыть новую вкладку, новое окно и скрыть панель закладок. Не густо, правда, не очень-то и хотелось :). Действительно, чем меньше возможностей кастомизации, тем меньше шансов где-то «накосячить» 😉

Интересно, что, выбрав пункт «О Clover», мы увидим окошко, в котором сможем проверить, не появилось ли для нашей программы обновлений. Выглядит оно, кстати, так же как и у браузера Хром.

Пункт «Справка» отправит нас на официальный сайт программы (кстати, китайский :)), а «Выход», вопреки ожиданиям, не отключит новые функции, а просто закроет текущее окно.

Работа с закладками

Как мы выяснили выше, закладки в Clover – единственная вещь, которую можно настроить, поэтому начнем с них:

Добавить закладку на нужную папку или файл можно несколькими способами:

  1. Перетащить иконку папки (или файла) на панель закладок;
  2. Выделить папку и нажать комбинацию клавиш «CTRL+D»;
  3. Вызвать контекстное меню панели закладок и нажать пункт «Добавить страницу».

Кроме того, как и в «хромоподобных» браузерах мы имеем возможность группировать наши закладки по определенным папкам. Вызовите контекстное меню панели закладок и активируйте пункт «Добавить папку»:

В появившемся окошке в поле «Имя» введите нужное название для своей папки и нажмите «Сохранить». Если же требуется создать несколько папок, то это можно сделать, нажимая повторно кнопку «Новая папка». В полученные папки закладки добавляются по тем же принципам, что и на панель закладок.

Используя закладки, Вы сможете получить доступ к любым папкам, файлам и даже программам, получив, таким образом, отличный инструмент для быстрого вызова нужных функций!

Работа с вкладками

Главным же козырем Clover является функция добавления в Проводник вкладок:

Как и в работе с закладками, самым удобным способом открытия нужных папок в новых вкладках является метод перетаскивания их на панель вкладок. При этом курсор будет принимать форму стрелочки, которая указывает, нужно ли вставить новую вкладку после существующей, перед ней или же открыть в текущей вкладке (см. скриншот выше).

Однако на деле возможностей создания вкладки гораздо больше:

  1. Уже упомянутое перетаскивание (открывает выбранную папку в новой вкладке);
  2. Нажатие кнопки в виде параллелограмма справа от последней открытой вкладки (открывает новую вкладку «Мой компьютер»);
  3. Сочетание клавиш «CTRL+T» (открывает новую вкладку «Мой компьютер»);
  4. Пункт «Новая вкладка» в Настройках и в контекстном меню панели вкладок (открывает новую вкладку «Мой компьютер»).

Касательно последнего пункта хочется поговорить отдельно:

В контекстном меню Вы можете найти еще один довольно удобный способ создания новой вкладки – «Дублировать». Он позволяет быстро создать копию текущей выбранной вкладки.

Кроме того полезными пунктами здесь будут «Открыть закрытую вкладку», который позволяет вернуть недавно просмотренные вкладки, которые Вы закрыли, и «Закрепить вкладку». Последняя функция позволяет нам сохранить нужные открытые вкладки даже после выключения Проводника!

Помимо простого удобства отображения нескольких директорий в одном окне, Вы еще можете и легко перетаскивать файлы и папки между открытыми вкладками, так, что необходимость в многопанельных интерфейсах отпадает сама собой!

На этом, пожалуй, и все :). Настало время подводить итоги.

Достоинства и недостатки программы

Плюсы:

  • расширение функционала без изменения внешнего вида Проводника;
  • поддержка открытия нескольких папок в разных вкладках одного окна;
  • развитая система закладок для быстрого перехода к нужным папкам и файлам;
  • удобные функции управления вкладками;
  • перемещение файлов и папок между открытыми вкладками.

Минусы:

Выводы

Вывод напрашивается сам собой – если Вы не привыкли в своей работе использовать разнообразные файловые менеджеры, то Clover станет отличным дополнением к Вашему стандартному Проводнику.

С его помощью Вы не только упростите навигацию по файловой системе и копирование данных из одной папки в другую, но и сможете организовать собственную панель быстрого вызова для любых программ или папок! И все это – без существенных изменений в функционале стандартного Проводника!

About

Написать программу «Проводник» • При первом запуске программа отображает список доступных дисков. • Программа должна содержать дерево дисков, строку адреса, меню, панель инструментов и окно для отображения содержимого папки. • Дерево дисков отображает только диски и папки (можно реализовать с • помощью ListBox). • При двойном щелчке по папке — в…

Stars

0
stars

Watchers

1
watching

Forks

0
forks

Понравилась статья? Поделить с друзьями:
  • Как написать свой телеграмм другому человеку
  • Как написать свой текстовый редактор
  • Как написать свой текст для песни
  • Как написать свой сюжет
  • Как написать свой почтовый сервер