新石器Wiki

近年はシリコン(石)から進化した便利なもので溢れる時代。そんな気になった事や試した事など記す。

ユーザ用ツール

サイト用ツール


programing:linux-programing:file-splitpath-parse


差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
programing:linux-programing:file-splitpath-parse [2020/06/28 16:31] – [背景] yokoprograming:linux-programing:file-splitpath-parse [2020/07/01 10:48] (現在) – [コンパイル実行] yoko
行 6: 行 6:
 ---- ----
 Windowsでは、ファイルパスを分割するのに VC++では `_splitpath()`, Borland C++では `splitpath()` などの便利な関数が用意されている。   Windowsでは、ファイルパスを分割するのに VC++では `_splitpath()`, Borland C++では `splitpath()` などの便利な関数が用意されている。  
-Linuxではディレクトリ名やファイル名を取得する `dirname()` や `basename()` 関数が使えるが、所望する結果が得られなかったり、引数のパス領域が書き換えられたりする。そこで、文字列からファイル名要素を抽出する関数を作た。+Linuxではディレクトリ名やファイル名を取得する `dirname()` や `basename()` 関数が使えるが、どうも所望結果が得られなかったり、引数のパス領域が書き換えられたりする。そこで、文字列からファイル名要素を抽出する関数を作成。 
 + 
 +この関数の特徴は、入力し文字列を解析して各要素の開始ポインタ位置を戻す。又、戻り値でどの要素が存在してるかを知ることができる。入力した文字列は参照のみで非破壊なので、不要なコピー領域をmallocなどで確保しておかなくても必要な要素のみを抽出できる
  
 ファイル要素解析関数 ファイル要素解析関数
行 60: 行 62:
  * @brief  Parse a file elements from a string.  * @brief  Parse a file elements from a string.
  * @author T.Yokobayashi de JR4QPV  * @author T.Yokobayashi de JR4QPV
- * @date   2020/06/28+ * @date   2020/07/01
  */  */
  
行 82: 行 84:
     各要素は、解析結果のポインタ位置から抽出する。     各要素は、解析結果のポインタ位置から抽出する。
   - 各要素は以下で抽出できる。\n   - 各要素は以下で抽出できる。\n
-     ディレクトリ名:*dirpos ~ *basepos (最後必ず'/') \n+     ディレクトリ名:*dirpos ~ *basepos (通常は'/'で終わる)\n
      ベース名:      *basepos 以降 \n      ベース名:      *basepos 以降 \n
      ファイル名:    *basepos ~ *extpos \n      ファイル名:    *basepos ~ *extpos \n
      拡張子:        *extpos 以降 ('.'で始まる)      拡張子:        *extpos 以降 ('.'で始まる)
  *  *
 + * @note
 +  - "."と".."はディレクトリ名に判断し、この時は'/'で終わらない。
  * @attention  * @attention
   - マルチバイト文字には非対応。(UTF-8ならたぶん大丈夫)   - マルチバイト文字には非対応。(UTF-8ならたぶん大丈夫)
行 113: 行 117:
  if (dname[0] == '/') /* '/'で始まるか ? */  if (dname[0] == '/') /* '/'で始まるか ? */
  flg |= FLG_ABSPATH;  flg |= FLG_ABSPATH;
 + }
 + else if ((strcmp(dname, ".") == 0) || (strcmp(dname, "..") == 0)) {
 + /* dirname要素あり */
 + n = strlen(dname);
 + bname = &dname[n];
 + flg |= FLG_DIRNAME;
  }  }
  
行 159: 行 169:
  */  */
 </code> </code>
- 
-本関数の特徴は、入力した文字列を解析して、各要素の開始ポインタ位置を戻す。又、戻り値でどの要素が存在してるかを知ることができる。又、入力した文字列は参照のみで非破壊なので、不要なコピー領域をmallocなどで確保しておかなくても必要な要素のみを抽出できる。 
  
 使い方 使い方
行 180: 行 188:
   int flg;   int flg;
      
 +  if (argc > 1)
 +    inpath = argv[1];
 +
   flg = _parsepath(inpath, &dname, &bname, NULL);   flg = _parsepath(inpath, &dname, &bname, NULL);
   if (flg & FLG_DIRNAME) {             /* dirname要素あり ? */   if (flg & FLG_DIRNAME) {             /* dirname要素あり ? */
行 211: 行 222:
 $ ./sample $ ./sample
 dir=/home/user/, base=test.txt dir=/home/user/, base=test.txt
 +
 +$ ./sample /aaa/bbb.ccc
 +dir=/aaa/, base=bbb.ccc
 </code> </code>
 +
 +  * カレントディレクトリのプログラムファイルを実行するには、「./」を付ける必要がある。
 +
  
  
行 221: 行 238:
 $ git clone https://github.com/jr4qpv/parsepath $ git clone https://github.com/jr4qpv/parsepath
 </code> </code>
 +
 +関連記事
 +-------
 +
 +  - [[myblog>2020/06/29/linux-parsepath-splitpath/|【Linuxプログラム】パス文字列からディレクトリ名やファイル名を取得]]
 +
  
 参考 参考
programing/linux-programing/file-splitpath-parse.1593329497.txt.gz · 最終更新: 2020/06/28 16:31 by yoko