powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / c++ вывод каталогов и файлов в пути с пробелами и по маске
24 сообщений из 24, страница 1 из 1
c++ вывод каталогов и файлов в пути с пробелами и по маске
    #39885279
VInill80s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо вывести все директории и файлы по указанному пути рекурсией.
На данный момент написан рекурсивный вывод файлов. Но не работает, если в пути есть пробел, например, 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
c++ вывод каталогов и файлов в пути с пробелами и по маске
    #39885283
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Придётся таки забросить копи-паст случайных кусков кода из гугля и начать изучать
программирование вообще и отладку в частности.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
c++ вывод каталогов и файлов в пути с пробелами и по маске
    #39885303
VInill80s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

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

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

Добрый день, я был бы вам премного благодарен за любой, даже самый простейший пример.
Дело в том, что путь "c:\Program Files" или C:\"Program Files"\, заключенный в кавычки, все же не срабатывает.
...
Рейтинг: 0 / 0
c++ вывод каталогов и файлов в пути с пробелами и по маске
    #39885329
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такое у меня работает...
Код: 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
c++ вывод каталогов и файлов в пути с пробелами и по маске
    #39885330
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VInill80s, пожалуйста не заставляй нас компилировать и делать за тебя работу.
Ты пишешь что "не работает, если в пути есть пробел, например, c:\Program Files"

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

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

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

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


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


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


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

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

как здесь https://docs.microsoft.com/en-us/windows/win32/fileio/listing-the-files-in-a-directory
...
Рейтинг: 0 / 0
c++ вывод каталогов и файлов в пути с пробелами и по маске
    #39885352
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
c++ вывод каталогов и файлов в пути с пробелами и по маске
    #39885357
vAH_O6Vg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VInill80s, только дошло, что ты ересь творишь. opendir не поддерживает маски, он просто открывает указанную директорию. Тебе WinAPI FindFirstFile/FindNextFile надо использовать. Или самому ручками проверять соответствие маске.
...
Рейтинг: 0 / 0
c++ вывод каталогов и файлов в пути с пробелами и по маске
    #39885358
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да он, скорее всего, двойной слэш в пути не ставит, оттого и не работает....
Я ж не зря особо выделил

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

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

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


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

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


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

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

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


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


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