#include <iostream>
#include <windows.h>
#include <fstream>
#include <sstream>
#include <direct.h>
#include <sys/stat.h>

using namespace std;

int CountLines(char *filename);
int isdir(char *p);

int main()
{
	//一些必备参数设置
	STARTUPINFO si;
	memset(&si,0,sizeof(STARTUPINFO));//初始化si在内存块中的值（详见memset函数）
	si.cb = sizeof(STARTUPINFO);
	si.dwFlags = STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_NORMAL;
	PROCESS_INFORMATION pi;

  char *path;//获取程序所在路径,程序应当和[Comic]...同一目录下
  string dirName;
  cout<<"input dirName:";
  cin>>dirName;

  path = getcwd(NULL, 0);
  char dir_path[80];
  sprintf(dir_path,"dir %s\\%s /B >dirlist.txt",path,dirName.c_str());
  system(dir_path);

  int dirNum;
  dirNum = CountLines("dirlist.txt");

  ifstream inDir("dirlist.txt");//读入文本内数据
  string dir_lines;
  for(int i=1;i<=dirNum;i++){
    char dir_list_md[80];
    bool isDir = true;
    char cmd[250];//用于记录执行的命令
    
    if(getline(inDir, dir_lines)){
      sprintf(dir_list_md,"%s\\%s\\%s",path,dirName.c_str(),dir_lines.c_str());
      if(!isdir(dir_list_md)){//如果是文件的话，就把它转换成webp格式
      	if(dir_lines.substr(dir_lines.find_first_of("."),dir_lines.length())==".png"
				||dir_lines.substr(dir_lines.find_first_of("."),dir_lines.length())==".jpg"){//判断是否是png文件
					sprintf(cmd, "%s\\libwebp\\cwebp.exe  -q 10 %s\\%s\\%s -o %s\\%s_lin\\%s\\%s.webp",
            path,path,dirName.c_str(),dir_lines.c_str(),path,dirName.c_str(),dirName.c_str(),string(dir_lines.substr(0,dir_lines.find_first_of("."))).c_str());
					CreateProcess(NULL,cmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);//执行命令
				}
        isDir = false;
        //cout<<cmd<<endl;
        //Sleep(20000);
      }else{
        sprintf(dir_list_md,"dir %s\\%s\\%s /B >filelist.txt",path,dirName.c_str(),dir_lines.c_str());
        system(dir_list_md);
        sprintf(dir_list_md,"md %s\\%s_lin\\%s\\%s",path,dirName.c_str(),dirName.c_str(),dir_lines.c_str());
        system(dir_list_md);
      }
    }
    if(isDir){
			ifstream inFile("filelist.txt");//读入文本内数据
			string file_lines;
			while(getline(inFile, file_lines)){//每读取一行
				if(file_lines.substr(file_lines.find_first_of("."),file_lines.length())==".png"
				||file_lines.substr(file_lines.find_first_of("."),file_lines.length())==".jpg"){//判断是否是png文件
					const char *file_name;
					file_name = string(file_lines.substr(0,file_lines.find_first_of("."))).c_str();
					sprintf(cmd, "%s\\libwebp\\cwebp.exe  -q 10 %s\\%s\\%s\\%s -o %s\\%s_lin\\%s\\%s\\%s.webp",
							path,path,dirName.c_str(),dir_lines.c_str(),file_lines.c_str(),path,dirName.c_str(),dirName.c_str(),dir_lines.c_str(),file_name);
					CreateProcess(NULL,cmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);//执行命令
					Sleep(200);//让他睡250毫秒，不然会乱套，因为没有同步机制
				}
			}
			inFile.close();
    }
  }
  inDir.close();

  //char del_txt[80];
  string delFile;
  delFile = "del filelist.txt";
  system(delFile.c_str());
  delFile = "del dirlist.txt";
  system(delFile.c_str());

	return 0;
}

int isdir(char *path)
 {
   struct stat buf;
   int cc;
   cc=stat(path,&buf);
   if(!cc && (buf.st_mode & S_IFDIR))
     return(1);
   return(cc);
}

int CountLines(char *filename)
{
  ifstream ReadFile;
  int n=0;
  string tmp;
  ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件
  if(ReadFile.fail())//文件打开失败:返回0
  {
    return 0;
  }
  else//文件存在
  {
    while(getline(ReadFile,tmp))
    {
      n++;
    }
    ReadFile.close();
    return n;
  }
  return 0;
}
