Linux目录操作:模拟rm命令删除文件和非空目录

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

void rm(const char *path)
{
//获取文件属性
struct stat buf_stat;
stat(path, &buf_stat);
//判断路径是文件还是目录
if (!S_ISDIR(buf_stat.st_mode))
{
unlink(path); //如果参数不是目录,直接删除
return;
}
//如果参数是目录
//打开目录
DIR *dir = opendir(path); // mydir/adir
while(1)
{
struct dirent *de = readdir(dir);
if(de == NULL)
break;
//拼接完整路径
char filepath[1024] = {0};
sprintf(filepath, "%s/%s", path, de->d_name); // mydir/adir
//判断目录项是文件还是子目录
if (de->d_type != DT_DIR)
{
unlink(filepath); // mydir/a.txt
}
else
{
//如果目录项是一个目录
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
{
continue;
}
rm(filepath);
}

}
//删除空目录
rmdir(path);

}
// ./rm.out mydir
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("args error\n");
return -1;
}

const char *path = argv[1];
rm(path); //自定义的删除函数
return 0;

}

Linux目录操作:模拟ls命令实现

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>

int main()
{
//打开当前目录
DIR *dir = opendir(".");
//读取目录中的第一项
struct dirent *de = readdir(dir);
//目录项不为空时循环读取
while(de)
{
//忽略隐藏文件
if(de->d_name[] == '.')
{
de = readdir(dir);
continue;
}

    //打印文件名
    printf("%s\n", de->d_name);
    de = readdir(dir);
}
//关闭目录
closedir(dir);

return 0;

}

ubuntu下安装ffmpeg

在$HOME目录下编译安装ffmpeg

sudo apt-get install vim git qt-sdk ctags qtmultimedia5-dev
mkdir open
cd open
git clone https://github.com/FFmpeg/FFmpeg.git
sudo apt-get install libsdl2-dev
sudo apt-get install libx264-dev
sudo apt-get install libfaac-dev libfdk-aac-dev
./configure --prefix=/usr --enable-libx264 --enable-libfdk-aac --enable-gpl --enable-nonfree --disable-asm --enable-shared
make
sudo make install

在ubuntu14.04上安装obs

然后执行以下命令:

sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next
sudo apt-get update && sudo apt-get install ffmpeg
sudo add-apt-repository ppa:obsproject/obs-studio
sudo apt-get update && sudo apt-get install obs-studio

静态联编(早绑定)和动态联编(晚绑定)

早绑定就是在编译阶段就确定好了函数的调用地址。
晚绑定是在运行阶段才能确定函数的调用地址。
class Animal{
public:

void speak(){
    cout << "Animal speak!" << endl;
}

};

class Dog : public Animal{
public:
void speak(){
cout << "Dog speak!" << endl;
}
};
void doLogic(Animal *animal)
{
animal->speak();
}
int main()
{
Dog *dog = new Dog;
doLogic(dog);
}
这样最终打印的是哪个函数呢?
cout << "Animal speak!" << endl;是它,为什么呢?我传人的明明是Dog啊
因为在编译阶段就确定好了,animal->speak();这就是早绑定
那么要实现晚绑定要怎么办呢?在父类的void speak()函数前面加上virtual关键字,使之变为虚函数,这样打印出来的就是
cout << "Dog speak!" << endl;了,
还有一个问题,C++中类型转换需要显示的转换,为什么这里doLogic中传人dog没有报错呢?