Как найти файл в c

Обновлено: 17.05.2024

мне не разрешено выполнять ls команда и анализ результатов из моей программы.

в небольших и простых задачах я не использую boost, я использую dirent.h, который также доступен для Windows:

Это просто небольшой файл заголовка и делает большинство простых вещей, которые вам нужны, не используя большой подход на основе шаблонов, как boost(не обижайтесь, мне нравится boost!).

автором уровня совместимости windows является Тони Ронкко. В Unix, это стандартный заголовок.

обновление 2017:

В C++17 есть теперь это официальный способ перечислить файлы вашей файловой системы: std::filesystem . Есть отличный ответ от Shreevardhan ниже с этим исходным кодом:

рассмотрите возможность повышения его ответа, если вы используете подход C++17.

к сожалению, стандарт C++ не определяет стандартный способ работы с файлами и папками в эту сторону.

поскольку нет кросс-платформенного способа, лучший кросс-платформенный способ-использовать библиотеку, такую как модуль файловой системы boost.

кросс-платформенный метод повышения:

следующая функция, учитывая путь к каталогу и имя файла, рекурсивно ищет каталог и его подкаталоги для имя файла, возврат bool, и в случае успеха, путь к файлу, который был найден.

источник со страницы boost, упомянутой выше.

для систем на базе Unix / Linux:

пример кода, который ищет каталог для записи "имя":

исходный код из вышеуказанных страниц.

для систем на базе windows:

вы можете использовать Win32 API FindFirstFile / findnextfile функция / FindClose функции.

в следующем примере C++ показано минимальное использование FindFirstFile.

исходный код с вышеуказанных страниц msdn.

C++17 теперь имеет std::filesystem::directory_iterator , который можно использовать как

достаточно одной функции, вам не нужно использовать стороннюю библиотеку (для Windows).

PS: Как упоминалось @Sebastian, вы можете изменить *.* to *.ext чтобы получить только EXT-файлы (т. е. определенного типа) в этом каталоге.

для решения только C, пожалуйста, проверьте это. Для этого требуется только дополнительный заголовок:

некоторые преимущества перед другими вариантами:

  • это портативный-обертывания POSIX dirent и Windows FindFirstFile
  • он использует readdir_r где доступно, что означает, что это (обычно) threadsafe
  • поддерживает Windows UTF-16 через то же самое UNICODE макрос
  • это C90 так что даже очень древние компиляторы могут использовать его

Я рекомендую использовать glob С этой оболочкой многоразовые. Он генерирует vector<string> соответствующие пути к файлам, которые соответствуют шаблону glob:

что тогда можно назвать нормальным шаблону системы, такие как:

вот очень простой код C++11 используя boost::filesystem библиотека для получения имен файлов в каталоге (за исключением имен папок):

почему бы не использовать glob() ?

Я думаю, ниже фрагмента можно использовать для списка всех файлов.

Ниже приведена структура структуры dirent

попробуйте boost для метода x-platform

или просто используйте свой конкретный файл для ОС.

проверьте этот класс, который использует win32 api. Просто создайте экземпляр, предоставив foldername из которого вы хотите список, то вызов getNextFile метод, чтобы получить следующий filename из каталога. Я думаю, что это нужно windows.h и stdio.h .

руководство GNU FTW

кроме того, иногда это хорошо, чтобы пойти прямо к источнику (каламбур). Вы можете многому научиться, глядя на внутренности некоторых наиболее часто используемые команды в Linux. Я установил простое зеркало coreutils GNU на github (для чтение.)

возможно, это не относится к Windows, но ряд случаев использования вариантов Unix может быть с помощью этих методов.

надеюсь, это поможет.

Я надеюсь, что этот код поможет вам.

эта реализация реализует вашу цель, динамически заполняя массив строк содержимым указанного каталога.

это работает для меня. Простите, если не могу вспомнить источник. Вероятно, это с мужской страницы.

Shreevardhan ответ работает отлично. Но если вы хотите использовать его в C++14 просто внести изменения namespace fs = experimental::filesystem;

вы можете получить все прямые файлы в корневом каталоге с помощью std:: experimental::filesystem:: directory_iterator(). Затем прочитайте название этих pathfiles.

тогда просто прочитайте файл.

EDIT: этот ответ следует рассматривать как взлом, но он действительно работает (хотя и определенным образом), если у вас нет доступа к более элегантным решениям.

этот ответ должен работать для пользователей Windows, у которых возникли проблемы с этой работой с Visual Studio с любым другим ответом.

скачать dirent.H файл со страницы github. Но лучше просто использовать Raw dirent.H файл и выполните мои шаги ниже (это то, как я получил его на работу).

страница Github для dirent.h для Windows:страница Github для dirent.h

перейдите в свой проект и добавьте новый элемент ( Ctrl + Shift + A ). Добавить файл заголовка (.h) и назовите его dirent.h.

вставить Raw dirent.файл H код в заголовок.

включить " dirent.h " в вашем коде.

поставить ниже void filefinder() метод в вашем коде и вызовите его из вашего main функция или редактировать функции, как вы хотите использовать его.

поскольку файлы и подкаталоги каталога обычно хранятся в древовидной структуре, интуитивно понятным способом является использование алгоритма DFS для рекурсивного обхода каждого из них. Вот пример в операционной системе windows с помощью основных файловых функций в io.h. Вы можете заменить эти функции в другой платформе. Что я хочу выразить, так это то, что основная идея DFS идеально подходит для этой проблемы.

Я попытался следовать примеру, приведенному в и ответы и, возможно, стоит отметить, что это выглядит так, как будто std::filesystem::directory_entry было изменено, чтобы не было перегрузки << оператора. Вместо std::cout << p << std::endl; мне пришлось использовать следующее, чтобы скомпилировать и заставить его работать:

пыталась передать p на std::cout << вылилось в ошибку по перегрузке.

просто то, что я хочу поделиться и поблагодарить вас за чтение материала. Поиграйте с функцией немного, чтобы понять ее. Тебе может понравиться. e означало расширение, p-путь, а s-разделитель пути.

Если путь передается без конечного разделителя, разделитель будет добавлен к пути. Для расширения, если введена пустая строка, функция вернет любой файл, который не имеет расширения в своем имени. Если бы одна звезда была вводится, чем все файлы в каталоге будут возвращены. Если длина e больше 0, но не является единицей*, то точка будет добавлена к e, если e не содержит точку в нулевом положении.

для возвращаемого значения. Если возвращается карта нулевой длины, то ничего не найдено, но каталог был открыт нормально. Если индекс 999 доступен из возвращаемого значения, но размер карты равен только 1, это означает, что возникла проблема с открытием пути к каталогу.

обратите внимание, что для эффективности, эту функцию можно разделить в 3 более небольших функции. Кроме того, вы можете создать функцию вызывающего абонента, которая определит, какую функцию он будет вызывать на основе ввода. Почему это более эффективно? Сказал, что если вы собираетесь захватить все, что является файлом, делая этот метод, подфункция, построенная для захвата всех файлов, просто захватит все, что является файлами, и не нужно оценивать любые другие ненужные условия каждый раз, когда он нашел файл.

Это было бы также применяются, когда вы захватить файлы, которые не имеют расширения. Определенная встроенная функция для этой цели будет оценивать только погоду, если найденный объект является файлом, а затем, имеет ли имя файла точку в нем.

сохранение может быть не так много, если Вы читаете только каталоги с не так много файлов. Но если Вы читаете массовое количество каталогов или если каталог имеет пару сотен тысяч файлов, это может быть огромная экономия.


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

Получить список файлов в папке и подпапках
Каким образом получить список файлов в текущей папке приложения и всех подпапках рядом, с учетом.

Проверить и изменить названия всех файлов в текущей папке и подпапках
Работаю в Visual Studio 2012. Собственно, нужно проверить длину имён всех файлов и сократить.

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

Решение

Slukka, если читать предложенный топик весь, там все расписано.
Если совсем примитивно, то вот так:
Тут мы задаем каталог поиска, маску поиска, и указываем искать во всех подкаталогах.
Slap, спасибо, такой "примитивный" способ помог.
Буду разбираться с более сложным вариантом с предложенного топика
Надо с чего то начинать. Добрый день, наковырял тему и хочется еще узнать как осуществить поиск по хитрой маске.
Например
Надо найти файл а как он называется точно не знаешь знаешь только отрывок
солёнаякриветко.****
маска *криве*.* или солена*.**** или *олё*.* и все в таком плане. то есть поиск отрывка названия файла. Если задать *.jpg будет находить все jpg? А как искать файлы но чтобы не возникало ошибки с доступом к файлу. Чтобы такой файл пропускался А как искать файлы но чтобы не возникало ошибки с доступом к файлу. Чтобы такой файл пропускался

Получения всех файлов в папке и подпапках игнорируя ошибку с правами доступа
К слову сам вопрос. Как получить все файлы в папке и подпапках игнорирую ошибку с правами доступа.

Подсчет количества файлов в подпапках (Ошибка при попытке доступа к папке)
Граждане, у меня возникла проблема, с которой безуспешно борюсь уже как 2 недели :wall: Помощь.

Записать в файл список найденных в указанной папке и подпапках файлов меньших указанного размера
Пользователь вводит адрес папки и размер в байтах. Программа записывает в результирующий файл.


Поиск файлов в папках и подпапках
Подскажите как сделать поиск папок и под папках? Для поиска папок делаю так: static string sd =.

Эти функции осуществляют и завершают поиск для указанных имен файлов:

Remarks

Функция _findfirst предоставляет сведения о первом экземпляре имени файла, соответствующем файлу, указанному в аргументе filespec . В filespec можно использовать любые комбинации подстановочных знаков, которые поддерживаются операционной системой.

Функции возвращают сведения о файле в структуре _finddata_t , которая определена в IO.h. Различные функции в данном семействе используют множество вариантов структуры _finddata_t . Базовая структура _finddata_t содержит следующие элементы:

unsigned attrib
Атрибут файла.

time_t time_create
Время создания файла (–1L для файловых систем FAT). Это время хранится в формате UTC. Для преобразования в местное время используйте функцию localtime_s.

time_t time_access
Время последнего доступа к файлу (–1L для файловых систем FAT). Это время хранится в формате UTC. Для преобразования в местное время используйте функцию localtime_s .

time_t time_write
Время последней записи в файл. Это время хранится в формате UTC. Для преобразования в местное время используйте функцию localtime_s .

_fsize_t size
Длина файла в байтах.

char name [ _MAX_PATH ] Имя соответствующего файла или каталога без пути с конечным нуль-символом.

В файловых системах, которые не поддерживают время создания и последнего обращения к файлу (например, в системе FAT), поля time_create и time_access всегда содержат значение –1L.

_MAX_PATH определен в Stdlib.h как 260 байт.

Задание целевых атрибутов (например _A_RDONLY ) для ограничения операции поиска невозможно. Эти атрибуты возвращаются в поле attrib структуры _finddata_t и могут иметь следующие значения (определенные в IO.h). Пользователи не должны считать эти значения единственно возможными для поля attrib .

_A_ARCH
Архив. Устанавливается при изменении файла и очищается командой BACKUP . Значение: 0x20.

_A_HIDDEN
Скрытый файл. Обычно не виден команде DIR, если не используется параметр /AH . Возвращает сведения об обычных файлах и файлах, имеющих этот атрибут. Значение: 0x02.

_A_NORMAL
Нормальный. У файла не установлены никакие другие атрибуты, чтение и запись возможны без ограничений. Значение: 0x00.

_A_RDONLY
Только для чтения. Файл невозможно открыть для записи; также невозможно создать файл с этим именем. Значение: 0x01.

_A_SUBDIR
Подкаталог. Значение: 0x10.

_A_SYSTEM
Системный файл. Обычно не виден команде DIR , если не используется параметр /A или /A:S . Значение: 0x04.

