linux 路径分割

(1) 获得当前工作目录的绝对路径

获取当前工作目录是使用函数:getcwd。cwd指的是“current working directory”,这样就好记忆了。
函数说明:
    函数原型:char* getcwd(char* buffer, int len);
    参数:buffer是指将当前工作目录的绝对路径copy到buffer所指的内存空间, len是buffer的长度。
    返回值:获取成功则返回当前工作目录(绝对路径),失败则返回false(即NULL)。 
    该函数所属头文件为<direct.h>

具体使用如下例:(特别注意的是,当你使用的是Linux系统时,请注意你是否具有相关的权限,如果权限不够会导致获取失败)
#include <stdio.h>
#include <direct.h>

int main()
{
	char *buffer;
	//也可以将buffer作为输出参数
	if((buffer = getcwd(NULL, 0)) == NULL)
	{
		perror("getcwd error");
	}
	else
	{
        printf("%s\n", buffer);
		free(buffer);
	}
}

(2)linux下,分解路径

http://www.tuicool.com/articles/INjYrqv
在做移植时, 发现了 _splitpath 在 linux 下是没有的,于是决定自己写下,也不难。
首先 百科 到如下内容:
声明定义
void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );
分解路径,把你的完整路径给分割开来,就是一个对字符串进行分割的函数
path, Full path(完整路径)
drive , Optional drive letter, followed by a colon (:)( 磁盘驱动 包含:)
dir, Optional directory path, including trailing slash. Forward slashes (/ ), backslashes (\ ), or both may be used.(文件路径,无论是以“/”,“\”)
fname, Base filename (no extension)(文件名)
ext , Optional filename extension, including leading period (.)(后缀名)
---------------------------------------- 分割线出没,请小心

Linux 下实现及测试代码如下:

#include <stdio.h>
#include <string.h>

#ifndef WIN32
void _splitpath(const char *path, char *drive, char *dir, char *fname, char *ext);

static void _split_whole_name(const char *whole_name, char *fname, char *ext);
#endif

/* main test */
int main(void)
{
  char *path = "/home/test/dir/f123.txt";
  // char *path = "/home/test/dir/123.txt";
  // char *path = "/home/test/dir/123";
  // char *path = "123";
  // char *path = "123.txt";

  char drive[128];
  char dir[128];
  char fname[128];
  char ext[128];

  _splitpath(path, drive, dir, fname, ext);
  printf("path  = %s\n", path);
  printf("dir   = %s\n", dir);
  printf("fname = %s\n", fname);
  printf("ext   = %s\n", ext);
  
  return 0;
}

#ifndef WIN32
void _splitpath(const char *path, char *drive, char *dir, char *fname, char *ext)
{
  char *p_whole_name;

  drive[0] = '\0';
  if (NULL == path)
  {
    dir[0] = '\0';
    fname[0] = '\0';
    ext[0] = '\0';
    return;
  }

  if ('/' == path[strlen(path)])
  {
    strcpy(dir, path);
    fname[0] = '\0';
    ext[0] = '\0';
    return;
  }

  p_whole_name = rindex(path, '/');
  if (NULL != p_whole_name)
  {
    p_whole_name++;
    _split_whole_name(p_whole_name, fname, ext);

    snprintf(dir, p_whole_name - path, "%s", path);
  }
  else
  {
    _split_whole_name(path, fname, ext);
    dir[0] = '\0';
  }
}

static void _split_whole_name(const char *whole_name, char *fname, char *ext)
{
  char *p_ext;

  p_ext = rindex(whole_name, '.');
  if (NULL != p_ext)
  {
    strcpy(ext, p_ext);
    snprintf(fname, p_ext - whole_name + 1, "%s", whole_name);
  }
  else
  {
    ext[0] = '\0';
    strcpy(fname, whole_name);
  }
}

#endif


Logo

更多推荐