最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

Linux必须要学会”获取执行程序的路径”的方法

XAMPP新闻 admin 348浏览 0评论

#所有豪言都收起来,所有的呐喊都咽下去。

 

友情提示:

阅读本文,可收获检测程序的运行路径方法,检测并创建路径的方法。

关注即可收获更丰富的linux实用知识。

实际场景:

很多情况我们需要在程序中创建一个LOG文件,一般情况下都是提前在程序中指定LOG文件的存放地址,但这样的做法会导致我们的路径不能更改,所以就需要在我们的程序运行起来的时候,自动检测我们程序的位置,并在程序的位置检测并自动创建LOG的目录。

 

# 解析命令行

#include <unistd.h>
# 解析命令行参数函数
# argc argv: 直接从main函数传递过来的,optstring:是一个选项字符串,字符后面有:,则该选项有参数。
int getopt(int argc, char *const argv, const char * optstring);

 

# 检查当前路径

#include <unistd.h>
# 检查进程是否可对指定文件执行某种操作
# pathname:需要测试的文件路径,mode:测试的操作模式
int access(const char *pathname, int mode);

 

# 返回当前程序目录

#include <unistd.h>
# 用一个size大小的buffer空间,用来存储当前程序的目录
char *getcwd(char *buffer, size_t size);

 

#  创建目录

#include <>
# 以mode方式创建一个以pathname命名的目录,成功返回0,失败返回1.
int mkdir(cosnt char *pathname, mode_t mode);

 

# 简单demo:

实现命令行解析指定配置文件;获取当前程序路径、创建指定路径;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h> 
#include <time.h>

void pathDetection(char *ProgramPath, int ProgramPathSize, char *logFilePath, int logFilePathSize,char *fileName);
int main(int argc, char *argv[])
{
    char programPath[255] = {0};

    FILE *fp = NULL;

    int mkdir_flag = -1;
    char filePath[256] = {0};
    char logPath[256] = {0};
    char Path[256] = {0};
    char *fileName = "Config.ini";  //配置文件
    //用户指定路径
    char *configPath = NULL;
    int opt = -1;
    char *optstring = "p:l:h";     //命令行
    if (argc < 2)                  //检测命令个数
    {
        printf("argc < 2\n");
        printf("请输入“-h 查看帮助 ”命令\n");
        exit(1);
    }
    while(-1 != (opt = getopt(argc, argv, optstring)))
    {
        switch (opt)
        {
            case 'p':
                {
                    printf("配置文件路径%s\n", optarg);
                    snprintf(Path, sizeof(Path),"%s", optarg);
                    break;
                }
            case 'l':
                {
                    printf("log文件路径%s\n", optarg);
                    snprintf(logPath, sizeof(logPath),"%s", optarg);
                    break;
                }   
            case 'h':
                {
                    printf("请输入'-p 文件路径/配置文件'命令\n");
                    printf("请输入'-l log文件路径'命令\n");
                    exit(1);
                }
            default:
                {
                    printf("请输入-h命令查看提示\n");
                    exit(1);
                }
        }
    }

    if(0 == access(logPath, F_OK))
    {
        printf("文件路径'%s'存在,可在该目录创建config.txt文件\n",logPath);
    }
    else
    {
        printf("文件路径'%s'不存在,准备创建该路径!\n", logPath);
        if(0 == (mkdir_flag = mkdir(logPath, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)))
        {
            printf("创建'%s'文件路径成功!\n",logPath);
        }
        else
        {
            printf("创建'%s'文件路径失败!\n",logPath);
            exit(1);
        }  
    }
    
    time_t timep;     
    char LOGfilePath[255] = {0};
    char name[255] = {0};
    time(&timep);
    int programPathSize = sizeof(programPath);
    int LOGfilePathSize = sizeof(LOGfilePath);
    strftime(name, sizeof(name), "/%Y.%m.%d.txt", localtime(&timep));

    pathDetection(programPath, programPathSize, LOGfilePath, LOGfilePathSize, name);

    fp = fopen(LOGfilePath,"a");
    return 0;
}
/*
** @ProgramPath: 存储程序运行路径数组
** @ProgramPathSize: 
** @logFilePath: 存储LOG文件路径数组
** @logFilePathSize:
** @fileName: 存储文件名称的数组
*/
void pathDetection(char *ProgramPath, int ProgramPathSize, char *logFilePath, int logFilePathSize,char *fileName)
{
    int mkdir_flag = -1;           

    getcwd(ProgramPath,ProgramPathSize); //返回当前工作目录

    snprintf(logFilePath, logFilePathSize, "%s/LOG/" ,ProgramPath); //ProgramPath/LOG/
    if(0 == access(logFilePath, F_OK))
    {
    printf("文件路径‘%s’存在,可在LOGfilePath路径下创建LOG.txt\n", logFilePath);
    }
    else
    {
    printf("文件路径‘%s’不存在,准备创建路径!\n", logFilePath);
    if(0 == (mkdir_flag = mkdir(logFilePath,  S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)))
    {
        printf("创建%s文件路径成功!\n",logFilePath);
    }
    else
    {
        printf("创建‘%s’文件路径失败!\n", logFilePath);
        exit(1);
    }
    }
    memset(logFilePath, 0, logFilePathSize);
    snprintf(logFilePath, logFilePathSize, "%s/LOG/%s", ProgramPath, fileName); //拼接路径与文件名称
}

End 2021/7/27 20:45

坚持最难,但成果也最大!

当你以为为时已晚的时候,恰恰是最早的时候,此时关注即可收获更多Linux开发的干货。

转载请注明:XAMPP中文组官网 » Linux必须要学会”获取执行程序的路径”的方法

您必须 登录 才能发表评论!