Функция _findnext находит следующее имя, если таковое имеется, которое соответствует аргументу filespec , указанному в предыдущем вызове функции _findfirst . Аргумент fileinfo должен указывать на структуру, инициализированную предыдущим вызовом функции _findfirst . Если обнаружено соответствие, содержимое структуры fileinfo изменяется, как описано выше. В противном случае оно остается неизменным. Функция _findclose закрывает указанный дескриптор поиска и освобождает все связанные ресурсы для функций _findfirst и _findnext . Дескриптор, возвращенный ранее функцией _findfirst или _findnext , необходимо сначала передать в функцию _findclose , чтобы можно было выполнять операции изменения (например, удаление) в каталогах, которые образуют переданные им пути.

Функции _find допускают вложение. Например, если вызов функции _findfirst или _findnext нашел файл, являющийся подкаталогом, новый поиск можно начать другим вызовом функции _findfirst или _findnext .

_wfindfirst и _wfindnext — это версии функций _findfirst и _findnext для расширенных символов. Аргумент структуры версий для расширенных символов имеет тип данных _wfinddata_t , который определен в файлах IO.h и Wchar.h. Поля этого типа данных совпадают с полями _finddata_t типа данных, за исключением того, что в _wfinddata_t поле имени используется тип, wchar_t а не тип char . В остальном поведение функций _wfindfirst и _wfindnext не отличается от поведения функций _findfirst и _findnext .

Функции _findfirst и _findnext используют 64-разрядный тип времени. Если необходимо использовать прежний 32-разрядный тип времени, можно определить _USE_32BIT_TIME_T . Версии этих функций, в именах которых имеется суффикс 32 , используют 32-разрядный тип времени; версии с суффиксом 64 используют 64-разрядный тип времени.

Функции _findfirst32i64 , _findnext32i64 , _wfindfirst32i64 и _wfindnext32i64 также ведут себя идентично версиям этих функций с 32-разрядным типом времени, за исключением того, что они используют и возвращают 64-разрядные значения длины файлов. Функции _findfirst64i32 , _findnext64i32 , _wfindfirst64i32 и _wfindnext64i32 используют 64-разрядный тип времени, но 32-разрядные значения длины файлов. Эти функции используют соответствующие варианты типа _finddata_t , в которых поля имеют разные типы для времени и размера файла.

_finddata_t фактически представляет собой макрос, который преобразуется в _finddata64i32_t (или _finddata32_t , если определена константа _USE_32BIT_TIME_T ). В следующей таблице приведены сводные сведения об этих вариантах _finddata_t :

Структура Тип времени Тип размера файла
_finddata_t , _wfinddata_t __time64_t _fsize_t
_finddata32_t , _wfinddata32_t __time32_t _fsize_t
__finddata64_t , __wfinddata64_t __time64_t __int64
_finddata32i64_t , _wfinddata32i64_t __time32_t __int64
_finddata64i32_t , _wfinddata64i32_t __time64_t _fsize_t

_fsize_t значение typedef для unsigned long (32 бит).

Задача получения списка файлов или папок в другой папке часто бывает при написании программы, поэтому, чтобы рецепт всегда был под рукой, решил написать коротенькую статью.

Получить список файлов в папке

Для получения списка файлов можно воспользоваться методом GetFiles.

Пример поиска файлов:

Метод GetFiles может принимать 3 параметра, из которых первый обязательный:

GetFiles(String path, String pattern, SearchOption options)

path - путь к папке, в которой ищем файлы;

pattern - шаблон поиска файлов (например, *.txt или ??abc.doc);

options - способ поиска, указывающий нужно искать только в текущей папке (SearchOption.TopDirectoryOnly) или во вложенных тоже (SearchOption.AllDirectories).

Пример поиска файлов по шаблону смотрите ниже (рекурсивный поиск).

Метод EnumerateFiles так же может принимать 3 параметра:

path - путь к папке, в которой ищем файлы;

pattern - шаблон поиска файлов;

options - способ поиска.

Пример поиска файлов методом EnumerateFiles:

Как видим, поиск методом EnumerateFiles аналогичен GetFiles, однако, он начнется сразу, до получения всего списка файлов, что может быть актуальным при очень большом количестве файлов.

Получить список папок в папке

Для получения списка папок можно воспользоваться методом GetDirectories.

Пример поиска папок с помощью GetDirectories:

Метод GetDirectories может принимать 3 параметра, из которых первый обязательный:

GetDirectories(String path, String pattern, SearchOption options)

path - путь к папке, в которой ищем файлы;

pattern - шаблон поиска файлов (например, *.txt или ??abc.doc);

options - способ поиска, указывающий нужно искать только в текущей папке (SearchOption.TopDirectoryOnly) или во вложенных тоже (SearchOption.AllDirectories).

Метод EnumerateDirectories аналогично GetDirectories принимает 3 параметра:

path - путь к папке, в которой ищем файлы;

pattern - шаблон поиска файлов;

options - способ поиска.

Пример поиска папок с помощью EnumerateDirectories:

Примечание: Во всех способах получения файлов и папок можно во втором параметре указывать шаблон поиска pattern, однако в нем можно использовать только * (любое количество любых символов) и ? (один любой символ) для указания шаблона поиска, регулярные выражения не поддерживаются.

Получить список файлов по шаблону рекурсивно

В этом случае нужно лишь добавить 2-й параметр, в котором указываем маску файлов и 3-й параметр, означающий что нужно искать файлы так же во вложенных папках.

Однако, у этого способа есть недостаток - в случае, если в какую-то папку нет доступа, получится ошибка и список файлов не будет получен совсем.

Рекурсивно получить список всех файлов и папок

Этот пример рекурсивного поиска файлов и папок не прервется в случае ошибки, а продолжится дальше. Вместо массива здесь используется List для записи списка файлов и папок.

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

Да и нередко к поиску приходиться прибегать и в тех случаях, когда вы, например, не знаете, где точно расположены определенные файлы (или хотите быстро отфильтровать и просмотреть только картинки). Ситуаций, на самом деле, может быть множество.

ускорение ПК

Как найти файл на диске

Способ №1: с помощью проводника Windows

Если у вас современная ОС Windows 10 — то в проводнике, в принципе, есть все самые необходимые инструменты, позволяющие вести поиск данных на всех носителях, которые видны вашей системой.

Обычно, ссылка на запуск проводника вынесена на панель задач, рядом с кнопкой ПУСК (см. пример ниже). Также можно воспользоваться сочетанием кнопок Win+E.

Запуск проводника

В проводнике следует обратить внимание на два элемента:

  1. слева в сайдбаре (колонке) представлены все самые популярные папки, в которые вы заходите (искомый документ вполне вероятно представлен в одной из них);
  2. в правой части, сверху, есть поисковая строка: в нее можно написать часть названия вашего файла или часть его содержания.

Проводник в Windows

Проводник в Windows

Например, в качестве примера напишу в поисковую строку слово "Открытки" .

В результатах поиска будут представлены как файлы с таким именем, так и те файлы, в теле которых содержится данное слово.

И, отмечу, что файлов может найтись великое множество (если у вас в системе 2-3 диска каждый из которых на 4-8 ТБ, скажем, то файлов может быть тысячи!)

Результаты поиска

Средства поиска

Во вкладке "Размер" можно указать самые разные варианты:

  • пустые: 0 КБ;
  • крошечные: 0-10 КБ;
  • маленькие: 10-100 КБ (например, текстовые файлы с паролями);
  • средние: 100 КБ - 1 МБ (наиболее популярный размер "среднего" документа) и др.

Размер файла

tip-iskomyih-faylov

В общем-то, указав и задав все необходимые параметры - можно быстро найти на диске только определенные типы файлов. Из десятка найденных куда проще найти тот, что вам нужен (чем из тысяч, не так ли?!).

Способ №2: с помощью Total Commander

Проводник проводником, но его возможностей не всегда хватает (да и работа часто вызывает нарекания).

Куда эффективней воспользоваться для поиска файловыми коммандерами. Одной из самых популярных программ подобного рода является Total Commander. В нем и рассмотрю, как и что делать.

