Как получить имя файла по пути c

Обновлено: 21.11.2024

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

Перегрузки

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

Возвращает имя файла и расширение указанной строки пути.

ПолучитьИмяФайла(ReadOnlySpan)

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

Параметры

Доступный только для чтения диапазон, содержащий путь, по которому можно получить имя и расширение файла.

Возврат

Символы после последнего символа разделителя каталогов в пути .

Примечания

Возвращенный диапазон только для чтения содержит символы пути, следующие за последним разделителем в пути. Если последний символ в пути является символом разделителя тома или каталога, метод возвращает ReadOnlySpan.Empty. Если путь не содержит символа-разделителя, метод возвращает путь .

См. также

Относится к

ПолучитьИмяФайла(Строка)

Возвращает имя файла и расширение указанной строки пути.

Параметры

Строка пути, из которой можно получить имя и расширение файла.

Возврат

Символы после последнего символа-разделителя каталогов в пути. Если последний символ пути является символом разделителя каталога или тома, этот метод возвращает значение Empty. Если path имеет значение null , этот метод возвращает значение null .

Исключения

Примеры

В следующем примере показано поведение метода GetFileName на настольной платформе Windows.

Примечания

Возвращаемое значение равно null, если путь к файлу равен null .

Для определения начала имени файла используются символы-разделители: DirectorySeparatorChar и AltDirectorySeparatorChar.

Поскольку \ является допустимым именем файла в Unix, GetFileName, работающий на платформах на основе Unix, не может правильно вернуть имя файла из пути на основе Windows, такого как C:\mydir\myfile. ext, но GetFileName, работающий на платформах Windows, может правильно возвращать имя файла из пути на основе Unix, такого как /tmp/myfile.ext, поэтому поведение метода GetFileName не строго одинаковы на платформах на базе Unix и Windows.

Или запустите команду " man 3 basename " в целевой системе UNIX/POSIX.

Используйте базовое имя (которое имеет нечетную семантику углового регистра) или сделайте это самостоятельно, вызвав strrchr(pathname, '/') и обработав всю строку как базовое имя, если она не содержит символа '/'.

Вот пример однострочника (дан char * whoami ), который иллюстрирует базовый алгоритм:

требуется дополнительная проверка, если значение NULL возможно. Также обратите внимание, что это просто указывает на исходную строку - может подойти " strdup() ".

Вы также можете использовать strstr, если вас интересуют имена каталогов:

Конечно, если это вопрос только Gnu/Linux, вы можете использовать библиотечные функции.

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

Функция basename() возвращает последний компонент пути, которым может быть имя папки, а не имя файла. Существует две версии функции basename(): версия GNU и версия POSIX.

Версия GNU использует const и не изменяет аргумент.

Эта функция переопределяется версией XPG (POSIX), если включен libgen.h.

Эта функция может изменить аргумент, удалив завершающие байты '/'. В этом случае результат может отличаться от версии GNU:

вернет строку "bar", если вы используете версию XPG, и пустую строку, если вы используете версию GNU.

    имя_базы (3) — man-страницы Linux
      Функция: char * basename (const char *filename), поиск токенов в строке.

    вызов: wchar_t * fileName = getFileNameFromPath < wchar_t>( filePath );

    Добро пожаловать в Stack Overflow! Обратите внимание, что этот вопрос был отмечен тегом c, а ваш ответ на c++..

    Вы можете заменить косую черту обратной косой чертой и использовать этот код:

    @Николай Хилюк предлагает лучшее решение, кроме.

    1) Вернитесь к использованию char *, нет абсолютно никаких причин для использования const.

    2) Этот код не является переносимым и, вероятно, не будет работать ни в одной системе POSIX, где / не является разделителем файловой системы, в зависимости от реализации компилятора. Для некоторых компиляторов Windows вы можете захотеть проверить '\' вместо '/'. Вы даже можете протестировать систему и установить разделитель на основе результатов.

    Имя функции длинное, но описательное, проблем нет.Невозможно быть уверенным, что функция вернет имя файла, вы можете быть уверены только в том, что функция написана правильно, чего вы и добились. Хотя, если кто-то использует его в строке, которая не является путем, очевидно, что он потерпит неудачу. Я бы, вероятно, назвал его базовым именем, так как это сообщит многим программистам, какова его цель. Это просто мое предпочтение, хотя, исходя из моих предубеждений, ваше имя подходит. Что касается длины строки, которую будет обрабатывать эта функция, и почему кто-то подумал, что это будет точкой? Вы вряд ли будете иметь дело с именем пути, более длинным, чем то, что эта функция может обработать на компиляторе ANSI C. Поскольку size_t определяется как беззнаковое длинное целое число в диапазоне от 0 до 4 294 967 295.

    Я проверил вашу функцию следующим образом.

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

    Мне не нравится решение strstr(), так как оно потерпит неудачу, если имя файла совпадает с именем каталога в пути, и да, это может происходить и происходит, особенно в системе POSIX, где исполняемые файлы часто не имеют расширения, по крайней мере, в первый раз, что будет означать, что вам нужно выполнить несколько тестов, а поиск разделителя с помощью strstr() еще более громоздкий, поскольку нет способа узнать, сколько может быть разделителей. Если вам интересно, зачем человеку нужно базовое имя исполняемого файла, подумайте о busybox, egrep, fgrep и т. д.

    strrchar() было бы громоздко реализовать, так как он ищет символы, а не строки, поэтому я не нахожу его таким жизнеспособным или кратким, как это решение. Я исправлен Радом Лексусом, это не будет насколько громоздким, как я думал, поскольку strrchar() имеет побочный эффект возврата индекса строки за пределами найденного символа.

    Мы хотим получить имя файла по этому пути, например, «data.csv» и «data» (с расширением или без него).

    Давайте посмотрим, как это сделать

    Получить имя файла с помощью библиотеки файловой системы Boost и C++17

    И Boost, и C++17 FileSystem Library предоставляют похожий API в разных пространствах имен.

    Давайте посмотрим, как это сделать

    Создать объект Path из заданной строки, т.е.

    Затем проверьте, есть ли у данного пути основа, и если да, то получите эту основу.

    здесь ствол представляет собой имя файла с расширением.

    Чтобы получить имя файла без расширения, используйте функцию filename() по пути, т.е.

    Оформить заказ можно следующим образом:

    Чтобы использовать описанную выше функцию с библиотекой файловой системы Boost, используйте следующий заголовочный файл и пространство имен,

    Чтобы использовать описанную выше функцию с библиотекой файловой системы C++17, используйте следующий заголовочный файл и пространство имен,

    Полный пример исполняемого файла с использованием Boost выглядит следующим образом

    Вывод:

    Чтобы скомпилировать приведенный выше код в Linux с помощью библиотеки файловой системы Boost, используйте следующую команду:

    Чтобы скомпилировать приведенный выше код на C++17, измените файл заголовка и пространство имен, как указано выше, и используйте следующую команду:

    Получить имя файла с помощью функций C++ std::string


    Вывод:

    Хотите лучше изучить современный C++?

    Мы составили список лучших курсов C++, которые научат вас передовому современному C++ с самого начала до продвинутого уровня. Он также познакомит вас со словом Smart Pointers, семантикой перемещения, значением R, лямбда-функцией, авто, шаблоном Variadic, циклами на основе диапазона, многопоточностью и многими другими новейшими функциями C++, т.е. от C++11 до C++. 20.

    Ознакомьтесь с подробными обзорами лучших современных курсов C++

    Помните, что C++ требует большого терпения, настойчивости и практики. Итак, начните учиться сегодня.

    Похожие записи

    Удалить последние N символов из строки в C++

    Удалить первые N символов из строки в C++

    Удалить все в строке перед символом — C++

    Удалить в строке все после символа — C++

    Удалить символ из строки по индексу в C++

    Удалить символы новой строки из строки в C++

    Как удалить символ из строки в C++

    Удалить пробелы из строки в C++

    Удалить последний символ из строки в C++

    Удалить первый символ из строки в C++

    Преобразование символа в нижний регистр в C++

    Преобразование символа в верхний регистр в C++

    Преобразование char в int в C++

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

    Проверить, является ли строка палиндромом в C++

    Проверить, является ли строка пустой в C++

    Преобразовать Long в String в C++ | (3 способа)

    Преобразование числа double в строку в C++ (3 способа)

    Преобразование числа с плавающей запятой в строку в C++ (3 способа)

    C++ — проверка, содержит ли строка символ

    Оставить комментарий Отменить ответ

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

    Реклама

    Реклама

    Последние сообщения

    C++11 — умные указатели

    C++11 — лямбда-выражения

    C++11 — неупорядоченные наборы

    C++11 — неупорядоченная карта

    C++11 — Список инициализаторов

    C++11 — std::array

    C++11 — Утилиты

    C++11 — потоки

    C++11 — файловые системы

    C++11 — ссылки Rvalue

    Что-то ищу

    Учебники по C++/C++11

    Условия использования

    Условия и политика

    Учебники по Python

    Избранные сайты

    Отказ от ответственности

    Условия и политика

    Авторское право © 2022 thisPointer

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

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

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

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

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

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

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

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

    Ниже представлен модуль с функциями, которые демонстрируют, как анализировать путь к файлу, имя файла и расширение файла из пути с помощью C++.

    <р>1. Получить путь к файлу

    Пример ниже демонстрирует использование ‘Utils::getFilePath’ для синтаксического анализа и получения пути к файлу из пути.

    <р>2. Получить имя файла

    Пример ниже демонстрирует использование ‘Utils::getFileName‘ для синтаксического анализа и получения имени файла из пути.

    <р>3. Получить расширение имени файла

    Пример ниже демонстрирует использование Utils::getFileExtension для синтаксического анализа и получения расширения файла из пути.

    <р>4. Пространство имен Utils

    Ниже показано пространство имен Utils. Включите это в свой проект, чтобы начать использовать!

    auto fileName = fileNameStart == std :: string :: npos ? путь: путь. substr (fileNameStart + 1);

    <р>5. Другие примеры

    Ниже приведены дополнительные примеры, демонстрирующие использование пространства имен «Utils». Не забудьте включить модуль при запуске примеров!

    КРАТКИЕ ПРИМЕЧАНИЯ.
    Выделенные строки представляют собой разделы, на которые стоит обратить внимание.

    Код сильно прокомментирован, поэтому дополнительные сведения не требуются. Если у вас есть какие-либо вопросы, не стесняйтесь оставлять комментарии ниже.

    Связанные

    Оставить ответ Отменить ответ

    Поиск

    Перевести страницу

    Скомпилируйте свой код сейчас

    Календарь

    март 2022 г.
    S M T W T П В
    12345
    6< /td>789101112
    13141516171819
    20212223< /td>242526
    2728 293031

    Популярные страницы

    Привет, я инженер-программист. В свободное время я пишу статьи о программировании и дизайне.

    Если я помог вам, посетите одного из наших рекламодателей или угостите меня кофе. Спасибо за поддержку!

    В этом руководстве мы покажем вам, как получить имя файла из пути в Excel. Мы расскажем, как это сделать с VBA и без него.

    Путь к файлу и имя файла

    Путь к файлу — это строковый идентификатор, указывающий уникальное расположение в файловой системе. Он содержит папки в иерархическом порядке, за которым следует имя файла. Каждый элемент отделяется разделителем, который обычно представляет собой обратную косую черту «\». Цель получения имени файла из пути — проанализировать это имя файла после последнего разделителя.

    Предупреждение. Если ваши пути содержат другой разделитель, обновите формулы, заменив обратную косую черту ("\") символом-разделителем, подходящим для вашего случая.

    Мы покажем вам четыре различных подхода к получению имени файла из пути в Excel.

    Консервативный метод

    Наш первый подход заключается в использовании хорошо известных функций Excel MIN, SUBSTITUE и LEN для получения имени файла. Вы можете использовать эту формулу в любой версии Excel.

    Эта формула состоит из нескольких шагов:

    1. Во внутреннем разделе все разделители ("\") заменяются пустыми строками.
    2. Формула вычитает длину замененного пути (1) из исходного пути, чтобы найти количество разделителей.
    3. Внешняя функция ПОДСТАВИТЬ заменяет последний разделитель ("\") на "*". Очевидно, что экземпляр последнего разделителя равен количеству разделителей (2).
    4. Наконец, функция НАЙТИ находит символ "*", а функция MID анализирует имя файла после символа.

    VBA с FileSystemObject

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

    Код очень короткий. Он использует метод GetFileName объекта FileSystemObject. Важным разделом кода является инициализация объекта. Следующий код устанавливает объект FileSystemObject в переменную fso.

    Установите fso = CreateObject("Scripting.FileSystemObject")

    После инициализации объекта используйте метод GetFileName, указав путь.

    GetFileNameFromPath_FSO = fso.GetFileName("C:\Excel Files\Dashboards.xlsm")

    Строка выше возвращает строку "Dashboard.xlsm". Вот версия функции, которую вы также можете использовать в своих рабочих листах.

    Функция GetFileNameFromPath_FSO(ByVal Path As String) As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    GetFileNameFromPath_FSO = fso.GetFileName(Path)
    Завершить функцию< /эм>

    VBA с рекурсивной функцией

    Рекурсивная функция — это функция, которая вызывает сама себя. Рекурсивный подход действует как итерация и помогает нам анализировать значения, начиная с конца строки. Вы могли использовать рекурсивные функции только в VBA, пока функция LAMBDA не была выпущена. Поскольку у большинства пользователей Excel нет доступа к функции LAMBDA, мы покажем вам версию VBA, которую может использовать любой пользователь Excel.

    Эта функция также имеет всего несколько строк. Функция называется GetFilenameFromPath_Recursive и принимает единственный аргумент с именем Path.

    Первая строка — это логическая проверка, которая проверяет, является ли последний символ в аргументе обратной косой чертой ("\") или нет, и не является ли аргумент пустой строкой. Если тест пройден, функция возвращает себя с аргументом без его последнего символа и последнего символа пути. Здесь происходит рекурсия.

    Функция запускается до тех пор, пока не появится обратная косая черта ("\") или не останется ни одного символа. Он анализирует символы с правой стороны и объединяет их при каждом запуске.

    Последняя строка содержит стандартный оператор End If, который определяет, где заканчивается блок If.

    Функция GetFilenameFromPath_Recursive(ByVal Path As String) As String
    If Right$(Path, 1) <> "\" And Len(Path) > 0 Then
    GetFilenameFromPath_Recursive = GetFilenameFromPath_Recursive(Left $(Path, Len(Path) - 1)) & Right$(Path, 1)
    End If
    End Function

    Использование LAMBDA для получения имени файла из пути

    Если вы являетесь подписчиком Microsoft 365, вы можете создавать рекурсивные функции без использования VBA. Вкратце, функция LAMBDA — это специальная функция, которая преобразует именованные диапазоны в определяемые пользователем функции. Его синтаксис позволяет вам определять аргументы и пользовательскую формулу, которая использует эти определенные аргументы.

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

    Синтаксис Пример формулы Пример результата
    =LAMBDA(x, y, x*y) =MyLambda(2,3) 6

    Если вы вызовете именованный диапазон "MyLambda" в функции "MyLambda", вы создадите рекурсивную функцию. Та же логика может быть применена к функции VBA в предыдущем разделе.

    Ниже приведена LAMBDA-версия нашего кода VBA. Имя функции — GetFileNameFromPath_Lambda. Посмотрите, как функция вызывает себя после логической проверки функции ЕСЛИ.

    Использование функции LAMBDA с другим подходом

    В качестве альтернативы вы можете использовать функцию LAMBDA без вызова "имени функции". Определение может показаться сложным, поскольку вы должны вызывать функцию в функции по ее имени. Эта структура требует, чтобы вы обновляли каждое вхождение имени при каждом изменении имени функции.

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

    Если вы определяете имя функции LAMBDA в формуле, вы можете снова и снова использовать имя в формуле, чтобы сделать функцию рекурсивной. В нашем примере мы создаем имя «Func» в формуле и вызываем его внутри себя. Внешняя функция LAMBDA состоит в том, чтобы дать любое имя, которое мы хотим, "GetFileNameFromPath_LambdaMe".

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