2012-02-08 12 views
3

ファイルパスのみを残してファイルパスのパスを削除するにはどうすればよいですか?パスを削除してファイル名を取得する方法

fts_pathからファイル名のみを抽出し、これをchar * fileNameに格納したいとします。

+4

'basename'についてはどうですか? –

答えて

5

は、POSIXスタイル(/で区切ら)パス名にパスを削除する機能です(MacOS 9やWindowsのような)奇数のパス区切り文字では、可能な複数の区切りを検索するために上記を適合させる必要があります。たとえば、Windowsの場合、/\はパス区切り文字で、それらを組み合わせて使用​​できます。

5

あなたがほしいbasename(3)

+1

'basename'はGNUの議論のために決して触れないでください(デフォルトで意図的にPOSIXに準拠しないようにしています)。 –

+1

実際、私はそれに触れないようもっと良い理由を忘れてしまいました。POSIXバージョンの 'basename'は入力を壊す可能性があります。つまり、あなたのパス名を一時的にコピーせずに安全に呼び出すことはできません。 'basename'の結果を使用するまで、安全にフリーズや変更ができません。また、 'basename'は静的ストレージを使用することもできます。つまり、マルチスレッドプログラムでは安全でない可能性があります。 –

+0

そのおかげで... – jarryd

1

私は確かにこれを行うラウンドアバウトの方法はありませんが、あなたはいつもファイルパス(私はそれがchar配列として格納されていると思いますか?)を検索し、最後の '\'の位置を取得し、その前にすべてを消去してください。

編集:Rのコメントを参照してください。

+0

これは、プログラムがWindows上で実行されていると仮定します。もっと無知なアプローチは単に 'basename()'を使うことです。 –

+0

これは実際には唯一の正しい解決策ですが、 '/'(Windowsではパス区切りでもあります)をサポートし、他のすべてのシステムでパスセパレータとして '\'を無視する必要があります。 –

+0

#ifdef _windows などが動作しますか? – user1193108

3
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <libgen.h> 

int main(void) 
{ 
    char * path = "/homes/mk08/Desktop/lala.c"; 
    char * tmp = strdup(path); 

    if(tmp) { 
     printf("%s\n", basename(tmp)); 
     free(tmp); 
    } 

    return EXIT_SUCCESS; 
} 

この意志出力:

char *base_name(const char *pathname) 
{ 
    char *lastsep = strrchr(pathname, '/'); 
    return lastsep ? lastsep+1 : pathname; 
} 

あなたがレガシーシステムをサポートする必要がある場合:ここで

lala.c 
+3

実際には、このプログラムは文字列リテラルを変更して未定義の動作を呼び出します。 per POSIX、* basename()関数は、pathが指す文字列を変更し、静的記憶域へのポインタを返すことがあります。その後basename()への呼び出しによって上書きされます。* –

+0

これは本当です。 –

関連する問題