Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.95
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 316
#1

Обнаружение USB устройств с последующим их безопасным извлечением - C++

22.07.2011, 17:45. Просмотров 4687. Ответов 27
Метки нет (Все метки)

Интересует вопрос об обнаружении съёмных накопителей (usb-flash), с последующим копированием на них и извлечением, прошу в гугл не посылать, т.к. объяснений кода от него не дождёшься, хотелось бы получить внятное разъяснение, помогите кто чем может
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2011, 17:45     Обнаружение USB устройств с последующим их безопасным извлечением
Посмотрите здесь:
C++ Почему программа выдает мусор при сортировке извлечением?
C++ Обнаружение ошибок работы с памятью
C++ Обнаружение повторяющихся цифр в массиве
C++ OpenCV: обнаружение объектов по цвету
Динамическое обнаружение ошибки переполнения буфера C++
Подключении механизма обнаружение утечек памяти C++
C++ Visual Studio 2015 Обнаружение утечек памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 316
25.07.2011, 20:32  [ТС]     Обнаружение USB устройств с последующим их безопасным извлечением #16
спасибо, но я уже переписал приложение на делфях где уйма примеров, просто хотелось на C++.
Но не мучатся же, мне нужно приложение которое будет копировать заданную папку на флэху, а после завершения операции извлекать, вот и всё....
Но я на C++ написание данной программы не заброшу, постараюсь сделать клон и отпишусь сюда с готовым кодом....
-=ЮрА=-
Заблокирован
Автор FAQ
26.07.2011, 11:39     Обнаружение USB устройств с последующим их безопасным извлечением #17
Если нужно что то перенести на флеш то проще всего использовать функцию СopyFile и не мучаться!
C++
1
if(CopyFile(sPath + "\\test.txt",pRmvPath,false))
Я так понял суть программы в том чтобы при обнаружении флеш на неё что то записать с компа?Похожее реализовывал, только как и писал раньше копать лучше в сторону WM_DEVICECHANGE и их отлову, этим можно с флешью работать ещё до того как с ней начнёт работать эксплорер...
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 316
26.07.2011, 16:53  [ТС]     Обнаружение USB устройств с последующим их безопасным извлечением #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если нужно что то перенести на флеш то проще всего использовать функцию СopyFile и не мучаться!
C++
1
if(CopyFile(sPath + "\\test.txt",pRmvPath,false))
Я так понял суть программы в том чтобы при обнаружении флеш на неё что то записать с компа?Похожее реализовывал, только как и писал раньше копать лучше в сторону WM_DEVICECHANGE и их отлову, этим можно с флешью работать ещё до того как с ней начнёт работать эксплорер...
А разве функция CopyFile умеет копировать директории и поддиректории?
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2011, 13:32     Обнаружение USB устройств с последующим их безопасным извлечением #19
Директорию нужно создавать вручную командой mkdir из direct.h - функций по копированию каталогов я не встречал...
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 316
27.07.2011, 17:26  [ТС]     Обнаружение USB устройств с последующим их безопасным извлечением #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Директорию нужно создавать вручную командой mkdir из direct.h - функций по копированию каталогов я не встречал...
Да я думаю выжимки из исходников на шарпе возьму и допишу нормально, хотя у меня прекрасно работает в связке Autoit + C#
AutoIt умеет копировать папки....
Программа готова уже тем более, мониторит подключение дисков и считывает в массив пути, потом скопировав запускает внешний экзешник, ожидает окончания работы программы и выводит информацию о том что можно вынуть флэху....
-=ЮрА=-
Заблокирован
Автор FAQ
28.07.2011, 10:42     Обнаружение USB устройств с последующим их безопасным извлечением #21
>arty<, привожу премер Си проекта основанного на твоей логике обнаружения съёмных носителей.
Для создания каталога на флеш использую системную команду MKDIR. Суть работы программы следующая, при обнаружении съёмного носителя она будет пытаться создавать в его корне папку USB_DETECT в указанную папку будет скопирован файл USB_INFO.txt из каталога sTempPath
C++
1
GetTempPath(MAX_PATH,sTempPath)
/ USB_INFO.txt содержит в себе информацию о съёмном носителе полученную посредством GetVolumeInformation. Тайм-аут вызова
C++
1
GetLogicalDriveStrings(MAX_PATH,sDRIVES)
задаётся в функции
C++
1
Sleep(1000);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <windows.h>
#include <direct.h>
#include <stdio.h>
 
