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

FindFirstFileW. Как подставить значение переменной типа string в функцию? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
12.02.2014, 21:40     FindFirstFileW. Как подставить значение переменной типа string в функцию? #1
Здравствуйте, форумчане! Будьте добры и помогите понять один нюанс.
Например есть у меня такие строки:
C++
1
2
3
4
5
6
7
8
//*******************************************
string folderpath;
cin >> folderpath;
 
WIN32_FIND_DATAW wfd;
 
HANDLE const hFind = FindFirstFileW(L"C:\\*", &wfd);
//*******************************************
Как мне вместо "C:\\*" подставить значение folderpath? Просто хочется путь к папке вводить вручную, а не каждый раз перед компиляцией.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.02.2014, 22:02     FindFirstFileW. Как подставить значение переменной типа string в функцию? #2
вам нужно либо вводить std::wstring через std::wcin, либо вызывать FindFirstFileA.
и для ваших нужд у строки есть спец метод: c_str
C++
1
2
3
4
5
6
//*******************************************
wstring folderpath;
wcin >> folderpath;
WIN32_FIND_DATAW wfd;
HANDLE const hFind = FindFirstFileW(folderpath.c_str(), &wfd);
//*******************************************
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
12.02.2014, 22:42  [ТС]     FindFirstFileW. Как подставить значение переменной типа string в функцию? #3
Пути файлов с пробелами не принимает (((
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
setlocale(LC_ALL, "Russian");
 
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
    wstring folderpath;
    wcin >> folderpath;
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW(folderpath.c_str(), &wfd);
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            wcout << &wfd.cFileName[0] << endl;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.02.2014, 22:59     FindFirstFileW. Как подставить значение переменной типа string в функцию? #4
попробуйте обернуть путь в кавычки. одинарные или двойные.
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
12.02.2014, 23:11  [ТС]     FindFirstFileW. Как подставить значение переменной типа string в функцию? #5
DU, пробовал в кавычках, не принимает все равно. (((
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.02.2014, 23:23     FindFirstFileW. Как подставить значение переменной типа string в функцию? #6
msdn пишет, что в начало пути надо засунуть "\\?\".
т.е. в коде:
C++
1
  wstring folderpath = L"\\\\?\\d:\\tmp\\folder with space";
вроде прокатило.
я так понял это будет работать только с FindFirstFileW
вот тут всякие премудрости этого дела:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
13.02.2014, 11:33  [ТС]     FindFirstFileW. Как подставить значение переменной типа string в функцию? #7
Допустим вот код:
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
#include <iostream>
#include <stdio.h> 
#include <conio.h>
#include <math.h>
#include <windows.h>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
    wstring folderpath;
    wcin >> folderpath;
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW(folderpath.c_str(), &wfd);
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            wcout << &wfd.cFileName[0] << endl;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
 
    system("pause");
    return 0;
}
После запуска программы, в консоли Я ввожу:
Код
\\?\\C:\\Program Files\\*
Но программа сразу выходит на
C++
1
system("pause");
FindFirstFileW. Как подставить значение переменной типа string в функцию?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
13.02.2014, 11:43     FindFirstFileW. Как подставить значение переменной типа string в функцию? #8
Почувствуйте разницу:
Цитата Сообщение от DU Посмотреть сообщение
\\\\?\\
Цитата Сообщение от Mypowerfulbrain Посмотреть сообщение
\\?\\
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
13.02.2014, 22:16  [ТС]     FindFirstFileW. Как подставить значение переменной типа string в функцию? #9
Так?
Код
\\\\?\\C:\\Program Files\\*
Так не катит тоже (((
FindFirstFileW. Как подставить значение переменной типа string в функцию?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 22:22     FindFirstFileW. Как подставить значение переменной типа string в функцию? #10
я себе путь захардкодил, чтобы не вбивать каждый раз. в коде это выглядит так:
C++
1
wstring folderpath = L"\\\\?\\d:\\tmp\\folder with space";
слеши удваиваются.
но если вводить путь во время выполнения - то этого удвоения не надо. т.е. вбивать надо
"\\?\d:\tmp\folder with space.

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

C++
1
FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
13.02.2014, 23:35  [ТС]     FindFirstFileW. Как подставить значение переменной типа string в функцию? #11
DU, сделал как вы советовали:
Код
FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
Не видит Program Files (((
FindFirstFileW. Как подставить значение переменной типа string в функцию?
Еще варианты? =)
Еще раз весь код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdio.h> 
#include <conio.h>
#include <math.h>
#include <windows.h>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
    wstring folderpath;
    wcin >> folderpath;
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            wcout << &wfd.cFileName[0] << endl;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
 
    system("pause");
    return 0;
}
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
14.02.2014, 00:01     FindFirstFileW. Как подставить значение переменной типа string в функцию? #12
Mypowerfulbrain, у меня тоже
C++
1
 wcin >> folderpath;
считывает до первого пробела.

Как вариант может быть так:
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
#include <iostream>
#include <conio.h>
#include <math.h>
#include <windows.h>
#include <string>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
 
    int PATH_LENGHT = 100;
   
    wchar_t *tmpFolderPath = new wchar_t [PATH_LENGHT];
    wcin.getline(tmpFolderPath, PATH_LENGHT);
    wstring folderpath(tmpFolderPath);
    
    //folderpath = L"\\\\?\\c:\\Program Files\\*";
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            wcout << &wfd.cFileName[0] << endl;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
 
    system("pause");
    return 0;
}
Хотя макс. длину пути надо задать. Как без этого - не знаю.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.02.2014, 00:04     FindFirstFileW. Как подставить значение переменной типа string в функцию? #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
так же:
C++
1
2
3
4
wstring folderpath;
//wcin >> folderpath;
std::getline(wcin, folderpath);
wcout << L"Your path: " << folderpath << endl;
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
14.02.2014, 00:19     FindFirstFileW. Как подставить значение переменной типа string в функцию? #14
DU, точно!!!
спасибки!!!
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
16.02.2014, 17:04  [ТС]     FindFirstFileW. Как подставить значение переменной типа string в функцию? #15
DU, снова не работает. Проклятье какое-то (((
Код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdio.h> 
#include <conio.h>
#include <math.h>
#include <windows.h>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    cout << "Введите путь к папке (Пример: C:\\*):" << endl;
    wstring folderpath;
    //wcin >> folderpath;
    std::getline(wcin, folderpath);
    wcout << L"Your path: " << folderpath << endl;
 
 
    WIN32_FIND_DATAW wfd;
 
    HANDLE const hFind = FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
 
    if (INVALID_HANDLE_VALUE != hFind)
    {
        do
        {
            wcout << &wfd.cFileName[0] << endl;
        } while (NULL != FindNextFileW(hFind, &wfd));
 
        FindClose(hFind);
    }
 
    system("pause");
    return 0;
}


Не выводит список файлов. Вот результат:
FindFirstFileW. Как подставить значение переменной типа string в функцию?
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
16.02.2014, 20:08     FindFirstFileW. Как подставить значение переменной типа string в функцию? #16
Mypowerfulbrain, C:\Program Files\* - один слеш
Mypowerfulbrain
19 / 19 / 1
Регистрация: 24.07.2013
Сообщений: 121
16.02.2014, 20:13  [ТС]     FindFirstFileW. Как подставить значение переменной типа string в функцию? #17
Stella, решено. Спасибо всем=)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2014, 03:09     FindFirstFileW. Как подставить значение переменной типа string в функцию?
Еще ссылки по теме:

Написать функцию, меняющую в переменной типа char местами биты с номерами n и n+1 C++
Как передать значение переменной из функции инт в функцию воид? C++
Конвертация переменной типа string в массив int C++

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

Или воспользуйтесь поиском по форуму:
n0n4m3r
23 / 23 / 6
Регистрация: 12.10.2013
Сообщений: 183
11.03.2014, 03:09     FindFirstFileW. Как подставить значение переменной типа string в функцию? #18
Вроде заработало.

Добавлено через 6 минут
Спасибо
Yandex
Объявления
11.03.2014, 03:09     FindFirstFileW. Как подставить значение переменной типа string в функцию?
Ответ Создать тему
Опции темы

Текущее время: 05:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru