Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
1

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

12.02.2014, 21:40. Показов 5566. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, форумчане! Будьте добры и помогите понять один нюанс.
Например есть у меня такие строки:
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? Просто хочется путь к папке вводить вручную, а не каждый раз перед компиляцией.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2014, 21:40
Ответы с готовыми решениями:

Как присвоить переменной типа string значение из textBox1?
Почему не работает данный код: string reg_FIO = textBox1->Text; ? Заранее спасибо.

Как присвоить переменной типа String значение argv[0]?
Как присвоить переменной типа String значение argv? Заранее спасибо =)

Как присвоить переменной типа string значение из файла
Название файла неизвестно, задается пользователем в командой строке при вызове программы. Т.е....

Как вызвать функцию, имя которой указано в переменной типа String?
гугл не помог(

17
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
12.02.2014, 22:02 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);
//*******************************************
1
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
12.02.2014, 22:42  [ТС] 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);
    }
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
12.02.2014, 22:59 4
попробуйте обернуть путь в кавычки. одинарные или двойные.
0
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
12.02.2014, 23:11  [ТС] 5
DU, пробовал в кавычках, не принимает все равно. (((
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
12.02.2014, 23:23 6
msdn пишет, что в начало пути надо засунуть "\\?\".
т.е. в коде:
C++
1
  wstring folderpath = L"\\\\?\\d:\\tmp\\folder with space";
вроде прокатило.
я так понял это будет работать только с FindFirstFileW
вот тут всякие премудрости этого дела:
http://msdn.microsoft.com/en-u... s.85).aspx
1
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
13.02.2014, 11:33  [ТС] 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 в функцию?
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
13.02.2014, 11:43 8
Почувствуйте разницу:
Цитата Сообщение от DU Посмотреть сообщение
\\\\?\\
Цитата Сообщение от Mypowerfulbrain Посмотреть сообщение
\\?\\
1
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
13.02.2014, 22:16  [ТС] 9
Так?
Код
\\\\?\\C:\\Program Files\\*
Так не катит тоже (((
FindFirstFileW. Как подставить значение переменной типа string в функцию?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 22:22 10
я себе путь захардкодил, чтобы не вбивать каждый раз. в коде это выглядит так:
C++
1
wstring folderpath = L"\\\\?\\d:\\tmp\\folder with space";
слеши удваиваются.
но если вводить путь во время выполнения - то этого удвоения не надо. т.е. вбивать надо
"\\?\d:\tmp\folder with space.

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

C++
1
FindFirstFileW((L"\\\\?\\" + folderpath).c_str(), &wfd);
1
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
13.02.2014, 23:35  [ТС] 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;
}
0
75 / 75 / 10
Регистрация: 26.02.2013
Сообщений: 224
14.02.2014, 00:01 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;
}
Хотя макс. длину пути надо задать. Как без этого - не знаю.
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
14.02.2014, 00:04 13
Лучший ответ Сообщение было отмечено Mypowerfulbrain как решение

Решение

так же:
C++
1
2
3
4
wstring folderpath;
//wcin >> folderpath;
std::getline(wcin, folderpath);
wcout << L"Your path: " << folderpath << endl;
2
75 / 75 / 10
Регистрация: 26.02.2013
Сообщений: 224
14.02.2014, 00:19 14
DU, точно!!!
спасибки!!!
1
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
16.02.2014, 17:04  [ТС] 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 в функцию?
1
75 / 75 / 10
Регистрация: 26.02.2013
Сообщений: 224
16.02.2014, 20:08 16
Mypowerfulbrain, C:\Program Files\* - один слеш
1
20 / 20 / 1
Регистрация: 24.07.2013
Сообщений: 121
16.02.2014, 20:13  [ТС] 17
Stella, решено. Спасибо всем=)
0
25 / 25 / 15
Регистрация: 12.10.2013
Сообщений: 183
11.03.2014, 03:09 18
Вроде заработало.

Добавлено через 6 минут
Спасибо
0
11.03.2014, 03:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2014, 03:09
Помогаю со студенческими работами здесь

Как сравнить значение переменной типа String с данными в базе данных?
Допустим, у меня есть String str = &quot;test&quot;;, можно ли как-то сравнить его с данными в базе данных

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

Как подставить значение переменной
Как правильно написать, чтоб вместо send_form подставлялось значение переменной определенной в...

Присвоение переменной типа std::string значение bool
Объясните, почему компилируется такой код: std::string str; str = true; а такой нет:


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru