programing:linux-programing:file-splitpath-parse
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
programing:linux-programing:file-splitpath-parse [2020/06/28 07:55] – yoko | programing:linux-programing:file-splitpath-parse [2020/07/01 10:48] (現在) – [コンパイル実行] yoko | ||
---|---|---|---|
行 3: | 行 3: | ||
Linuxでパス文字列からディレクトリ名やファイル名を分割取得するのに、各要素を解析取得する関数を作ったので備忘録を残す。 | Linuxでパス文字列からディレクトリ名やファイル名を分割取得するのに、各要素を解析取得する関数を作ったので備忘録を残す。 | ||
- | 背景 | + | 概要 |
---- | ---- | ||
Windowsでは、ファイルパスを分割するのに VC++では `_splitpath()`, | Windowsでは、ファイルパスを分割するのに VC++では `_splitpath()`, | ||
- | Linuxではディレクトリ名やファイル名を取得する `dirname()` や `basename()` 関数が使えるが、所望する答えが得られなかったり、引数のパス領域が書き換えられたりする。そこで、文字列からファイル名要素を抽出する関数を作った。 | + | Linuxではディレクトリ名やファイル名を取得する `dirname()` や `basename()` 関数が使えるが、どうも所望の結果が得られなかったり、引数のパス領域が書き換えられたりする。そこで、文字列からファイル名要素を抽出する関数を作成。 |
+ | |||
+ | この関数の特徴は、入力した文字列を解析して各要素の開始ポインタ位置を戻す。又、戻り値でどの要素が存在してるかを知ることができる。入力した文字列は参照のみで非破壊なので、不要なコピー領域をmallocなどで確保しておかなくても必要な要素のみを抽出できる。 | ||
ファイル要素解析関数 | ファイル要素解析関数 | ||
行 16: | 行 18: | ||
* @file | * @file | ||
* @brief | * @brief | ||
- | * @date | + | * @author T.Yokobayashi de JR4QPV |
+ | * @date | ||
*/ | */ | ||
#ifndef ___PARSEPATH_H__ | #ifndef ___PARSEPATH_H__ | ||
行 26: | 行 29: | ||
# | # | ||
# | # | ||
- | #define FLG_DIRECTORY | + | #define FLG_DIRNAME |
# | # | ||
# | # | ||
行 49: | 行 52: | ||
* History | * History | ||
* ------- | * ------- | ||
- | * - 2020/06/26 Created a sample code by JR4QPV. | + | * - 2020/06/28 New created |
*/ | */ | ||
</ | </ | ||
行 58: | 行 61: | ||
* @file | * @file | ||
* @brief | * @brief | ||
- | * @date 2020/06/26 | + | * @author T.Yokobayashi de JR4QPV |
+ | * @date 2020/07/01 | ||
*/ | */ | ||
行 72: | 行 76: | ||
* @param | * @param | ||
* @return 解析結果 =0: | * @return 解析結果 =0: | ||
- | | + | |
+ | | ||
* @details | * @details | ||
| | ||
行 79: | 行 84: | ||
| | ||
| | ||
- | | + | |
| | ||
| | ||
| | ||
+ | * | ||
+ | * @note | ||
+ | | ||
* @attention | * @attention | ||
- | | + | |
| | ||
*/ | */ | ||
行 102: | 行 110: | ||
/* ディレクトリ名の有無チェック */ | /* ディレクトリ名の有無チェック */ | ||
if ((p = strrchr(path, | if ((p = strrchr(path, | ||
- | /* dir要素あり */ | + | /* dirname要素あり */ |
bname = p+1; | bname = p+1; | ||
- | flg |= FLG_DIRECTORY; | + | flg |= FLG_DIRNAME; |
/* 絶対パス名かチェック */ | /* 絶対パス名かチェック */ | ||
if (dname[0] == '/' | if (dname[0] == '/' | ||
flg |= FLG_ABSPATH; | flg |= FLG_ABSPATH; | ||
+ | } | ||
+ | else if ((strcmp(dname, | ||
+ | /* dirname要素あり */ | ||
+ | n = strlen(dname); | ||
+ | bname = & | ||
+ | flg |= FLG_DIRNAME; | ||
} | } | ||
行 152: | 行 166: | ||
* History | * History | ||
* ------- | * ------- | ||
- | * - 2020/06/26 Created a sample code by JR4QPV. | + | * - 2020/06/28 New created |
*/ | */ | ||
</ | </ | ||
- | |||
- | 本関数の特徴は、入力した文字列を解析して、各要素の開始ポインタ位置を戻す。又、戻り値でどの要素が存在してるかを知ることができる。又、入力した文字列は参照のみで非破壊なので、不要なコピー領域をmallocなどで確保しておかなくても必要な要素のみを抽出できる。 | ||
使い方 | 使い方 | ||
行 176: | 行 188: | ||
int flg; | int flg; | ||
| | ||
+ | if (argc > 1) | ||
+ | inpath = argv[1]; | ||
+ | |||
flg = _parsepath(inpath, | flg = _parsepath(inpath, | ||
- | if (flg & FLG_DIRECTORY) { | + | if (flg & FLG_DIRNAME) { |
int n = bname - dname; | int n = bname - dname; | ||
strncpy(dir, | strncpy(dir, | ||
dir[n] = ' | dir[n] = ' | ||
} | } | ||
- | else { / | + | else { / |
strcpy(dir, "" | strcpy(dir, "" | ||
} | } | ||
| | ||
- | if (flg & FLG_BASENAME) { /* base要素あり ? */ | + | if (flg & FLG_BASENAME) { /* basename要素あり ? */ |
strcpy(base, | strcpy(base, | ||
} | } | ||
- | else { / | + | else { / |
strcpy(base, | strcpy(base, | ||
} | } | ||
行 207: | 行 222: | ||
$ ./sample | $ ./sample | ||
dir=/ | dir=/ | ||
+ | |||
+ | $ ./sample / | ||
+ | dir=/aaa/, base=bbb.ccc | ||
</ | </ | ||
+ | |||
+ | * カレントディレクトリのプログラムファイルを実行するには、「./ | ||
+ | |||
+ | |||
+ | |||
+ | GitHubから入手 | ||
+ | ------------ | ||
+ | 上記のソースファイルを「[[https:// | ||
+ | |||
+ | <code bash> | ||
+ | $ git clone https:// | ||
+ | </ | ||
+ | |||
+ | 関連記事 | ||
+ | ------- | ||
+ | |||
+ | - [[myblog> | ||
+ | |||
参考 | 参考 |
programing/linux-programing/file-splitpath-parse.1593298531.txt.gz · 最終更新: 2020/06/28 07:55 by yoko