#include "stdio.h"
#include <stdlib.h>
#include <string.h>
//定义字符串最大长度
#define MAX_LEN 256
/* 实现一个可以在ubuntu下运行的播放器
* 使用方法:
./a.out 文件名
*/
enum{
//未知类型
UNKNOW_TYPE = 0,
//图片
PIC_TYPE,
//视频
VIDEO_TYPE,
//音频
AUDIO_TYPE,
//文本
TEXT_TYPE
};
int popenCmd(char *fileName, char *results);
int getFileType(char *results);
int player(char *fileName, int fileType);
int main(int argc, char *argv[])
{
//argc 参数的个数
//argv 参数的数组
if(argc != 2){
printf("运行方法:./a.out 文件名\n");
return -1;
}
char results[MAX_LEN] = {0};
int ret = 0;
ret = popenCmd(argv[1], results);
if(ret < 0){
printf("读取file命令结果失败\n");
return -1;
}
//printf("file命令结果: %s\n", results);
int fileType = UNKNOW_TYPE;
//获取文件类型
fileType = getFileType(results);
//播放文件
player(argv[1], fileType);
return 0;
}
//对输入的文件名使用file命令进行判断,并将file命令的结果保存到字符串数组中
int popenCmd(char *fileName, char *results)
{
char cmd[MAX_LEN] = {0};
sprintf(cmd, "file %s", fileName);
//运行file命令返回文件指针
FILE *fp = popen(cmd, "r");
if(NULL == fp){
printf("打开 file命令失败\n");
goto err;
}
//将结果读取到results字符串数组中
fgets(results, MAX_LEN, fp);
if(fp){
pclose(fp);
fp = NULL;
}
return 0;
err:
if(fp){
pclose(fp);
fp = NULL;
}
return -1;
}
//如何判断文件类型的代码
int getFileType(char *results)
{
//file命令的结果中有image代表是图片,有Audio或audio代表是音频,有MP4/AVI代表是视频,有text代表是文本(默认文件是未知类型)
if(strstr(results, "image")){
return PIC_TYPE;
}
if(strstr(results, "AVI") || strstr(results, "MP4")){
return VIDEO_TYPE;
}
if(strstr(results, "Audio") || strstr(results, "audio")){
return AUDIO_TYPE;
}
if(strstr(results, "text")){
return TEXT_TYPE;
}
return UNKNOW_TYPE;
}
int player(char *fileName, int fileType)
{
char cmd[MAX_LEN] = {0};
/*
* 判断文件类型
* 当文件类型是视频时,使用vlc命令 播放视频使用vlc(例如:vlc 123.mp4)
* 当文件类型是音频时,使用aplay命令
* 当文件类型是图片时,使用display命令
* 当文件类型是文本时,使用gedit命令
* 对应文件类型拼接对应命令的代码
*/
switch (fileType){
case PIC_TYPE:
//拼一个字符串,使字符串内容为"display argv[1]的实际内容",以此类推
sprintf(cmd, "display %s", fileName);
break;
case VIDEO_TYPE:
sprintf(cmd, "vlc %s", fileName);
break;
case AUDIO_TYPE:
sprintf(cmd, "aplay %s", fileName);
break;
case TEXT_TYPE:
sprintf(cmd, "gedit %s", fileName);
break;
default:
printf("未知文件类型,程序即将退出\n");
break;
}
if(fileType != UNKNOW_TYPE){
//system()函数用于调用linux下的命令
system(cmd);
}
return 0;
}