C言語でrmコマンドを書きたい

■要求定義
– ファイルやフォルダを削除する
– リクルーシブの削除も対応したい

■考えた事
– remove()と_unlink()があるらしい
– remove関数は、厳密には「その名前でのファイルへのアクセスを、再びファイルを生成しない限り、不可能にする」という処理を行なっているらしい

int main(){

	// char *dir = "./newfolder";
	char *dir = "./hoge.txt";
	if(remove(dir) == 0){
		printf("%sの削除が完了しました。\n", dir);
	} else {
		printf("%sの削除に失敗しました。\n", dir);
	}
	return 0;
}

$ ./dev
./hoge.txtの削除が完了しました。

*dirをファイルがあるフォルダに変更するとremoveでは削除できない
$ ./dev
./newfolderの削除に失敗しました。

->ディレクトリ内のファイルを削除してからディレクトリを削除するというステップが必要

■フォルダの中のファイルリスト一覧表示

#include <stdio.h>
#include <dirent.h>

int main(){

	DIR *dir;
	struct dirent *dp;
	char dirpath[] = "./newfolder";

	dir = opendir(dirpath);
	if(dir == NULL) { return 1; }

	dp = readdir(dir);
	while(dp != NULL){
		printf("%s\n", dp->d_name);
		dp = readdir(dir);
	}

	if(dir != NULL) {
		closedir(dir);
	}
	return 0;
}

$ ./dev
.
foo.c
..
hoge.c

これをremove()と組み合わせれば再帰的に削除できるか。

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

int main(){

	DIR *dir;
	char newdir[255] = "./newfolder/";

	char *target = "./newfolder";
	if(remove(target) == 0){
		printf("%sの削除が完了しました。\n", target);
	} else {

		struct dirent *dp;
		dir = opendir(target);
		if(dir == NULL) { return 1; }

		dp = readdir(dir);
		while(dp != NULL){
			// printf("%s\n", dp->d_name);
			strcat(newdir,dp->d_name);
			printf("%s\n", newdir);
			remove(newdir);
			dp = readdir(dir);
		}
		if(dir != NULL) {
			closedir(dir);
		}
		remove(target);
		printf("%sの削除が完了!\n", target);
	}

	
	return 0;
}

$ ./dev
./newfolder/.
./newfolder/.foo.c
./newfolder/.foo.c..
./newfolder/.foo.c..hoge.c
./newfolderの削除が完了!

strcatで文字列連結するのがうまくいってない。何故だろう。