递归遍历指定文件下所有的文件,而且你还可以统计一下普通文件的总个数,既然能统计普通文件,能统计其他文件吗?比如目录文件, 这个是main函数里面我们调用了 ,这个checkdird这个函数,需要传递一个路径,
文件打开的目录,把路径 传进去,传进来以后,我这个路径,调用opendir打开,打开之后返回一个指向目录的一个指针,DIR *pDir
接下来在一个循环里面,循环读取目录项,如果这个不过滤会怎么样?每一个目录下都有它自己,会进入死循环,这个必须过滤掉,接下来进行判断,看一下这个文件是什么类型,如果说是这种目录DT_DIR 应该是递归, 有的人是不是没把这个加上49?如果没加上,他肯定是最多打开一层或者失败,
打开失败那个perror 就是说 没有这个文件或目录,然后拼接好以后,继续让他调自己,这个自己调用自己,在这里我们是直接或间接调用自己呀?在这里是直接调自己, 50这个是函数里面调自己,这个是直接调自己,那么它返回一个n值,n+= 是什么意思?是累加,一直累加,递归是一层一层的压栈,最后一层一层的出栈,递归有些场合不用递归不行,递归又不太提倡用,为什么呢?因为说如果压栈太深,有可能会照成栈溢出,但一般情况下,系统上你的目录 层能有多深呢? 你大概10层 你还能20层100层吗?
如果是普通文件 n++就可以了,n++ 就是在统计普通文件的个数呀?
函数,由这个返回,返回的是普通文件的总个数,记得要关闭这个目录,否则就会照成,我打开很多目录,是不是最后只能关闭一个呀?你这个函数checkdir他肯定打开的是带路径的,这个是不是可以用相对路径呢?你要知道这个相对路径是相对谁的呀?是当前目录,因为你这个目录是不是要切换呀?但是这个切换是不是只能往下切换呀?不能往上切换,演示一下,统计一下当前目录,看看有多少文件,25个吧?
如果在统计目录的话,是不是在目录项在做个m++ 如果让你统计目录和文件一块来统计,这个返回值怎么说?这个参数你可以返回结构体可以吗?
因为这个return是不是 如果返回一个普通数据类型的话,是不是只能返回一个值呀?如果你想返回多个值,可以返回一个结构体,返回一个结构体指针,或者返回一个结构体,值传递是不是也可以呀?
但是你不能返回局部变量的引用,或者是指针吧,
两个文件符指向的相同的文件,无论你对他如何操作,读或写,都会引起文件指针的变化,那么这一个文件只有一个读写位置指针,你使用哪个文件描述符,都会引起它的变化,
dup2比dup要复杂一些,
我们打开两个文件,newfd)指向argv[1] 也就是指向oldfd指向的文件,
这个里面有一个隐含的操作,如果说,我们在进行文件描述符复制的时候,如果这个newfd已经打开一个文件了,那么你做了28这么一个操作,很显然,newfd会把这个文件给关掉,然后再做文件描述符的复制,如果说这个newfd没有打开文件,没有关系,直接复制,当你进行了文件描述符的复制以后呢,那么内核当中会给你做隐性计数,这点有点类似硬连接,如果我仅仅是把这个newfd close掉,那么你这个文件有没有会真正的关闭掉?没有,那么你close一个文件描述符,只是说使这个文件描述符隐性计数减一,如果是0的时候这个文件是真正的关闭了,要仔细联想一下硬连接,跟那个原理是一模一样的,
这个文件描述符STDOUT_FILENON,是不是它已经把这个把标准输出给打开了吧?因为我们的进程执行起来以后默认有3个打开的文件描述,分别是 标准输入 标准输出,和标准错误输出,这三个文件是打开的,跟我们刚才讲那个是不是类似?那个是我们手动打开,这个是进程刚刚已启动就打开了STDOUT_FILENON,,