Внешний вид Total Commander (2 окна)

Внешний вид Total Commander (2 окна)

Альтернатива проводнику. Представляет диски, папки и файлы в двух колонках: во многих случаях так гораздо удобнее с ними работать (например, для копирования файлов — достаточно из одного окна перенести в другое).

Также коммандер поддерживает работу с архивами, с FTP-серверами, пакетное переименование файлов, поиск файлов и т.д. (о его функциональности можно написать еще несколько статей).

Рассмотрим ниже вариант поиска изображений на диске: ищем все картинки, которые на нем есть (обращаю внимание, что поиск документов или видео будет аналогичен).

После запуска программы нажмите в панели инструментов на иконку с "Лупой" — либо просто зажмите сочетание клавиш Alt+F7. Должно появиться окно поиска.

Нажимаем кнопку поиска (альтернатива - сочетание кнопок ALT+F7)

Нажимаем кнопку поиска (альтернатива - сочетание кнопок ALT+F7)

В том числе и для поиска файлов самых различных типов: архивы, базы данных, документы, графика и т.д. Отмечу, что, выбрав один из шаблонов — все расширения файлов для поиска будут автоматически загружены в настройки поиска.

Выбираем, что будем искать (шаблоны)

Выбираем, что будем искать (шаблоны)

Далее необходимо указать диски, где будет производиться поиск (например, можно искать на флешке или HDD, на любом носителе, который видит ваша ОС).

Указываем диски для поиска

Указываем диски для поиска

Все локальные

Начать поиск

Собственно, через некоторое время вы увидите, как под окно поиска будут показываться все найденные файлы. Когда поиск будет окончен, нажмите кнопку "Файлы на панель", чтобы ознакомиться со всеми результатами поиска.

Рассмотрим другой вариант поиска: документ, в содержании которого есть слово "ключ".

Для этого в шаблонах необходимо выбрать офисный тип документов (будут автоматически подставлены файлы документов: doc, txt и пр.), указать букву диска, и поставить галочку в графе "С текстом" — в строку напротив написать текст, который будет искаться в файле.

Отмечу, что Total Commander способен находить заданный текст в различных кодировках (ANSI, ASCII, UTF-8, UTF-16).

Поиск документов, которые содержат определенное слово

Поиск документов, которые содержат определенное слово

Еще одна частая задача: производить поиск уже в найденных результатах поиска. Т.е. пошаговый поиск, позволяющий отсортировать сначала сотню файлов из тысяч, затем из этой сотни - десяток, а из десятка - несколько нужных.

Для примера я найду все картинки на системном диске "C:\" (всё выполняется аналогично примерам выше). Обратите внимание, что получилось найти 4484 файлов. После нажимаем кнопку "Файлы на панель" .

Нашли тысячи файлов.

Нашли тысячи файлов.

Теперь необходимо снова вызвать поиск (сочетание кнопок Alt+F7 ) и ввести критерии поиска ( но не указывать место поиска! По умолчанию Total Commander будет вести поиск уже в найденных результатах).

Например, я укажу просто имя файла "canc" (разумеется, можно задавать куда более сложные критерии поиска). Как результат — из найденных 4000+ файлов осталось только 20 с таким именем.

Результаты поиска в результатах поиска

Результаты поиска в результатах поиска

Способ №3: с помощью спец. утилит для поиска

В данной статье не могу не отметить и спец. утилиты для поиска. Их достаточно много, но я выделю одну из наиболее популярных.

Everything

Everything - главное окно поиска

Everything - главное окно поиска

Это небольшая, бесплатная и очень полезная программа, предназначенная для быстрого поиска и фильтрации файлов на любых дисках в системе.

Использование утилиты очень простое: после запуска она сканирует компьютер (все накопители, подключенные к системе). Далее, когда от вас поступает запрос, она отфильтровывает и оставляет только самое нужное.

Отмечу, что ее скорость работы в разы превышает скорость работы проводника. Поэтому, если вы часто ищите различные файлы на винчестере — крайне рекомендую к знакомству.

Читайте также: