Simple implementation of the _ splitpath function on windows on the linux platform
During the transplantation, we found that _ splitpath is not available in linux, so we decided to write it by ourselves, which is not difficult.
First, go to the following content:
Declare and define void _ splitpath (const char * path, char * drive, char * dir, char * fname, char * ext); Describe the decomposition path, split your complete path into one, that is, a function parameter table for string segmentation path, Full path (Full path) drive, Optional drive letter, followed by a colon (:) (Disk Drive includes: :) dir, Optional directory path, including trailing slash. forward slashes (/), backslashes (\), or both may be used. (file path, whether it is "/", "\") fname, Base filename (no extension) (File Name) ext, Optional filename extension, including leading period (.) (suffix )----------------------------------------
Split line out, please be careful--------------------------------------------
LinuxImplementationAnd the test code is as follows:
#include <stdio.h>#include <string.h>#ifndef WIN32void _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 WIN32void _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
RunThe result is as follows: