diff --git a/src/main1.c b/src/main1.c new file mode 100644 index 0000000..13d4f35 --- /dev/null +++ b/src/main1.c @@ -0,0 +1,64 @@ +#include +#include // read dir +#include // regular expression +#include + +/* + * 结构体dirent的属性d_name里存储了app的名字 + * 由于c语言没有字符串数组,而且不知道师兄想怎么处理app名,所以我直接存储的数组元素类型是dirent* + * 通过app_list[index]->d_name就可以获取文件名 + */ + +int main() { + // variable declaration for reading directory + DIR* dir = NULL; + int app_max = 50; // c doesn't have dynamic array like "std::vector" in c++, so I set a large size for array + int app_index = 0; + struct dirent* read_result; + struct dirent* app_list[app_max]; + const char* app_path = "/home/wwd/CLionProjects/AndroidTest/data/data"; // test, should be /data/data in android + + // variable declaration for regular expression + regex_t reg; + int err_code; + int compression_flags = REG_EXTENDED | REG_ICASE; + char err_buff[256]; + char* reg_str = "com.android.*"; + + // set regular expression and handle error + if ((err_code = regcomp(®, reg_str, compression_flags)) != 0){ + printf("set regular expression failed:\n"); + regerror(err_code, ®, err_buff, sizeof(err_buff)); + fprintf(stderr, "%s\n", err_buff); + return -1; + } + + // read dir + if ((dir = opendir(app_path)) == NULL){ + printf("open dir failed\n"); + return -1; + } + + // get result using loop + while ((read_result = readdir(dir)) != NULL){ + // filter, ignore current dir + parent dir + com.android.* app + if (strcmp(read_result->d_name, ".") == 0 + || strcmp(read_result->d_name, "..") == 0 + || (err_code = regexec(®, read_result->d_name, 0, NULL, 0)) == 0) + continue; + // d_type = 4 means it's a directory + if (read_result->d_type == 4){ + app_list[app_index] = read_result; + app_index++; + } + } + + // print apps' names + printf("we have %d apps\n", app_index); + for (int i = 0; i < app_index; i++){ + printf("app %d : %s\n", i, app_list[i]->d_name); + } + + regfree(®); + return 0; +}