Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Периферійні пристрої
Звітдо комплексу лабораторних робіт 5-8
Мета: ознайомитися з процесом передачі даних через послідовний інтерфейс USB.
ТЕОРЕТИЧНІ ВІДОМОСТІ
USB (англ. Universal Serial Bus, абревіатура читається ю-ес-бі) — укр. універсальна послідовна шина, призначена для з'єднання периферійних пристроїв. Шина USB представляє собою послідовний інтерфейс передачі даних для середньошвидкісних та низькошвидкісних периферійних пристроїв. Для високошвидкісних пристроїв на сьогодні кращим вважається FireWire. USB-кабель представляє собою дві виті пари: по одній парі відбувається передача даних в кожному напрямку (диференціальне включення), а інша пара використовується для живлення периферійного пристрою (+5 В). Завдяки вбудованим лініям живлення, що запезпечують струм до 500 мА, USB часто дозволяє використовувати пристрої без власного блоку живлення (якщо ці пристрої споживають струм потужністю не більше 500 мА). До одного контролера шини USB можно під'єднати до 127 пристроїв через ланцюжок концентраторів (вони використовують топологію «зірка»). На відміну від багатьох інших стандартних роз’ємів, для USB характерні довговічність та механічна міцність. Інтерфейс USB є послідовною, напівдуплексною, двонаправленою шиною.| Шина дозволяє підключити до ПК до 127 фізичних пристроїв. Кожен фізичний пристрій може, у свою чергу, складатися з декількох логічних (наприклад, клавіатура з вбудованим манипулятором-трекболом).|устроїв||устрій||своєю чергою||із|| Кабельна розводка USB починається з вузла (host). Хост володіє інтегрованим кореневим концентратором (root hub), який надає декілька роз'ємів USB для підключення зовнішніх пристроїв. Потім кабелі йдуть до інших пристроїв USB, які також можуть бути концентраторами, і функціональних компонентів (наприклад, модем або акустична система). Концентратори часто вбудовуються в монітори і клавіатури (які є типовими складеними пристроями). Концентратори можуть містити до семи "витікаючих" портів. Для передачі сигналів шина USB використовує чотирипровідною інтерфейс. Одна пара провідників ("+5В" і "загальний") призначена для живлення периферійних пристроїв з навантаженням до 500 мА. Дані передаються по іншій парі ("D+" "D-"). Для передачі даних використовується диференціальна напруга до 3 В (з метою зниження впливу шуму) і схема кодування NRZI (що позбавляє від необхідності виділяти додаткову пару провідників під тактовий сигнал). Всі концентратори повинні підтримувати на своїх витікаючих портах пристрої обох типів, не дозволяючи високошвидкісному трафіку досягати низькошвидкісних пристроїв. Високопродуктивні пристрої підключаються за допомогою екранованого кабелю, довжина якого не повинна перевищувати 3 м. Якщо ж пристрій не формулює особливих вимог до смуги пропускання, його можна підключити і неекранованим кабелем (який може бути тоншим і гнучкішим). Максимальна довжина кабелю для низькошвидкісних пристроїв - 5 м. Вимоги пристрою до живлення (діаметр провідників, споживана потужність) можуть зумовити необхідність використання кабелю меншої довжини. Із-за особливостей розповсюдження сигналу по кабелю число послідовно сполучених концентраторів обмежене шістьма (і сім'ю п'ятиметровими відрізками кабелюХост дізнається про підключення або відключення пристрою з повідомлення від концентратора (ця процедура називається опитом шини - bus enumeration). Потім хост привласнює пристрою унікальну адресу USB (1:127). Після відключення пристрою від шини USB його адреса стає доступною для інших пристроїв. Для індивідуального звернення до конкретних функціональних можливостей складеного пристрою застосовується 4-бітове поле кінцевої крапки. У низькошвидкісних пристроях за кожною функцією закріплюється не більше двох адрес кінцевих крапок: нульова кінцева крапка використовується для конфігурації і визначення стану USB, а також управління функціональним компонентом; а інша крапка - відповідно до функціональних можливостей компоненту. Пристрої з максимальною продуктивністю можуть підтримувати до 16 кінцевих крапок, резервуючи нульову крапку для завдань конфігурації і управління USBХост опитує всі пристрої і видає їм дозволу на передачу даних (розсилаючи для цього пакет-маркер - Token Packet). Таким чином, пристрої позбавлені можливості безпосереднього обміну даними - всі дані проходять через хост. Ця умова сильно заважала впровадженню інтерфейсу USB на ринок портативних пристроїв. В результаті в кінці 2001 року було прийнято доповнення до стандарту USB 2.0 - специфікація USB OTG (On-The-Go), призначена для з'єднання периферійних USB-устройств один з одним без необхідності підключення до хосту (наприклад, цифрова камера і фотопринтер). Пристрій, підтримуюче USB OTG, здатний частково виконувати функції хоста і розпізнавати, коли воно підключене до повноцінного хосту (на основі ПК), а коли - до іншого периферійного пристрою. Специфікація описує також протокол узгодження вибору ролі хоста при з'єднанні два USB OTG-пристроїв. Дані на шині передаються транзакціями, інтервал між якими складає 1 мс. Передбачено чотири типи транзакцій.|типів| Передачі, що управляють, використовуються для конфігурації знов підключених пристроїв (наприклад, привласнення ним адреси USB) і їх компонентів. Пристрої з максимальною продуктивністю можуть бути налаштовані на роботу з конфігураційними повідомленнями завдовжки 8, 16, 32 або 64 байти (за умовчанням - 8 байт). Пристрої з низькою продуктивністю в змозі розпізнавати повідомлення, що управляють, завдовжки не більше 8 байт| Групова передача (bulk) використовується для адресної пересилки даних великого об'єму (до 1023 байт). Як приклад можна привести передачу даних на принтер або від сканера. Пристрої з низькою продуктивністю не підтримують цей режим Передача даних переривання, наприклад, введених з клавіатури даних або відомостей про переміщення миші. Ці дані мають бути передані достатньо швидко для того, щоб користувач не відмітив ніякої затримки. Відповідно до специфікацій час затримки USB складає декілька мілісекунд. Ізохронні передачі (передачі в реальному масштабі часу). Пропускна спроможність і затримка доставки обмовляються до початку передачі даних. До ізохронних даних алгоритми корекції помилок непридатні (оскільки час на повторну їх ретрансляцію перевищує допустимий інтервал затримки). За один сеанс в такому режимі може бути передано до 1023 байт. Пристрої з низькою продуктивністю не підтримують цей режим.|передавати||устрої||із| Слід також відзначити, що різними виробниками пропонувалися специфікації, що описують інтерфейс різних апаратних реалізацій контроллера USB. Фірмою Intel була запропонована специфікація UHCI (Universal Host Controller Interface), яка передбачає надзвичайно просту апаратну реалізацію контроллера USB. В рамках даної специфікації основні функції контролю і арбітражу шини покладаються на програмний драйвер. Альтернативна специфікація була запропонована компаніями Compaq, Microsoft і National Semiconductor - OHCI (Open Host Interface). Контроллери по специфікації OHCI володіють уніфікованим абстрактним інтерфейсом, що передбачає апаратну реалізацію більшості функцій, що управляють, що полегшує їх програмування.
USB 1.0
Версія представлена в січні 1995 року.
Технічні характеристики:
високошвидкісне з'єднання — 12 Мбіт/с
максимальна довжина кабеля для високошвидкісного з'єднання — 3 м
низькошвидкісне з'єднання — 1,5 Мбіт/с
максимальна довжина кабеля для низькошвидкісного з'єднання — 5 м
максимальна кількість пристроїв підімкнення (враховуючи )концентратори — 127
можливість підключення пристроїв з різними швидкостями обміну інформацією
напруга живлення для переферійних пристроїв — 5 В
максимальний струм споживання на один пристрій — 500 мA
USB 1.1
Випущено в вересні 1998. Виправлені проблеми виявлені у версії 1.0, в основному пов'язані з концентраторами. Інтерфейс USB 1.1 декларує два режими:|
1)низькошвидкісний підканал (пропускна спроможність - 1,5 Мбіт/с), призначений для таких пристроїв, як миші і клавіатури;|устроїв|
2)високопродуктивний канал, що забезпечує максимальну пропускну спроможність 12 Мбіт/с, що може використовуватися для підключення зовнішніх накопичувачів або пристроїв обробки і передачі аудио- і відеоінформації.|устроїв||
USB 2.0
Версія випущена в квітні 2000 року. USB 2.0 відрізняється від USB 1.1 лише швидкістю передачі, яка зросла та незначними змінами в протоколі передачі даних для режиму Hi-speed (480 Мбіт/сек). Існує три швидкості роботи пристроїв USB 2.0:
Low-speed 10—1500 Кбіт/c (використовується для інтерактивних пристроїв: клавіатури, мишки, джойстики)
Full-speed 0,5—12 Мбіт/с (аудіо/відео пристрої)
Hi-speed 25—480 Мбіт/с (відео пристрої, пристрої зберігання інформації)
В дійсності ж хоча швидкість USB 2.0 і може досягати 480Мбит/с, пристрої типу жорстких дисків чи взагалі будь-які інші носії інформації ніколи не досягають її по шині USB, хоча і могли б. Це можна пояснити доволі просто, шина USB має доволі велику затримку між запитом на передачу інформацію і саме самою передачею даних («довгий ping»). Наприклад шина FireWire забезпечує максимальну швидкість у 400 Мбіт/с, тобто на 80Мбіт/с меньше чим у USB, дозволяє досягнути більшої швидкості обміну даними з носіями інформації.
USB OTG
Технологія USB On-The-Go розширює специфікації USB 2.0 для легкого з'єднання між собою переферійних USB-пристроїв безпосередньо між собою без задіяння комп'ютера. Прикладом застосування цієї технології є можливість підключення фотоапарату напряму до друкарки. Цей стандарт виник через об'єктивну потребу надійного з'єднання особливо поширених USB-пристроїв без застосування комп'ютера, який в потрібний момент може і не виявитися під руками.
Бездротовий USB
Офіційна специфікація протоколу була анонсована в травні 2005 року. Дозволяє організовувати бездротовий зв'язок з високою швидкістю передачі даних до 480 Мбіт/с на відстані 3 метрів та до 110 Мбіт/с на відстані 10 метрів. Для безпровідного USB часом використовують абревіатуру WUSB. Розробник протоколу USB-IF віддає перевагу практиці іменування протокол офіційно Certified Wireless USB.
USB 3.0
Протокол USB 3.0 знаходиться на стадії розробки і буде передавати сигнал за допомогою оптоволоконного кабелю USB 3.0 планується створити зворотно сумісним з USB 2.0 та USB 1.1
Створенням USB 3.0 займаються компанії: Intel, Microsoft, Hewlett-Packard, Texas Instruments, NEC и NXP Semiconductors.
Теоретична пікова пропускна здатність складає 4,8 Гбіт/с. Специфікація периферійної шини USB була розроблена лідерами комп'ютерної і телекомунікаційної промисловості (Compaq, DEC, IBM, Intel, Microsoft, NEC і Northern Telecom) для підключення комп'ютерної периферії поза корпусом ПК з автоматичною автоконфігурацією (Plug&Play). Перша версія стандарту з'явилася в 1996 р. Агресивна політика Intel по впровадженню цього інтерфейсу стимулює поступове зникнення таких низькошвидкісних інтерфейсів, як RS 232C, Access.bus і тому подібне Проте для високошвидкісних пристроїв строгішими вимогами до продуктивності (наприклад, доступ до видаленого накопичувача або передача оцифрованого відео) конкурентом USB є інтерфейс IEEE 1394
Види роз'ємів USB
Розміщення провідників в USB
Номер контакту
Позначення
Колір провідника
1
V BUS
червоний
2
D-
білий
3
D+
зелений
4
GND
чорний
GND — ланцюг «корпусу» для живлення периферійних пристроїв, VBus — +5 В, також для ланцюгів живлення. Дані передаються по провідникам D+ і D− диференційно (стан 0 и 1 (в термінології офіційної документації diff0 и diff1 відповідно) визначаються по різниці потенціалів між лініями більше 0,2 В і при умові, що на одній із ліній (D− у випадку diff0 и D+ при diff1) потенціал відносно GND вище 2,8 В. Диференційний спосіб передачі є основним, проте не єдиним (наприклад, при иніціалізації пристрій повідомляє хосту про режим, що підтримується пристроєм (Full-Speed або Low-Speed), підтягуванням однієї із ліній данних до V_BUS через резистор 1.5 кОм (D− для режима Low-Speed і D+ для режима Full-Speed, пристрої, що працюють в режимі Hi-Speed, ведуть себе на цій стадії як пристрої в режимі Full-Speed). Також інколи навколо проводу присутня волокниста обмотка для захисту від фізичних пошкоджень.
Схема USB:
Передача даних
Інтерфейс USB надає розробникові безліч можливостей, позбавляючи його від самостійної реалізації байтових протоколів обміну, підрахунку контрольних сум і інших турбот, необхідних для надійного зв'язку з пристроями.
Механізм передачі даних є асинхронним і блоковим. Блок переданих даних називається USB-фреймом або USB-кадром і передається за фіксований часовий інтервал. Оперування командами і блоками даних реалізується за допомогою логічної абстракції, званої каналом. Зовнішній пристрій також ділиться на логічні абстракції, звані кінцевими точками. Таким чином, канал є логічною зв'язкою між хост-контроллером і кінцевою точкою зовнішнього пристрою. Канал можна порівняти з відкритим файлом.
Для передачі команд (і даних, що входять до складу команд) використовується канал за замовчуванням, а для передачі даних відкриваються або потокові канали, або канали повідомлень.
Інформація по каналу передається у вигляді пакетів (Packet). Кожен пакет починається з поля синхронізації SYNC (SYNChronization), за яким слідує ідентифікатор пакету PID (Packet IDentifier). Поле
Check являє собою побітову інверсію PID.
Систему USB слід розділити на три логічних рівня з певними правилами взаємодії. Пристрій USB містить інтерфейсну, логічну і функціональну частини. Хост теж ділиться на три частини - інтерфейсну, системну та програмне забезпечення. Кожна частина відповідає тільки за певне коло завдань. Логічне і реальна взаємодія між ними показано на малюнку.
Таким чином, операція обміну даними між прикладною програмою і шиною USВ виконується шляхом передачі буферів пам'яті через такі рівні.
Рівень клієнтського ПЗ в хості:
зазвичай представляється драйвером пристрою USB;
забезпечує взаємодію користувача з операційною системою з одного боку і системним драйвером з іншого.
Рівень системного забезпечення USB в хості (USBD, Universal Serial Bus Driver):
управляє нумерацією пристроїв на шині;
управляє розподілом пропускної спроможності шини і потужності харчування;
обробляє запити користувальницьких драйверів.
Хост-контролер інтерфейсу шини USB (HCD, Host Controller Driver):
перетворює запити вводу / виводу в структури даних, за якими хост-контролер виконує фізичні транзакції;
працює з регістрами хост-контроллера.
Рівень клієнтського програмного забезпечення визначає тип передачі даних, необхідний для виконання затребуваної прикладною програмою операції. Після визначення типу передачі даних цей рівень передає системному рівню наступне:
буфер пам'яті, званий клієнтським буфером;
пакет запиту на в / в (IRP, Input / output Request Packet), що вказує тип необхідної операції.
IRP містить тільки відомості про запит (адреса і довжина буфера в оперативній пам'яті). Безпосередньо обробкою запиту займається системний драйвер USB.
Рівень системного драйвера USB необхідний для управління ресурсами USB. Він відповідає за виконання таких дій:
розподіл смуги пропускання шини USB;
призначення логічних адрес пристроїв кожній фізичній USB-пристрою;
планування транзакцій.
Логічно передача даних між кінцевою точкою і ПО проводиться за допомогою виділення каналу і обміну даними по цьому каналу, а з точки зору представлених рівнів, передача даних виглядає наступним чином.
Драйвер USBD розбиває запити на транзакції за наступними правилами:
виконання запиту вважається закінченим, коли успішно завершені всі транзакції, його складові;
всі подробиці відпрацювання транзакцій (такі як очікування готовності, повтор транзакції при помилці, неготовність приймача і т. д.) до клієнтського ПЗ не доводяться;
ПЗ може тільки запустити запит і чекати або виконання запиту або виходу з тайм-ауту; пристрій може сигналізувати про серйозні помилки, що призводить до аварійного завершення запиту, про що повідомляється джерело запиту.
Драйвер контролера хоста приймає від системного драйвера шини перелік транзакцій і виконує наступні дії:
планує виконання отриманих транзакцій, додаючи їх до списку транзакцій;
витягує зі списку чергову транзакцію і передає її рівню хост-контролера інтерфейсу шини USB;
відстежує стан кожної транзакції аж до її завершення.
Хост-контролер інтерфейсу шини USB формує кадри.
Кадри передаються послідовною передачею біт за методом NRZI.
Таким чином, можна сформувати наступну спрощену схему:
кожен кадр складається з найбільш пріоритетних посилок, склад яких формує драйвер хоста;
кожна передача складається з однієї або декількох транзакцій;
кожна транзакція складається з пакетів;
кожен пакет складається з ідентифікатора пакету, даних (якщо вони є) і контрольної суми.
Рисунок 1
Запустивши проект інатиснувши на кнопку редактора, створюю папку і документ з своїм прізвищем та зберігаю на за адресою D:\Хомік_В.А\Хомік.txt (рисунок 1)
Рисунок 2
Створивши папку і документ зі своїм прізвищем «Хомік» вікно буде мати вигляд як на рисунку 2.
Щоб скопіювати файл на флеш-носій інформації через USB інтерфейс потрібно вибрати з списку накопичувачів потрібний нам флеш – носій,виділити документ та натиснути на кнопку копіювати.
Після копіювання файлу на флеш-носій зберігаєть папка «Хомік В.А» з вмістими текстовим документом «Хомік.txt».(Виконання зображено на рисунку 3)
Висновок: я ознайомився з процесом передачі даних через послідовний інтерфейс USB.Створивши програму для прикладу скопіювала текстовий документ зі своїм прізвищем.
ДОДАТОК А
Текст програми:
CopyForm.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace USB
{
public partial class CopyForm : Form
{
public CopyForm()
{
InitializeComponent();
this.Show();
}
public void Copy(string Click_File, string Rez)
{
label1.Text += Click_File;
label2.Text += Rez;
FileInfo FF = new FileInfo(Click_File);
FileStream File1 = new FileStream(Click_File, FileMode.Open);
FileStream File2 = new FileStream(Rez, FileMode.OpenOrCreate);
progressBar1.Maximum = (int)(FF.Length/100000);
for (int i = 0; i < FF.Length; i++)
{
File2.WriteByte(Convert.ToByte(File1.ReadByte()));
if (i % 100000 == 0 && i != 0)
{
progressBar1.Increment(1);
this.Refresh();
}
}
File1.Close();
File2.Close();
this.Close();
}
}
}
CopyFormFolder.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace USB
{
public partial class CopyFormFolder : Form
{
public CopyFormFolder()
{
InitializeComponent();
this.Show();
}
public void CopyFolder(string Click_List, string Click_File, string TextButton1, string TextButton2, int j2)
{
progressBar1.Maximum = (int)(j2 / 100000);
int j3 = 0;
int j1;
int n = 0;
int[] Mas = new int[100];
int IndexMas;
int[] NumMas = new int[100];
string[,] str1;
str1 = new string[10000, 10000];
string Click_File2;
string NameFolder;
string NameFolderRez;
if (Click_List == "1")
{
label1.Text += Click_File;
label2.Text += TextButton2;
IndexMas = 0;
Mas[IndexMas] = NumMas[IndexMas] = 1;
NameFolder = TextButton2/*.Text*/;
n = Click_File.LastIndexOf("\\");
if (TextButton2/*.Text*/.Length > 3)
{
NameFolder = String.Concat(NameFolder, "\\");
}
n++;
while (n < Click_File.Length)
{
NameFolder = String.Concat(NameFolder, Click_File[n]);
n++;
}
Directory.CreateDirectory(NameFolder);
IndexMas++;
while (IndexMas != 0)
{
NameFolderRez = NameFolder;
j1 = 0;
Click_File2 = Click_File;
foreach (string str in Directory.GetDirectories(Click_File))
{
Click_File = str;
str1[IndexMas, j1] = str;
j1++;
n = Click_File.LastIndexOf("\\");
NameFolderRez = String.Concat(NameFolderRez, "\\");
n++;
while (n < Click_File.Length)
{
NameFolderRez = String.Concat(NameFolderRez, Click_File[n]);
n++;
}
Directory.CreateDirectory(NameFolderRez);
NameFolderRez = NameFolder;
}
Mas[IndexMas] = j1;
NumMas[IndexMas] = 0;
Click_File = Click_File2;
foreach (string str in Directory.GetFiles(Click_File))
{
Click_File = str;
n = Click_File.LastIndexOf("\\");
NameFolderRez = String.Concat(NameFolderRez, "\\");
n++;
while (n < Click_File.Length)
{
NameFolderRez = String.Concat(NameFolderRez, Click_File[n]);
n++;
}
label5.Text = Click_File;
label6.Text = NameFolderRez;
FileInfo FFFolder = new FileInfo(Click_File);
FileStream File1 = new FileStream(Click_File, FileMode.Open);
FileStream File2 = new FileStream(NameFolderRez, FileMode.OpenOrCreate);
progressBar2.Maximum = (int)(FFFolder.Length / 100000);
for(int ii1 = 0; ii1<FFFolder.Length; ii1++)
{
j3++;
File2.WriteByte(Convert.ToByte(File1.ReadByte()));
if(ii1%100000 == 0 && ii1 != 0)
{
progressBar2.Increment(1);
this.Refresh();
}
if (j3 % 100000 == 0 && j3 != 0)
{
progressBar1.Increment(1);
this.Refresh();
}
}
File1.Close();
File2.Close();
NameFolderRez = NameFolder;
}
if (Mas[IndexMas] != 0 && Mas[IndexMas] >= NumMas[IndexMas])
{
Click_File = str1[IndexMas, NumMas[IndexMas]];
NumMas[IndexMas]++;
IndexMas++;
NameFolder = TextButton2/*.Text*/;
n = TextButton1/*.Text*/.Length;
while (n < Click_File.Length)
{
NameFolder = String.Concat(NameFolder, Click_File[n]);
n++;
}
}
else
{
while ((Mas[IndexMas] == 0 || Mas[IndexMas] <= NumMas[IndexMas]) && IndexMas != 0)
{
IndexMas--;
}
if (IndexMas != 0)
{
Click_File = str1[IndexMas, NumMas[IndexMas]];
NumMas[IndexMas]++;
IndexMas++;
NameFolder = TextButton2/*.Text*/;
n = TextButton1/*.Text*/.Length;
while (n < Click_File.Length)
{
NameFolder = String.Concat(NameFolder, Click_File[n]);
n++;
}
}
}
}
}
else
{
label1.Text += Click_File;
label2.Text += TextButton1;
IndexMas = 0;
Mas[IndexMas] = NumMas[IndexMas] = 1;
NameFolder = TextButton1/*.Text*/;
n = Click_File.LastIndexOf("\\");
if (TextButton1/*.Text*/.Length > 3)
{
NameFolder = String.Concat(NameFolder, "\\");
}
n++;
while (n < Click_File.Length)
{
NameFolder = String.Concat(NameFolder, Click_File[n]);
n++;
}
Directory.CreateDirectory(NameFolder);
IndexMas++;
while (IndexMas != 0)
{
NameFolderRez = NameFolder;
j1 = 0;
Click_File2 = Click_File;
foreach (string str in Directory.GetDirectories(Click_File))
{
Click_File = str;
str1[IndexMas, j1] = str;
j1++;
n = Click_File.LastIndexOf("\\");
NameFolderRez = String.Concat(NameFolderRez, "\\");
n++;
while (n < Click_File.Length)
{
NameFolderRez = String.Concat(NameFolderRez, Click_File[n]);
n++;
}
Directory.CreateDirectory(NameFolderRez);
NameFolderRez = NameFolder;
}
Mas[IndexMas] = j1;
NumMas[IndexMas] = 0;
Click_File = Click_File2;
foreach (string str in Directory.GetFiles(Click_File))
{
Click_File = str;
n = Click_File.LastIndexOf("\\");
NameFolderRez = String.Concat(NameFolderRez, "\\");
n++;
while (n < Click_File.Length)
{
NameFolderRez = String.Concat(NameFolderRez, Click_File[n]);
n++;
}
label5.Text = Click_File;
label6.Text = NameFolderRez;
FileInfo FFFolder = new FileInfo(Click_File);
FileStream File1 = new FileStream(Click_File, FileMode.Open);
FileStream File2 = new FileStream(NameFolderRez, FileMode.OpenOrCreate);
progressBar2.Maximum = (int)(FFFolder.Length / 100000);
for (int ii1 = 0; ii1 < FFFolder.Length; ii1++)
{
j3++;
File2.WriteByte(Convert.ToByte(File1.ReadByte()));
if (ii1 % 100000 == 0 && ii1 != 0)
{
progressBar2.Increment(1);
this.Refresh();
}
if (j3 % 100000 == 0 && j3 != 0)
{
progressBar1.Increment(1);
this.Refresh();
}
}
File1.Close();
File2.Close();
// File.Copy(Click_File, NameFolderRez);
NameFolderRez = NameFolder;
}
if (Mas[IndexMas] != 0 && Mas[IndexMas] >= NumMas[IndexMas])
{
Click_File = str1[IndexMas, NumMas[IndexMas]];
NumMas[IndexMas]++;
IndexMas++;
NameFolder = TextButton1/*.Text*/;
n = TextButton2/*.Text*/.Length;
while (n < Click_File.Length)
{
NameFolder = String.Concat(NameFolder, Click_File[n]);
n++;
}
}
else
{
while ((Mas[IndexMas] == 0 || Mas[IndexMas] <= NumMas[IndexMas]) && IndexMas != 0)
{
IndexMas--;
}
if (IndexMas != 0)
{
Click_File = str1[IndexMas, NumMas[IndexMas]];
NumMas[IndexMas]++;
IndexMas++;
NameFolder = TextButton1/*.Text*/;
n = TextButton2/*.Text*/.Length;
while (n < Click_File.Length)
{
NameFolder = String.Concat(NameFolder, Click_File[n]);
n++;
}
}
}
}
}
this.Close();
}
}
}
Editor.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace USB
{
public partial class Editor : Form
{
public Editor()
{
InitializeComponent();
}
private void Open_Strip_Click(object sender, EventArgs e)
{
OpenFileDialog dial = new OpenFileDialog();
dial.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
DialogResult dres = dial.ShowDialog();
string file = dial.FileName;
try
{
richTextBox1.Text = File.ReadAllText(file);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private void SaveToStrip_Click(object sender, EventArgs e)
{
SaveFileDialog dial = new SaveFileDialog();
dial.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
DialogResult dres = dial.ShowDialog();
string file = dial.FileName;
try
{
File.WriteAllText(file, richTextBox1.Text);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private void CopyStrip_Click(object sender, EventArgs e)
{
try
{
Clipboard.SetText(richTextBox1.SelectedText);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private void PasteStrip_Click(object sender, EventArgs e)
{
try
{
richTextBox1.SelectedText = Clipboard.GetText();
}
catch(Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private void ExitStrip_Click(object sender, EventArgs e)
{
this.Close();
}
public void File_Start(string File_Name)
{
this.Show();
richTextBox1.Text = File.ReadAllText(File_Name);
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace USB
{
public partial class Form1 : Form
{
string Click_File;
string Click_List;
public Form1()
{
InitializeComponent();
this.KeyUp += new KeyEventHandler(this.Hotkeys);
listView1.MouseDoubleClick += new MouseEventHandler(Double_Click);
listView2.MouseDoubleClick += new MouseEventHandler(Double_Click);
listView1.MouseClick += new MouseEventHandler(One_Click);
listView2.MouseClick += new MouseEventHandler(One_Click);
listView1.MouseCaptureChanged += new EventHandler(No_Click);
listView2.MouseCaptureChanged += new EventHandler(No_Click);
listView1.Columns.Add("Назва");
listView1.Columns.Add("Дата створення");
listView1.Columns.Add("Розмір");
listView1.Columns.Add("Тип");
listView2.Columns.Add("Назва");
listView2.Columns.Add("Дата створення");
listView2.Columns.Add("Розмір");
listView2.Columns.Add("Тип");
foreach (ColumnHeader ch in listView1.Columns)
{
ch.Width = 150;
}
foreach (ColumnHeader ch in listView2.Columns)
{
ch.Width = 150;
}
string DiscType;
foreach (DriveInfo str in DriveInfo.GetDrives())
{
if (str.IsReady)
{
comboBox1.Items.Add(str);
comboBox2.Items.Add(str);
}
}
listView1.View = View.Details;
listView2.View = View.Details;
comboBox1.TextChanged += new EventHandler(this.RefresTreeList);
comboBox2.TextChanged += new EventHandler(this.RefresTreeList);
comboBox1.Text = "C:\\";
comboBox2.Text = "D:\\";
listView1.Focus();
listView1.Select();
listView1.Items[0].Focused = true;
listView1.Items[0].Selected = true;
this.KeyPreview = true;
}
void Hotkeys(object sender, KeyEventArgs e)
{
switch (e.KeyData)
{
case Keys.F5:
CopyButton.PerformClick();
break;
case Keys.F6:
DeleteButton.PerformClick();
break;
case Keys.F7:
NevFolderButtton.PerformClick();
break;
}
}
public void RefresTreeList(object sender, EventArgs e)
{
ComboBox Vybir = (ComboBox)sender;
if (Vybir.Name == comboBox1.Name)
{
listView1.Items.Clear();
foreach (string str in Directory.GetDirectories(comboBox1.Text))
{
int i = listView1.Items.Add(str).Index;
listView1.Items[i].SubItems.Add(Directory.GetCreationTime(str).ToString());
}
foreach (string str in Directory.GetFiles(comboBox1.Text))
{
int i = listView1.Items.Add(str).Index;
listView1.Items[i].SubItems.Add(Directory.GetCreationTime(str).ToString());
FileInfo FI = new FileInfo(str);
listView1.Items[i].SubItems.Add(FI.Length.ToString());
listView1.Items[i].SubItems.Add(FI.Extension.ToString());
}
TextButton1.Text = comboBox1.Text;
}
else
{
listView2.Items.Clear();
foreach (string str in Directory.GetDirectories(comboBox2.Text))
{
int i = listView2.Items.Add(str).Index;
listView2.Items[i].SubItems.Add(Directory.GetCreationTime(str).ToString());
}
foreach (string str in Directory.GetFiles(comboBox2.Text))
{
int i = listView2.Items.Add(str).Index;
listView2.Items[i].SubItems.Add(Directory.GetCreationTime(str).ToString());
FileInfo FI = new FileInfo(str);
listView2.Items[i].SubItems.Add(FI.Length.ToString());
listView2.Items[i].SubItems.Add(FI.Extension.ToString());
}
TextButton2.Text = comboBox2.Text;
}
}
public void One_Click(object sender, EventArgs e)
{
ListView Vybir_List = (ListView)sender;
Click_File = Vybir_List.FocusedItem.Text;
if (listView1.Name == Vybir_List.Name)
{
Click_List = "listView1";
}
else
{
Click_List = "listView2";
}
}
public void No_Click(object sender, EventArgs e)
{
Click_File = null;
}
public void Double_Click(object sender, EventArgs e)
{
ListView Vybir1 = (ListView)sender;
string Vyb = "";
if (Vybir1.FocusedItem.Text == "...")
{
if (Vybir1.Name == listView1.Name)
{
TextButton1.Text = Directory.GetParent(TextButton1.Text).ToString();
Vyb = TextButton1.Text;
}
else
{
TextButton2.Text = Directory.GetParent(TextButton2.Text).ToString();
Vyb = TextButton2.Text;
}
Vybir1.Items.Clear();
int j;
j = Vyb.Length;
if (j > 3