Сегодня мы расширим использование модели в 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;
Запустим
Мы и получили список файлов папки, из которой производится запуск нашей программы.
Рассмотрим код модели:
В методе 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).
Запустим
Уже лучше, но всё равно непонятно, где папка, а где файл. Давайте добавим иконки для каждой строки.
Для начала нам понадобятся сами иконки, скачать вы их можете с Яндекс.Диска — 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;
}
Запустим:
Здесь все просто, для роли 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
Запускаем:
У архива своя иконка.
Обратите внимание, если у вас имя архива начинается с точки, он не будет нормально обработан, я случайно столкнулся с этим, создавая архив. В принципе с точки начинаются только системные или служебные файлы, так что это не важно.
Таким же образом вы можете добавить иконки для других расширений файлов.
Открываем файлы, как в Проводнике 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());
Запустим:
Путь появился в строке.
Меняем текущую папки при двойном щелчке
Давайте добавим функционал перехода в папку, при двойном щелчке на нее.
Изменим метод слота 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
Добавим слоты для кнопок
Для перехода в режим списка:
void MainWindow::on_pushButton_3_clicked()
{
this->ui->listView->setViewMode(QListView::ListMode);
}
Для перехода в режим иконок:
void MainWindow::on_pushButton_2_clicked()
{
this->ui->listView->setViewMode(QListView::IconMode);
}
Запускаем:
При переходе в режим иконок всё съезжает и выглядит очень некрасиво. Доработает методы:
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);
}
Запускаем:
Уже лучше.
Управляем отображением иконок в окне:
Добавим в конструктор окна строку
this->ui->listView->setWrapping(true);
Теперь у нас папки отображаются в несколько колонок.
Заменим эту строку на
this->ui->listView->setWordWrap(true);
Имена файлов будут переноситься на новую строку, чтобы вместиться по ширине.
Заключение
Сегодня мы начали создание собственного файлового менеджера, с файлами и папками…
Был создан новый проект, на форму добавлен 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()
При нажатии на файл должно выводиться контекстное меню:
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
Здравствуйте. Вопрос заключается в том.. с чего вообще начать? Я честно говоря даже не знаю, с какой стороны подступиться к подобному заданию. В общем, буду очень благодарен за дельные советы)
__________________
0 |
Etrimus 398 / 365 / 54 Регистрация: 23.05.2010 Сообщений: 716 |
||||
15.05.2012, 10:47 |
2 |
|||
Для начала посмотри про классы и методы получения списков файлов и папок.
Дальше обрабатываешь события двойного клика на элементы в ЛистВью и отображаешь список файлав и папок в той папке, по которой кликнуто в ЛистВью.
1 |
16 / 16 / 0 Регистрация: 10.04.2011 Сообщений: 271 |
|
16.05.2012, 14:41 [ТС] |
3 |
Посмотрел на msdn-е и взял за основу это: Проблема 1:
0 |
Etrimus 398 / 365 / 54 Регистрация: 23.05.2010 Сообщений: 716 |
||||
16.05.2012, 19:22 |
4 |
|||
Пишу с нетбука, где нет студии, не отвечу на вопросы про код.
Как реализовать разные значки для разных расширений файлов? Средствами C# можно так — http://msdn.microsoft.com/ru-r… .icon.aspx Код %SystemRoot%system32SHELL32.dll Там куча системных картинок, вот только средствами одного NET достать их вроде как не выйдет, для этого придётся использовать WinAPI или сторонние классы. Поэтому для файлов можно брать иконки как я показал, я для папок задавать жестко, например, засунуть в ресурсы программы готовый файл. И да — можно ли «вытащить» значки из проводника винды, или откуда-то из винды вообще Что бы просто сохранить к себе на компьютер, есть специальные программы, например Resource Hacker или подобные. Добавлено через 14 минут
Как удалить предыдущий узел? А то после каждой «перейти» создается в левом окошке новый узел, а старый не исчезает? У Treeview есть свойство Nodes, которое является массивом всех корневых элементов. Вот так можно удалить самый верхний элемент
1 |
16 / 16 / 0 Регистрация: 10.04.2011 Сообщений: 271 |
|
17.05.2012, 11:56 [ТС] |
5 |
Благодарю) ************** Текст исключения ************** Ввожу диск D — начинает что-то ОЧЕНЬ долго грузить почему-то, а потом — снова же «отказано в доступе» к D:System Volume Information
0 |
398 / 365 / 54 Регистрация: 23.05.2010 Сообщений: 716 |
|
17.05.2012, 12:45 |
6 |
Ввожу в свою «адресную строку» диск C
Отказано в доступе по пути «C:Documents and Settings». Прочитай обе строчки ещё раз. Из них видно, что ты чего-то не то вводишь, потому что по факту программа пытается зайти не на диск С, а на C:Documents and Settings. В коде значит где-то намудрил.
2 |
Arimand 16 / 16 / 0 Регистрация: 10.04.2011 Сообщений: 271 |
||||
17.05.2012, 13:06 [ТС] |
7 |
|||
Прочитай обе строчки ещё раз. Из них видно, что ты чего-то не то вводишь, потому что по факту программа пытается зайти не на диск С, а на C:Documents and Settings. В коде значит где-то намудрил. Посмотрел еще раз на код, понял, в чем проблема: программа рекурсивно перебирает все папки внутри заданой, и таким образом формирует «дерево» папок. То, что оно «не пускает» — это понятно. Как сделать исключение, чтобы оно «обходило стороной» такие гадкие папки?
0 |
Etrimus 398 / 365 / 54 Регистрация: 23.05.2010 Сообщений: 716 |
||||||||
17.05.2012, 13:14 |
8 |
|||||||
формировал бы только список папок в _данной_ дирректории. Можно сразу получить массив с путями и к файлам, и к папкам. Удобно.
Добавлено через 3 минуты
Как сделать исключение, чтобы оно «обходило стороной» такие гадкие папки? Обрабатывай исключения в программе. Вот простой пример, почитай про исключения в C#.
1 |
16 / 16 / 0 Регистрация: 10.04.2011 Сообщений: 271 |
|
17.05.2012, 13:23 [ТС] |
9 |
Спасибо, проблему с обработкой я решил.) +К этому: как заставить программу открыть файл ( так, как они открываются через проводник — в смысле .txt через блокнот, приложение — как приложение, .doc — через офис и т.д. ) ?
0 |
Etrimus 398 / 365 / 54 Регистрация: 23.05.2010 Сообщений: 716 |
||||||||
17.05.2012, 13:34 |
10 |
|||||||
А вот как лучше реализовать копирование? Для файлов просто
Для папок. Ну тут придётся руками… Создаём в нужном месте папку, и в неё циклом копируем (File.Copy) все файлы из копируемой папки.
И после символа точки ВизуалСтудия вывалит всё, что нужно. Копировать, перемещать, удалять, переименовывать файлы и папки. Халява полная, но это если прокатит у тебя перед преподом.
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 |
|||
Ну тогда всё ОК, вот ещё про запуск файлов.
К стати, если написать туда не путь к файлу, а интернет-адрес, то запустится браузер и перейдёт на этот адрес.
0 |
16 / 16 / 0 Регистрация: 10.04.2011 Сообщений: 271 |
|
17.05.2012, 14:21 [ТС] |
13 |
Снова появилась неожиданная проблема:
0 |
Etrimus 398 / 365 / 54 Регистрация: 23.05.2010 Сообщений: 716 |
||||
17.05.2012, 15:31 |
14 |
|||
А в чём проблема, подключаешь через Студию контекстное меню. У каждого элемента контекстного меню есть событие Click. Подписываешься на него, а в событии уже работаешь с выделенными в ЛистВью элементами.
Показал в окошке текс первого выделенного элемента в ЛистВью.
0 |
16 / 16 / 0 Регистрация: 10.04.2011 Сообщений: 271 |
|
17.05.2012, 15:57 [ТС] |
15 |
Нет, я не о том.
0 |
Местный Ёжидзе 42 / 44 / 4 Регистрация: 03.03.2010 Сообщений: 225 |
|
17.05.2012, 19:14 |
16 |
Arimand, В визуальном редакторе в свойствах 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 используй:
0 |
IBe3yH4uk 0 / 0 / 0 Регистрация: 04.10.2012 Сообщений: 4 |
||||||||
05.10.2012, 00:12 |
19 |
|||||||
Доброго времени суток! тоже пишу файловый менеджер, хотелось бы спросить как реализовывали поднятие на уровень вверх. Вот моя реализация: Реализация обработчика:
Реализация метода реализующего поднятие на один уровень вверх:
Но вся проблема в том что когда я нажимаю на кнопку он почему то два раза заходит в метод, а по идеи должен всего 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.
Содержание
- Как создать свой проводник для windows
- Подключение USB-накопителя.
- Создание новой папки в ПРОВОДНИКЕ
- Удаление папок из ПРОВОДНИКА.
- Копирование папок и файлов в ПРОВОДНИКЕ.
- Попробовал Files — файловый менеджер для Windows. Подходит тем, кому надоел стандартный «Проводник»
- Попробовал Files — файловый менеджер для Windows. Подходит тем, кому надоел стандартный «Проводник»
- Что понравилось в файловом менеджере Files
- Проводник Windows
- Содержание:
- Clover 3.4.5 beta
- Сравнение с платным аналогом
- Установка программы
- Настройки программы Clover
- Работа с закладками
- Работа с вкладками
- Достоинства и недостатки программы
- Выводы
Как создать свой проводник для windows
Продолжая тему прошлого занятия, в котором мы узнали, что такое программа Проводник в Windows 10 приступим к практическим действиям и научимся манипулировать файлами и папками с помощью данного ПО.
Умение управлять информацией на компьютере является одним из основных навыков которые должен знать каждый пользователь, поэтому Вам следует изучить этот урок и самостоятельно потренироваться для закрепления знаний.
Все действия будем выполнять на конкретном примере. Моделируем следующую ситуацию:
У нас есть флешка, на которой лежат три папки с новогодними фотографиями. Пусть они будут называться: 1 января, 2 января и 3 января. Нам же необходимо скопировать данные папке к себе на компьютер.
Далее будет описана последовательность некоторых действий, на протяжении которых мы шаг за шагом изучим тему данного урока.
Подключение USB-накопителя.
Подключаем носитель информации (в нашем случае флешку) к компьютеру в результате чего:
- Прозвучит характерный звуковой сигнал, информирующий о подключении нового оборудования.
- Система определит это оборудование и присвоит ему букву диска.
- Произойдет автоматический запуск окна Проводника, в котором будет отображаться содержимое флешки.
Возможен такой вариант, что вместо автозапуска система попросит выбрать действие с подключенной флешкой. Жмем по данному сообщению (изображение ниже).
Далее выбираем пункт: «Открыть папку для просмотра файлов».
Если же вдруг, по каким-либо причинам окно не запустится автоматом, то открываем ПРОВОДНИК вручную (как это сделать Вы должны знать из предыдущего урока). В левой части ищем нужную флешку и кликаем по ней левой кнопкой мыши. Соответственно в правой части отображается ее содержимое.
Совет на случай если Вы не понимаете как найти нужную флэш карту в ПРОВОДНИКЕ:
- Извлекаете (выдергивайте) флэшку из компьютера, соответственно в левой части ПРОВОДНИКА она пропадает.
- Вставляете ее обратно наблюдая изменения в левой части ПРОВОДНИКА. То устройство, которое отобразится (добавится в существующий список) и есть нужная нам флэшка.
Итак, идем дальше.
Создание новой папки в ПРОВОДНИКЕ
Придерживаясь нашей легенды, мы имеем фотографии на переносном носителе информации, которые надо сохранить на компьютер. Для этого удобнее будет на жестком диске компьютера создать папку и назвать ее соответствующим именем (чтобы в дальнейшем не заблудится в своих фото). Работать будем в уже имеющейся папке ИЗОБРАЖЕНИЯ. Для этого:
- Открываем ПРОВОДНИК если он еще не открыт
- Слева выбираем ЭТОТ КОМПЬЮТЕР
- Справа щелкаем два раза левой кнопкой мыши по ИЗОБРАЖЕНИЯ, тем самым заходим в эту папку.
- На панели инструментов (в ленте) нажимаем левой кнопкой мыши Создать
- Из выпадающего меню выбираем Новая папка
Тем самым мы создали новую папку, которую желательно переименовать. Для этого:
- Щелкаем по ней ПРАВОЙ кнопкой мыши
- Из контекстного меню выбираем Переименовать
- С клавиатуры набираем подходящее название. В нашем случае назовем «Новый год 2019».
Так же существуют и другие способы для создания папок в ПРОВОДНИКЕ. Это можно сделать следующим образом:
- В правой части ПРОВОДНИКА щелкаем ПРАВОЙ кнопкой мыши по пустому месту
- Из контекстного меню выбираем Создать
- Выпадает еще одно меню где выбираем Папку
Еще один способ создания папки с помощью клавиатуры. Для этого, находясь в ПРОВОДНИКЕ зажимаем одновременно клавиши Ctrl + Shift + N
Для закрепления потренируйтесь в создании папок различными способами.
Удаление папок из ПРОВОДНИКА.
В результате тренировок мы создали ненужные папки, которые сейчас удалим. Для этого так же воспользуемся несколькими способами:
- Выделяем ненужную папку щелкнув по ней один раз левой кнопкой мыши.
- На панели инструментов нажимаем красный крестик.
- Выделяем папку которую будем удалять.
- На клавиатуре нажимаем кнопку Delete (иногда пишут Del).
- Нажимаем ПРАВОЙ кнопкой мыши по ненужной папке.
- Выбираем из открывшегося списка пункт меню Удалить.
Таким образом мы очищаем свой компьютер от ненужных файлов и папок.
Копирование папок и файлов в ПРОВОДНИКЕ.
Итак, нужную нам папку мы создали. Далее предстоит скопировать информацию с флэшки в эту папку. И снова разберем несколько способов.
- Подключаем карту памяти (флэшку) к компьютеру если она еще не подключена
- Запускаем ПРОВОДНИК и открываем флэшку.
- ПРАВОЙ кнопкой мыши жмем по папке 1 ЯНВАРЯ (в правой или левой части не имеет значения).
- Из контекстного меню выбираем Копировать.
- Переходим в созданную ранее папку на компьютере. Для этого в левой части ПРОВОДНИКа два раза левой кнопкой мыши открываем Этот компьютер, далее Изображения, далее щелкаем по Новый год 2019
- В правой части опять вызываем контекстное меню щелкнув ПРАВОЙ кнопкой мыши по свободному месту и выбираем Вставить.
Вторую папку скопируем следующим образом:
- В правой части ПРОВОДНИКА остается все по-прежнему (то есть открыта созданная нами папка Новый год 2019, в которой уже лежит скопированная ранее папка 1 января ).
- В левой же части снова раскрываем содержимое флешки путем нажатия стрелочек слева (это важно поскольку данный метод позволяет переходить по папкам в левой части ПРОВОДНИКа не меняя тем самым отображения информации в правой его части).
- Щелкаем левой кнопкой мыши по папке 2 января и не отпуская кнопки перетягиваем папку в правую часть.
- Отпускаем кнопку мыши в свободном месте тем самым скопировав папку.
И еще один способ — с помощью клавиатуры. Для этого:
- На флешке выделяем папку 3 января
- Нажимаем на клавиатуре комбинацию клавиш Ctrl+C тем самым скопировав данную папку
- Переходим в созданную нами папку Новый год 2019
- Нажимаем комбинацию клавиш 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 – единственная вещь, которую можно настроить, поэтому начнем с них:
Добавить закладку на нужную папку или файл можно несколькими способами:
- Перетащить иконку папки (или файла) на панель закладок;
- Выделить папку и нажать комбинацию клавиш «CTRL+D»;
- Вызвать контекстное меню панели закладок и нажать пункт «Добавить страницу».
Кроме того, как и в «хромоподобных» браузерах мы имеем возможность группировать наши закладки по определенным папкам. Вызовите контекстное меню панели закладок и активируйте пункт «Добавить папку»:
В появившемся окошке в поле «Имя» введите нужное название для своей папки и нажмите «Сохранить». Если же требуется создать несколько папок, то это можно сделать, нажимая повторно кнопку «Новая папка». В полученные папки закладки добавляются по тем же принципам, что и на панель закладок.
Используя закладки, Вы сможете получить доступ к любым папкам, файлам и даже программам, получив, таким образом, отличный инструмент для быстрого вызова нужных функций!
Работа с вкладками
Главным же козырем Clover является функция добавления в Проводник вкладок:
Как и в работе с закладками, самым удобным способом открытия нужных папок в новых вкладках является метод перетаскивания их на панель вкладок. При этом курсор будет принимать форму стрелочки, которая указывает, нужно ли вставить новую вкладку после существующей, перед ней или же открыть в текущей вкладке (см. скриншот выше).
Однако на деле возможностей создания вкладки гораздо больше:
- Уже упомянутое перетаскивание (открывает выбранную папку в новой вкладке);
- Нажатие кнопки в виде параллелограмма справа от последней открытой вкладки (открывает новую вкладку «Мой компьютер»);
- Сочетание клавиш «CTRL+T» (открывает новую вкладку «Мой компьютер»);
- Пункт «Новая вкладка» в Настройках и в контекстном меню панели вкладок (открывает новую вкладку «Мой компьютер»).
Касательно последнего пункта хочется поговорить отдельно:
В контекстном меню Вы можете найти еще один довольно удобный способ создания новой вкладки – «Дублировать». Он позволяет быстро создать копию текущей выбранной вкладки.
Кроме того полезными пунктами здесь будут «Открыть закрытую вкладку», который позволяет вернуть недавно просмотренные вкладки, которые Вы закрыли, и «Закрепить вкладку». Последняя функция позволяет нам сохранить нужные открытые вкладки даже после выключения Проводника!
Помимо простого удобства отображения нескольких директорий в одном окне, Вы еще можете и легко перетаскивать файлы и папки между открытыми вкладками, так, что необходимость в многопанельных интерфейсах отпадает сама собой!
На этом, пожалуй, и все :). Настало время подводить итоги.
Достоинства и недостатки программы
Плюсы:
- расширение функционала без изменения внешнего вида Проводника;
- поддержка открытия нескольких папок в разных вкладках одного окна;
- развитая система закладок для быстрого перехода к нужным папкам и файлам;
- удобные функции управления вкладками;
- перемещение файлов и папок между открытыми вкладками.
Минусы:
Выводы
Вывод напрашивается сам собой – если Вы не привыкли в своей работе использовать разнообразные файловые менеджеры, то Clover станет отличным дополнением к Вашему стандартному Проводнику.
С его помощью Вы не только упростите навигацию по файловой системе и копирование данных из одной папки в другую, но и сможете организовать собственную панель быстрого вызова для любых программ или папок! И все это – без существенных изменений в функционале стандартного Проводника!
About
Написать программу «Проводник» • При первом запуске программа отображает список доступных дисков. • Программа должна содержать дерево дисков, строку адреса, меню, панель инструментов и окно для отображения содержимого папки. • Дерево дисков отображает только диски и папки (можно реализовать с • помощью ListBox). • При двойном щелчке по папке — в…
Stars
0
stars
Watchers
1
watching
Forks
0
forks