练习—‘‘遍历目录实现文件内容的拷贝‘‘

题目一:

        编写一个程序,将当前系统中所有进程的PID、PPID、Name信息记录到record.txt。
注解:文件中/proc目录下,每个纯数字组成的文件夹就是一个进程,也是该进程的PID号。

一、思考过程

💡 初步想法:

打开目录(/proc)
遍历文件→找到纯数字的文件名字
               →进如数字文件的status文件
               →把里面内容分割找到目标内容,进行比对选出需要部分
               →写进文件里

写时遇到的困难:

1.利用循环找纯数字文件时,不管达不达成目标,循环都得跳出。但跳出之后就无法分清哪个是我需要的文件。record.txt后续简称m文件。

-解1:循环都是一样,换for循环也解决不了
-解2: 尝试过想法封装函数,有想法,但是不太会畏惧就放弃了(这个简单,可学)☆
–解3:求助后,通过循环遇见数字cnt++,结束后比较cnt和strlen(文件名)的长度是否一致,判断是否为数字文件

2、字符串比较是否相同用到函数——strcmp(当值为0时表示字符串相同)


💡 更具有条例想法

题目的 目的就是要内容写到文件里,所以先打开文件,找到要写入文件的内容,写进去然后再关掉文件

具体实现如下:

1、在main函数中调用 “函数体主体”,传参传的是要生成的m文件名字

2、“函数体主体” 封装一个函数写要进去的内容,以及在里面调用如何找到要写的内容

3、函数体主函数:

打开m文件
→打开目录文件/proc
→读取目录找到目标目录名,调用函数①
    (读目录时要过滤隐藏文件)
→如果是要的目标,便写进文件里调用函数②
    (fprintf,可以实现多内容输入)
→结束关闭目录关闭文件

①封装一个找纯数字的文件(int型) (传参,传pp->d_name)
         是,返回1
        不是,返回0 

②封装一个函数筛选找到该目标文件符合所要内容,写入m文件的内容(int型)

(传参,传字符数组,name,pid,name)

注意:返回值不能用指针返回,即使返回了指向的地址,函数体结束后,指向的地址内容就被回收了 →所以用strcop复制到形参指针中

二、实现过程

1、/proc文件

2、任意一个数字文件

3、status文件

每个name、pid、ppid位置是固定的

4、想法一:代码实现

- 结果

5、想法2代码实现

-结果


题目二:

        找到并打印指定目录下( /home/linux/Music)下的音视频文件名 (加粗文件名)

        目录下含有的文件:   1.mp3        2.mp4         3.avi         4.rmvb   

        5.flv         6.wma         7.txt         helloworld howare 等...

一、思考实现过程

1、想法:

        沿用题目一的第二种想法,用封装函数实现。

→打开要写入的m文件,‘r’

→打开指定目录,/home/linux/Music

→读取目录并遍历每个目录名

→判断是否是目标目录名(封装两个函数,1逻辑判断是否带“.”,2逻辑判断是否是所需的那六个)

→写入文件

→关闭文件、目录

2、代码实现

该代码实现打印在a.txt文件内

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <errno.h>

int point_file(char *pointname)
{
    int i = 0;
    int len = 0;
    len = strlen(pointname);      //strlen不会改变指针指向

    for (i = len-1; i >= 0; i--)     //容易忽略了i会一直减下去,没设置跳出来的条件
    {
        if ('.' == pointname[i])
        {
            return 1;
        }
    }
    return 0;
}
int compare_name(char *pointname)
{
    char *tmpname = NULL;
    char *aim[] = {".mp3",".mp4",".avi",".rmvb",".flv",".wma"};  
    //aim[6][32] = {...};这样不行,有越界风险
    int i = 0;

    while (*pointname != '.')
    {
        pointname++;
    }
    
    for (i = 0; i < 6; i++)
    {
        if(0 == strcmp(pointname,aim[i]))
        {
            return 1;
        }
    }
    return 0;
}
//优化(下一个代码)
//如果让filename通过指针移动的话,上述两函数就可以写在一起了
//前一个找到点,后一个直接进行比较,而且若目录名不止有一个点的情况,也能找到最后一个

int find_music_filename(char *filename)   //指针的原因:指针指向字符串数组的第一个元素
{
    FILE *fp = NULL;
    DIR *dp = NULL;
    struct dirent *pp = NULL;    //是让其为null空

    fp = fopen(filename,"w");
    if (NULL == fp)
    {
        perror("fail to fopen");
        return -1;
    }

    dp = opendir("/home/linux/Music");    //是dp这个来表示
    if (NULL == dp)
    {
        perror("fail to opendir");
        return -1;
    }

    while (1)
    {
        pp = readdir(dp);
        if (NULL == pp)
        {
            break;
        }

        if ('.' == pp->d_name[0])
        {
            continue;
        }

        if (point_file(pp->d_name))
        {
            if (compare_name(pp->d_name))
            {
                fprintf(fp,"%s\n",pp->d_name);
            }
        }
    }

    fclose(fp);
    closedir(dp);
    
    return 0;
}

int main(void)
{
    find_music_filename("a.txt");
    return 0;
}

该代码实现将文件打印在终端

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <math.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <errno.h>


int is_mediafile(char *pfilename)
{
    char *ptmp = NULL;

    ptmp = pfilename + strlen(pfilename);
    while (ptmp >= pfilename && *ptmp != '.')
    {
        ptmp--;
    }

    if (0 == strcmp(ptmp, ".mp3") || 0 == strcmp(ptmp, ".mp4") || 0 == strcmp(ptmp, ".avi")
        || 0 == strcmp(ptmp, ".rmvb") || 0 == strcmp(ptmp, ".flv") || 0 == strcmp(ptmp, ".wma"))
    {
        return 1;
    }

    return 0;
}

int print_mediafile(char *pmediadir)
{
    DIR *dp = NULL;
    struct dirent *pp = NULL;

    dp = opendir(pmediadir);
    if (NULL == dp)
    {
        perror("fail to opendir");
        return -1;
    }

    while (1)
    {
        pp = readdir(dp);
        if (NULL == pp)
        {
            break;
        }

        if ('.' == pp->d_name[0])
        {
            continue;
        }

        if (is_mediafile(pp->d_name))
        {
            printf("%s\n", pp->d_name);
        }
    }
    
    closedir(dp);

    return 0;
}

int main(void)
{
    print_mediafile("/home/linux/Music");

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值