void GetDrives();
void GetDriveInfo(LPCTSTR sInfoPath, LPCTSTR sDRIVE);
bool CreateDir(LPCTSTR sDRIVE, LPCTSTR sDIR, char * szPath);
 
int main()
{
    printf("PROGRAM START\r\n");
    while(true)
    {
        GetDrives();
        Sleep(1000);
    }
    return 0;
}
 
void GetDrives()
{
    char sDRIVES[MAX_PATH];
    char szPath[MAX_PATH];
    DWORD len = GetLogicalDriveStrings(MAX_PATH,sDRIVES);
    for(int i = 0; i < len; i += 4)
    {
        if(!strchr(&sDRIVES[i],'A'))
        if (GetDriveType(&sDRIVES[i]) == DRIVE_REMOVABLE)
        {
            if(CreateDir(&sDRIVES[i],"USB_DETECT",szPath))
                printf("\r\nDIR: %s CREATED\r\n",szPath);
            else
                printf("DIR: %s NOT CREATED\r\n",szPath);
            printf("\tVOLUME INFORMATION\r\n");
            GetDriveInfo(strcat(szPath,"\\USB_INFO.txt"),&sDRIVES[i]);
        }
    }
}
 
void GetDriveInfo(LPCTSTR sInfoPath, LPCTSTR sDRIVE)
{
    FILE * f;
    char sTempPath[MAX_PATH];
    char sVolName[MAX_PATH];
    char sFSysName[MAX_PATH];
    DWORD dwSerial;
    DWORD dwMaxLen;
    DWORD dwSysFlag;
    GetTempPath(MAX_PATH,sTempPath);
    if(!(f = fopen(strcat(sTempPath,"USB_INFO.txt"),"wb+")))
        printf("ERROR ACCESS %s\r\n",sInfoPath);
    else
    {
        if(GetVolumeInformation
            (
                sDRIVE,
                sVolName,
                MAX_PATH,
                &dwSerial,
                &dwMaxLen,
                &dwSysFlag,
                sFSysName,
                MAX_PATH
            )
        )
        fprintf(f,"\t%s\r\n","USB_DETECT InfoFile:");
        fprintf(f,"DRIVE   : %s\r\n",sDRIVE);
        fprintf(f,"VOLNAME : %s\r\n",sVolName);
        fprintf(f,"SERIAL# : 0x%p\r\n",dwSerial);
        fprintf(f,"MAXLEN  : 0x%p\r\n",dwMaxLen);
        fprintf(f,"FSFlag  : 0x%p\r\n",dwSysFlag);
        fprintf(f,"FSystem : %s\r\n",sFSysName);
        fclose(f);
 
        if(CopyFile(sTempPath,sInfoPath,false))
            printf(">INFOFile %s CREATED\r\n",sInfoPath);
        else
            printf(">INFOFile %s NOT CREATED\r\n",sInfoPath);
 
        printf("DRIVE   : %s\r\n",sDRIVE);
        printf("VOLNAME : %s\r\n",sVolName);
        printf("SERIAL# : 0x%p\r\n",dwSerial);
        printf("MAXLEN  : 0x%p\r\n",dwMaxLen);
        printf("FSFlag  : 0x%p\r\n",dwSysFlag);
        printf("FSystem : %s\r\n",sFSysName);
    }
}
 
bool CreateDir(LPCTSTR sDRIVE, LPCTSTR sDIR, char * szPath)
{
    bool bRet = false;
    char sCMD[MAX_PATH];
    if(szPath)
    {
        sprintf(szPath,"%s%s",sDRIVE,sDIR);
        sprintf(sCMD,"MKDIR %s",szPath);
        if(/*mkdir(szPath)*/system(sCMD))
            bRet = true;
    }
    return bRet;
 
}
Миниатюры
Обнаружение USB устройств с последующим их безопасным извлечением  
Вложения
Тип файла: rar USB_DETECT.exe.rar (16.5 Кб, 36 просмотров)
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 316
28.07.2011, 17:04  [ТС]     Обнаружение USB устройств с последующим их безопасным извлечением #22
Спасибо -=ЮрА=-, ксатити я уже на шарпе написал функцию копирования и детектирования, как полностью закончу проект, скину....
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 316
29.07.2011, 19:16  [ТС]     Обнаружение USB устройств с последующим их безопасным извлечением #23
Проект почти закончил, осталось последнее, мне надо сам процесс копирования файлов и бегающий прогрессбар вывести в два отдельных синхронизируемых друг с другом потока, пример кто-нибудь может дать краткий и ясный, я в шарпе новичок, читал на RSDN и MSDN, но нифига не понял...
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 316
29.07.2011, 21:19  [ТС]     Обнаружение USB устройств с последующим их безопасным извлечением #24
Проект готов, за исключением одного: начало копирования определяется нажатием кнопки, остаётся лишь перенести действия из buttonclick в case при обнаружении устройства...

