C言語関係掲示板

過去ログ

No.400.ディレクトリとファイル名を分けて取得

[戻る] [ホームページ]
No.2768

ディレクトリとファイル名を分けて取得
投稿者---みの(2002/09/24 01:24:33)


フルパスで設定されている変数から、ディレクトリとファイル名を分けて
取得したいのですがどうすればよいのですか。

main()
{
char info[]="/aaa/bbb/ccc/ddd/dummy.txt" ;
char driname[64] ;
char filename[64] ;

dirname に"/aaa/bbb/ccc/ddd"を格納
  filenameに"dummy.txt"を格納
}

No.2771

Re:ディレクトリとファイル名を分けて取得
投稿者---kamadoma(2002/09/24 22:20:34)


>フルパスで設定されている変数から、ディレクトリとファイル名を分けて
>取得したいのですがどうすればよいのですか。
>
>main()
>{
> char info[]="/aaa/bbb/ccc/ddd/dummy.txt" ;
> char driname[64] ;
> char filename[64] ;
>
> dirname に"/aaa/bbb/ccc/ddd"を格納
>  filenameに"dummy.txt"を格納
>}



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

int main(void)
{
        char info[]="/aaa/bbb/ccc/ddd/dummy.txt" ;
        char dirname[64] ;
        char filename[64] ;
        char *p;
        int len;

        /*先頭アドレス取得*/
        p = info;

        /*配列infoの長さを求める*/
        len = strlen(p);

        /*ポインタを\0まで進める*/
        p = p + len ;

        /*  '/'に出会うまで後方検索を行う*/
        while(*p != '/'){
                /*ポインタを戻す*/
                p--;
        }

        /*最後の'/'に\0を入れることで、ディレクトリ名とファイル名を分解する*/
        *p = '\0';

        /*ファイル名取得*/
        strcpy(filename,p+1);
        printf("filename = %s\n",filename);

        /*先頭アドレスに戻しておく*/
        p = info;

        strcpy(dirname,p);
        printf("dirname = %s\n",dirname);

        return 0;
}





        



No.2773

Re:ディレクトリとファイル名を分けて取得
投稿者---kamadoma(2002/09/24 22:37:34)


>フルパスで設定されている変数から、ディレクトリとファイル名を分けて
>取得したいのですがどうすればよいのですか。
>
>main()
>{
> char info[]="/aaa/bbb/ccc/ddd/dummy.txt" ;
> char driname[64] ;
> char filename[64] ;
>
> dirname に"/aaa/bbb/ccc/ddd"を格納
>  filenameに"dummy.txt"を格納
>}



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

void getDirFname(char *,char *,char *);

int main(void)
{
        char info[]="/aaa/bbb/ccc/ddd/dummy.txt" ;
        char dirname[64] ;
        char filename[64] ;


        /*関数コール*/
        getDirFname(info,dirname,filename);

        printf("filename = %s\n",filename);
        printf("dirname = %s\n",dirname);       

        return 0;
}

void getDirFname(char *p_info,char *p_dirname,char *p_filename)
{
        char *p;
        int len;

        /*先頭アドレス取得*/
        p = p_info;

        /*配列infoの長さを求める*/
        len = strlen(p);

        /*ポインタを\0まで進める*/
        p = p + len ;

        /*  '/'に出会うまで後方検索を行う*/
        while(*p != '/'){
                /*ポインタを戻す*/
                p--;
        }

        /*最後の'/'に\0を入れることで、ディレクトリ名とファイル名を分解する*/
        *p = '\0';


        /*ファイル名取得*/
        strcpy(p_filename,p+1);
        
        /*先頭アドレスに戻しておく*/
        p = p_info;

        /*ディレクトリ名取得*/
        strcpy(p_dirname,p);
}




        



No.2775

Re:ディレクトリとファイル名を分けて取得
投稿者---FritiCam(2002/09/25 04:45:01)


おはようございます。
こんな感じにも書けます。

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

void get_dirpath_filename(const char*, char*, char*);

int main(void)
{
	char filepath[] = "/aaa/bbb/ccc/ddd/dummy.txt";
	char dirpath[64] = { '\0' }, filename[64] = { '\0' };

	get_dirpath_filename(filepath, dirpath, filename);

	printf("Source: \"%s\"\n", filepath);
	printf("Directory-path: \"%s\"\n", dirpath);
	printf("Filename: \"%s\"\n", filename);

	return 0;
}

/*
 * 機能:src からディレクトリとファイルネームを取得し、それぞれを格納する
 * 補足:取得を失敗した('/'がなかった)ときは何もしない
*/
void get_dirpath_filename(const char *src, char *dirpath, char *filename)
{
	const char *divide = src;		/* divide = 区切る. 結果的には src の最後尾にある '/' のアドレスを格納させる */

	divide += strlen(src);		/* src の終端のアドレスを代入 */
	while (src != --divide)		/* src の先頭まで '/' を検索する */
		if (*divide == '/')
			break;

	if (src != divide) {		/* '/' が見つかった場合は、directory-path, filename の取得 */
		strncpy(dirpath, src, divide - src);
		*(dirpath + (divide - src)) = '\0';
		strcpy(filename, divide + 1);
	}
}


No.2777

Re:ディレクトリとファイル名を分けて取得
投稿者---shelly(2002/09/25 15:49:28)


これだと、"/aaa.txt"みたいなファイル名の時にダメじゃないですか?

ところでこのときはdirnameには"/"が入って欲しいんでしょうか?
何も入って欲しくないんでしょうか?>みのさん


No.2778

Re:ディレクトリとファイル名を分けて取得
投稿者---FritiCam(2002/09/25 17:03:53)


気付きませんでした。
if (src != divide) の部分を if (*src == '/' || src != divide) と訂正しておきます。
shellyさん、ご指摘ありがとうございました。

>ところでこのときはdirnameには"/"が入って欲しいんでしょうか?
>何も入って欲しくないんでしょうか?>みのさん
No.2768から入って欲しくないのでしょう。

No.2805

Re:ディレクトリとファイル名を分けて取得
投稿者---みの(2002/09/29 12:04:14)


返事が遅れて申し訳ありません。
皆様方アドバイスありがとうございます。

ファイル名の前には「/」は入ってほしくないです。


No.2839

Re:ディレクトリとファイル名を分けて取得
投稿者---かずま(2002/10/03 19:09:29)


> フルパスで設定されている変数から、ディレクトリとファイル名を分けて
> 取得したいのですがどうすればよいのですか。

strrchr を使うのが、よいでしょう。
#include <stdio.h>
#include <string.h>

void dir_file(const char *path, char *dir, char *file)
{
    const char *p = strrchr(path, '/');

    if (p == NULL) {        /* '/' がない */
        *dir = '\0';
        strcpy(file, path);
    }
    else if (p == path) {   /* '/' が先頭だけ */
        strcpy(dir, "/");
        strcpy(file, p + 1);
    }
    else {                  /* '/' が見つかった */
        memcpy(dir, path, p - path); dir[p - path] = '\0';
        strcpy(file, p + 1);
    }
}

int main()
{
    static char *info[] = {
        "/aaa/bbb/ccc/ddd/dummy.txt",
        "dummy.txt",
        "/dummy.txt",
        "/aaa/bbb/ccc/ddd/",
    };
    char dirname[64];
    char filename[64];
    int i;

    for (i = 0; i < sizeof info / sizeof *info; i++) {
        dir_file(info[i], dirname, filename);
        printf("info = %s\n  dirname = %s\n  filename = %s\n",
            info[i], dirname, filename);
    }
    return 0;
}