Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / c++ вывод каталогов и файлов в пути с пробелами и по маске / 24 сообщений из 24, страница 1 из 1
05.11.2019, 14:34
    #39885279
VInill80s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
Необходимо вывести все директории и файлы по указанному пути рекурсией.
На данный момент написан рекурсивный вывод файлов. Но не работает, если в пути есть пробел, например, c:\Program Files (пытался экранировать, писать \\, но ничего не получилось) и если нужно вывести по маске, например, c:\*.txt.
Использую компилятор MinGW.
Библиотеки типа буст или filesystem также не могу использовать (могут быть использованы только те, что есть сейчас).
Соответственно, вопрос, как выводить по маске, например, c:\Program Files\*.txt и сделать возможной работу с пробелами в путях. Путь задается пользователем
Код: plaintext
1.
scanf("%s", path);

.
Код: plaintext
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.
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include "iostream"
#include "string"
#include <windows.h>
#include <fstream>
using namespace std;
void listFilesRecursively(char *path);
int main()
{
  setlocale(LC_ALL , "Russian");
    char path[100];
    printf("Enter path to list files: ");
    scanf("%s", path);
    listFilesRecursively(path);
    return 0;
}
void listFilesRecursively(char *basePath)
{
     WIN32_FILE_ATTRIBUTE_DATA Info;
     char path[1000];
     struct dirent *dp;
     DIR *dir = opendir(basePath);
    if (!dir)
        return;
    while ((dp = readdir(dir)) != NULL)
    {
        if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0)
        {
            printf("%s\n", dp->d_name);
 
            strcpy(path, basePath);
            strcat(path, "/");
            strcat(path, dp->d_name);
            
            string path_s = (const char*) path;
            GetFileAttributesEx(path_s.c_str(), GetFileExInfoStandard, &Info);
            cout<<Info.nFileSizeLow<<endl;
            listFilesRecursively(path);
        }
    }
 
    closedir(dir);
}
...
Рейтинг: 0 / 0
05.11.2019, 14:54
    #39885283
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
Придётся таки забросить копи-паст случайных кусков кода из гугля и начать изучать
программирование вообще и отладку в частности.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.11.2019, 15:20
    #39885303
VInill80s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
Dimitry Sibiryakov

Придётся таки забросить копи-паст случайных кусков кода из гугля и начать изучать
программирование вообще и отладку в частности.

Не будь это единичным заданием (всего их пару штук), то так бы и сделал. Но в моем случае - это, как минимум, нерационально.
Можете сказать что-нибудь по теме?
...
Рейтинг: 0 / 0
05.11.2019, 15:25
    #39885306
d7i
d7i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
Пути с пробелами указывайте в кавычках...
...
Рейтинг: 0 / 0
05.11.2019, 15:28
    #39885312
VInill80s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
d7i,

Добрый день, я был бы вам премного благодарен за любой, даже самый простейший пример.
Дело в том, что путь "c:\Program Files" или C:\"Program Files"\, заключенный в кавычки, все же не срабатывает.
...
Рейтинг: 0 / 0
05.11.2019, 16:06
    #39885329
d7i
d7i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
Вот такое у меня работает...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   DIR *dirp;
   struct dirent *dp;
  
   dirp = opendir("C:\\Program Files\\*.*");  // !!!
   if(dirp != NULL)
   {
     for(;;)
     {
        dp = readdir(dirp);
        if(dp == NULL) break;
        
        printf("%s\n", dp->d_name);
        ..................    
      }
      closedir(dirp);
   }
 
...
Рейтинг: 0 / 0
05.11.2019, 16:06
    #39885330
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
VInill80s, пожалуйста не заставляй нас компилировать и делать за тебя работу.
Ты пишешь что "не работает, если в пути есть пробел, например, c:\Program Files"

Детализируй какая из функций opendir? readdir? closedir? выдала неверное (non-expected) значение.

Приведи точные версии ОС и компиллятора. С точностью до минорных.
...
Рейтинг: 0 / 0
05.11.2019, 16:24
    #39885340
VInill80s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
mayton
VInill80s, пожалуйста не заставляй нас компилировать и делать за тебя работу.
Ты пишешь что "не работает, если в пути есть пробел, например, c:\Program Files"

Детализируй какая из функций opendir? readdir? closedir? выдала неверное (non-expected) значение.

Приведи точные версии ОС и компиллятора. С точностью до минорных.


>43k сообщений
>из них 20+% по плюсам
>не понимает, что ошибка с некорректным путем выпадает при открытии, то есть opendir
)))
мы вам перезвоним
...
Рейтинг: 0 / 0
05.11.2019, 16:26
    #39885342
vAH_O6Vg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
VInill80s, вместо
Код: plaintext
1.
scanf("%s", path);


напиши
Код: plaintext
1.
gets(path);


Оба варианта говно, но второй должен работать. Конечно, если компилятор не шибко новый, а то gets настолько говно, что даже из стандартной библиотеки выкинули.
...
Рейтинг: 0 / 0
05.11.2019, 16:30
    #39885343
VInill80s
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
vAH_O6Vg,

Не, этот тоже не прокатил(.
(но все равно спасибо)
...
Рейтинг: 0 / 0
05.11.2019, 16:34
    #39885345
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
VInill80s, попробуй перепиши на WindowsAPI с использованием FindFirstFile, FindNextFile ... e.t..c

как здесь https://docs.microsoft.com/en-us/windows/win32/fileio/listing-the-files-in-a-directory
...
Рейтинг: 0 / 0
05.11.2019, 16:43
    #39885352
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
VInill80sне понимает, что ошибка с некорректным путем выпадает при открытии, то есть opendir
)))

А у меня - не выпадает:
Код: sql
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.
/*
  * readdir.c: example usage for opendir()/readdir()/closedir()
  *
  * Matt Dailey, Feb 2004
  *
  * Compile with "gcc readdir.c" to get executable a.out.
  *
  * This example program prints out the files in the current
  * directory
  *
  * Be sure to refer to "man 3 readdir" etc.
  *
  */

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

int main( int argc, char *argv[] ) {
     DIR *pDIR;
     struct dirent *pDirEnt;

     /* Open the current directory */

     pDIR = opendir("c:\\Program Files");

     if ( pDIR == NULL ) {
         fprintf( stderr, "%s %d: opendir() failed (%s)\n",
                  __FILE__, __LINE__, strerror( errno ));
         exit( -1 );
     }

     /* Get each directory entry from pDIR and print its name */

     pDirEnt = readdir( pDIR );
     while ( pDirEnt != NULL ) {
         printf( "%s\n", pDirEnt->d_name );
         pDirEnt = readdir( pDIR );
     }

     /* Release the open directory */

     closedir( pDIR );

     return 0;
}


Код: plaintext
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.
.
...
AMD
Application Verifier
ATI
ATI Technologies
Broadcom
Common Files
desktop.ini
EqualizerAPO
Internet Explorer
Mozilla Firefox
MSBuild
Oracle
Realtek
Reference Assemblies
Uninstall Information
Windows Defender
Windows Journal
Windows Mail
Windows Media Player
Windows Multimedia Platform
Windows NT
Windows Photo Viewer
Windows Portable Devices
Windows Sidebar
WindowsApps
WindowsPowerShell

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.11.2019, 16:56
    #39885357
vAH_O6Vg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
VInill80s, только дошло, что ты ересь творишь. opendir не поддерживает маски, он просто открывает указанную директорию. Тебе WinAPI FindFirstFile/FindNextFile надо использовать. Или самому ручками проверять соответствие маске.
...
Рейтинг: 0 / 0
05.11.2019, 16:56
    #39885358
d7i
d7i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
Да он, скорее всего, двойной слэш в пути не ставит, оттого и не работает....
Я ж не зря особо выделил

dirp = opendir("C:\\Program Files\\*.*"); // !!!
...
Рейтинг: 0 / 0
05.11.2019, 17:02
    #39885364
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
Он же пишет что слеши ставил.
...
Рейтинг: 0 / 0
05.11.2019, 17:06
    #39885366
vAH_O6Vg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
d7i, у него путь вводит пользователь, там экранировать не нужно. scanf("%s", path) нарезает ввод по пробелам, gets нарезает по переносам строк. Но opendir не умеет маски, поэтому всё равно не работает.
...
Рейтинг: 0 / 0
05.11.2019, 17:11
    #39885369
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
Думаю да.

Ему эта грёбаная маска приснилась где-то. Ну что-же пусть проверяет на каждой итерации
что path соотвествует маске *.txt. И это тот еще гимор ведь у негоже не С++ а С.
...
Рейтинг: 0 / 0
05.11.2019, 17:40
    #39885385
d7i
d7i
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
vAH_O6Vg
Но opendir не умеет маски, поэтому всё равно не работает.

Во блин, не обратил внимание что там ещё и маска...
Да уж, opendir тут совем не катит.
...
Рейтинг: 0 / 0
05.11.2019, 18:49
    #39885416
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
Dimitry Sibiryakov
Код: sql
1.
2.
     /* Release the open directory */
     closedir( pDIR );


кстати, а если это внутри проги не сделать, она чё закончится и оставит открытую диру где-то в памяти?
...
Рейтинг: 0 / 0
05.11.2019, 18:53
    #39885418
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
maytonу негоже не С++ а С.

У него солянка сборная. В конце листинга рядом printf и cout.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.11.2019, 18:59
    #39885419
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
А точно солянка.
...
Рейтинг: 0 / 0
05.11.2019, 19:01
    #39885420
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
полудух
Dimitry Sibiryakov
Код: sql
1.
2.
     /* Release the open directory */
     closedir( pDIR );


кстати, а если это внутри проги не сделать, она чё закончится и оставит открытую диру где-то в памяти?

С точки зрения файловой системы фолдер - это тоже некоторый подвид файла. Поэтому думаю
что будет утечка файловых хендлов. Но не готов точно сказать надо смотреть более вооруженным глазом.

Для нашего случая - скорее всего хендлы удалятся с финалом процесса.
...
Рейтинг: 0 / 0
05.11.2019, 22:10
    #39885451
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
полудух
Dimitry Sibiryakov
Код: sql
1.
2.
     /* Release the open directory */
     closedir( pDIR );


кстати, а если это внутри проги не сделать, она чё закончится и оставит открытую диру где-то в памяти?
Пока программа работает - у нее будет открытый "файл" каталога. Когда программа завершится - ОС сама закроет все открытые файлы, включая каталоги.
...
Рейтинг: 0 / 0
06.11.2019, 11:01
    #39885600
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c++ вывод каталогов и файлов в пути с пробелами и по маске
угу, я так и думал
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / c++ вывод каталогов и файлов в пути с пробелами и по маске / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]