Смотрите и выкладывайте замечания, про то что я вместо invoke отключил вообще проверку на принадлежность потоков, я знаю, может кто поправит меня и сделает нормальный код с делегатами?

DirCopy.zip
TheDarkMax2
15 / 15 / 2
Регистрация: 23.09.2011
Сообщений: 165
23.09.2011, 16:51     Обнаружение USB устройств с последующим их безопасным извлечением #25
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Тебе нужно обработать сообщение DWM_DEVICECHANGE вот те кусок кода и готовый проект
C++
1
2
3
4
5
6
7
8
LRESULT CRmv_guardDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    // TODO: Add your specialized code here and/or call the base class
    switch(message){
    case WM_DEVICECHANGE:
        if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam ) 
            UpdateDevice((PDEV_BROADCAST_HDR)lParam, wParam);
        break;
Я вот мучаюсь, ищу уже хз сколько и всё же никак не могу понять как это делается - обработка сообщений. Можете объяснить? Просто скопировать этот текст - не работает.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.09.2011, 16:54     Обнаружение USB устройств с последующим их безопасным извлечением #26
Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
ищу уже хз сколько
непонятно что вы ищите и зачем
курить литературу по ВинАпи надо
-=ЮрА=-
Заблокирован
Автор FAQ
23.09.2011, 16:55     Обнаружение USB устройств с последующим их безопасным извлечением #27
Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
Я вот мучаюсь, ищу уже хз сколько и всё же никак не могу понять как это делается - обработка сообщений. Можете объяснить? Просто скопировать этот текст - не работает.
- что именно хочешь узнать?Текст программы я выкладывать не буду, а вот дельным советом подскажуПонятное дело что это

Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
LRESULT CRmv_guardDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
* * * * // TODO: Add your specialized code here and/or call the base class
* * * * switch(message){
* * * * case WM_DEVICECHANGE:
* * * * * * * * if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam )
* * * * * * * * * * * * UpdateDevice((PDEV_BROADCAST_HDR)lParam, wParam);
* * * * * * * * break;
- лишь часть кода, но по моему и так всё ясно что и к чему, чё не понятно то???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2011, 17:04     Обнаружение USB устройств с последующим их безопасным извлечением
Еще ссылки по теме:
Обнаружение столкновения Sprite и отдельного Tile карты C++
C++ Обнаружение всех объектов класса, удовлетворяющих условию
Fatal error C1004: непредвиденное обнаружение конца файла C++
Fatal error C1004: непредвиденное обнаружение конца файла C++
C++ Fatal error C1004: непредвиденное обнаружение конца файла

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
TheDarkMax2
15 / 15 / 2
Регистрация: 23.09.2011
Сообщений: 165
23.09.2011, 17:04     Обнаружение USB устройств с последующим их безопасным извлечением #28
Работаю в Билдере.
Не понятно как сделать, чтобы это исполнялось. Там к каждому стандартному событию привязана функция: нажал кнопку - запустил что-то. Не понятно куда писать свой код обработки сообщения. Пытался просто добавить в класс окна еще одну функцию (в .h объявляю, в .cpp сама функция), но не исполняется. Программа работает как будто её нет.

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
непонятно что вы ищите и зачем
курить литературу по ВинАпи надо
до Апи дело не доходит
Хотя... работать с устройством я могу, но Plag'n'Play не выходит. Проблема ж не в том, чтобы связаться с устройством (это я могу), а в том, чтобы делать это не в ручную нажатием кнопки, а по-человечески.
Yandex
Объявления
23.09.2011, 17:04     Обнаружение USB устройств с последующим их безопасным извлечением
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru