C ++ найти файл на LD_LIBRARY_PATH

В C/C ++ Существует ли существующий способ проверить, находится ли конкретный файл на определенном пути? Я предполагаю, что синтаксис, который может выглядеть как stat (), но с дополнительными parms для имени файла и пути.

pathstat( struct stat stResult, const char* filename, const char* path );
1
nl ja de
@LightnessRacesinOrbit Это обычное место для «C или C ++», используемое не программистами, которые не знают, что || средства и подбираются программистами, потому что их легче набирать.
добавлено автор Wes Miller, источник
+1 @DevSolar. Хорошо аргументирован и заявлен. Я могу, конечно, написать свое. Я просто хотел избежать дублирования усилий. Благодарю.
добавлено автор Wes Miller, источник
Что такое "C/C ++"?
добавлено автор Lightness Races in Orbit, источник
@WesMiller: Понятно. Итак, какой из них вы используете на самом деле ? Или вы действительно ищете функцию POSIX?
добавлено автор Lightness Races in Orbit, источник
Возможно, в одной из многих библиотек функций, доступных для C ++, может быть путь. Поскольку диапазон этих библиотек обширен, зависит от платформы и очень зависит от ваших требований, нет способа ответить на ваш вопрос. Я могу рассказать вам, как это сделать в Boost, и вы говорите мне, что существует политика компании против этого. Я могу рассказать вам, как это сделать в Qt, и вы скажете мне, что делаете GTK. Это красота и проклятие C ++: сам «стандарт» очень мало, но ваш выбор в доступном стороннем коде близок к бесконечности.
добавлено автор DevSolar, источник

1 ответы

с помощью функции access() с флагом F_OK будет проверяться, существует ли ваш файл. но перед этим вам нужно подготовить путь к файлу (из имя_файла и путь ) перед тем, как передать путь к файлу в качестве входного аргумента в функции access() .

В этом ответе я предполагаю, что вы используете Linux как платформу

void pathstat( struct stat stResult, const char* filename, const char* path )
    char *file;
    int path_len;

    if (!filename) {
       //set error in the stResult
        return;
    }

    path_len = path ? strlen(path) : 0;

    file = malloc((strlen(filename) + path_len + 2) * sizeof(char));
   //PREPARE THE FILE PATH
    if (path && path[0] && path[path_len-1]=='/')
        sprintf(file,"%s%s",path,filename);
    else if (path && path[0])
        sprintf(file,"%s/%s",path,filename);
    else
        file = strcpy(file,filename);

    //NOW CHECK IF THE FILE PATH EXIST WITH ACCESS
    if (access(file, F_OK) != -1) {
        //file exist
    } else {
       //file does not exxit
    }
    free(file);
}
1
добавлено
для буфера по потоку. вы правы, я должен заменить его malloc вместо
добавлено автор MOHAMED, источник
для пути "предполагается:« выделенный путь »: я никогда не видел : как разделитель для пути к Linux или окнам. этот wierd разделитель пути I knwo для обеих платформ / и ``
добавлено автор MOHAMED, источник
для использования access , чтобы проверить, существует ли файл. См. Справочную страницу доступа. в человеке, который они говорят: "или тест существования, F_OK." manpagez.com/man/2/access
добавлено автор MOHAMED, источник
Позаботьтесь, чтобы дать какое-то объяснение с вашим ответом?
добавлено автор Lightness Races in Orbit, источник
Я знаю, что это всего лишь пример кода, но мне не нравится видеть С.О. ответы, которые содержат потенциальные проблемы с переполнением буфера, потому что люди часто копируют и вставляют и используют этот код как есть. Более того, предполагается, что const char * путь представляет собой : -сепарализованный путь, поэтому вам нужно проанализировать его в своих компонентах, а не просто конкатенировать filename к нему. Наконец, почти никогда не следует использовать системный вызов access() . Его функция заключается в проверке разрешений с использованием реальных учетных данных вместо эффективных учетных данных, что почти никогда не является тем, что вы хотите. Вместо этого используйте stat , который требуется OP.
добавлено автор Celada, источник
@MohamedKALLEL загляните в заголовок вопроса. Речь идет о $ LD_LIBRARY_PATH , который, например $ PATH , : -separated. Что касается access , не имеет значения, какой режим ( F_OK или другой) вы передаете, он по-прежнему заменяет реальные учетные данные для эффективных, что не то, что вы хотите , stat работает так же хорошо, как и тест существования, не имеет функции «нежелательной замены» нежелательной учетной записи и, очевидно, что ОП задал: struct stat упоминается в вопросе ,
добавлено автор Celada, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest