#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h> using namespace std; #define dmax(a,b) (((a) > (b)) ? (a) : (b))
#define dmin(a,b) (((a) < (b)) ? (a) : (b)) //获取特定格式的文件名
int readFileList(std::vector<string> &filelist, const char *basePath, string format)
{
DIR *dir;
struct dirent *ptr;
char base[]; if ((dir=opendir(basePath)) == NULL)
{
perror("Open dir error...");
exit();
} while ((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")== || strcmp(ptr->d_name,"..")==) ///current dir OR parrent dir
continue;
else if(ptr->d_type == ) //file
{
//printf("d_name:%s/%s\n",basePath,ptr->d_name);
string temp = ptr->d_name;
//cout << temp << endl;
string sub = temp.substr(temp.length() - , temp.length()-);
//cout << sub << endl;
if(sub == format)
{
string path = basePath;
path += "/";
path += ptr->d_name;
filelist.push_back(path);
}
}
else if(ptr->d_type == ) ///link file
{
//printf("d_name:%s/%s\n",basePath,ptr->d_name);
}
else if(ptr->d_type == ) ///dir
{
memset(base,'\0',sizeof(base));
strcpy(base,basePath);
strcat(base,"/");
strcat(base,ptr->d_name);
readFileList(filelist, base, format);
}
}
closedir(dir);
return ;
} //找出目录中所有子目录
int findAllSubDir(std::vector<string> &filelist, const char *basePath)
{
DIR *dir;
struct dirent *ptr;
char base[]; if ((dir=opendir(basePath)) == NULL)
{
perror("Open dir error...");
exit();
} while ((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")== || strcmp(ptr->d_name,"..")==) ///current dir OR parrent dir
continue;
else if(ptr->d_type == ) //file
{
// //printf("d_name:%s/%s\n",basePath,ptr->d_name);
// string temp = ptr->d_name;
// //cout << temp << endl;
// string sub = temp.substr(temp.length() - 4, temp.length()-1);
// //cout << sub << endl;
// if(sub == format)
// {
// string path = basePath;
// path += "/";
// path += ptr->d_name;
// filelist.push_back(path);
// }
}
else if(ptr->d_type == ) ///link file
{
//printf("d_name:%s/%s\n",basePath,ptr->d_name);
}
else if(ptr->d_type == ) ///dir
{
memset(base,'\0',sizeof(base));
strcpy(base,basePath);
strcat(base,"/");
strcat(base,ptr->d_name);
filelist.push_back(ptr->d_name);
findAllSubDir(filelist, base);
}
}
closedir(dir);
return ;
} void findDir(string src, string &facefolder, string &facenameindex, string filePath)
{
int begin = src.find(filePath) + filePath.size() + ;
int end = ;
for (int i = src.size() - ; i >= ; --i)
{
//cout << src[i] << endl;
if (src[i] == '/')
{
end = i;
break;
}
}
//cout << begin << endl;
//cout << end << endl;
facefolder = src.substr(begin, end - - begin + );
facenameindex = src.substr(end + , src.size() - - (end + ) + );
} void GetStringFileName(const string &filePath, string &filename, string &fileformat)
{
int fileformat_begin = ;
int fileformat_end = filePath.length() - ;
int filename_begin = ;
int filename_end = filePath.length() - ;
for (int i = filePath.length() - ; i >= ; --i)
{
//cout << filePath[i] << endl;
if (filePath[i] == '.')
{
fileformat_begin = i + ;
filename_end = i - ;
} if (filePath[i] == '/')
{
filename_begin = i + ;
break;
}
}
// cout << filename_begin << endl;
// cout << filename_end << endl;
filename = filePath.substr(filename_begin, filename_end - filename_begin + );
fileformat = filePath.substr(fileformat_begin, fileformat_end - fileformat_begin + );
} void StringSplit(const string &src, const char splitchar, vector<string> &dst)
{
int begin = ;
int end = ;
int i = ;
for (i = ; i < src.length(); ++i)
{
if(src[i] == splitchar)
{
end = i - ;
dst.push_back(src.substr(begin, end - begin + ));
begin = i + ;
end = begin;
}
} //last
if(i > end)
{
end = i - ;
}
dst.push_back(src.substr(begin, end - begin + ));
} //遍历一个目录,找出其中某一后缀的所有文件
void sence0()
{
// Loop over all the images provided on the command line.
std::vector<string> srcfiles;
string srcpath = "./src/1";
string srcformat = ".txt";
string outputformat = ".png";
printf("the current dir is : %s\n", srcpath.c_str());
readFileList(srcfiles, srcpath.c_str(), srcformat);
string dstpath = "./src/3";
printf("the dst dir is : %s\n", dstpath.c_str());
if (access(dstpath.c_str(), ) == -)
{
int flag=mkdir(dstpath.c_str(), );
} std::vector<string> dstfiles(srcfiles.size());
for (int i = ; i < srcfiles.size(); ++i)
{
/* code */
cout << srcfiles[i] << endl;
string filename;
string fileformat;
GetStringFileName(srcfiles[i], filename, fileformat);
string dstfile = dstpath + "/" + filename + "." + fileformat;
dstfiles[i] = dstfile;
cout << dstfiles[i] << endl;
}
} //建立多级目录,包括子目录, 并依次处理文件,适用于小文件
void sence1()
{
// Loop over all the images provided on the command line.
std::vector<string> files;
string filePath = "./lfw_small_raw";
string format = ".jpg";
string outputformat = ".png";
printf("the current dir is : %s\n", filePath.c_str());
readFileList(files, filePath.c_str(), format);
string dstpath = "./lfw_small_convert";
printf("the dst dir is : %s\n", dstpath.c_str());
if (access(dstpath.c_str(), ) == -)
{
int flag=mkdir(dstpath.c_str(), );
} std::vector<string> alignimg(files.size());
for (int i = ; i < files.size(); ++i)
{
/* code */
cout << files[i] << endl;
string facefolder;
string facenameindex;
findDir(files[i], facefolder, facenameindex, filePath);
facenameindex = facenameindex.substr(, facenameindex.size() - );
facenameindex += outputformat;
//cout << facefolder << endl;
//cout << facenameindex << endl;
string newfacefolder = dstpath + "/" + facefolder;
if (access(newfacefolder.c_str(), ) == -)
{
int flag=mkdir(newfacefolder.c_str(), );
}
alignimg[i] = newfacefolder + "/" + facenameindex;
cout << alignimg[i] << endl;
}
} //依次遍历文件夹中的每一个目录,遇到一个目录新建一个目录,然后遍历该目录的文件
void sence2()
{
// Loop over all the images provided on the command line.
std::vector<string> sudDirfiles;
string srcpath = "./lfw_small_raw";
string dstpath = "./lfw_small_convert"; //如果目录存在就删除目录
if (access(dstpath.c_str(), ) == )
{
cout << "remove " << dstpath << endl;
int flag = rmdir(dstpath.c_str());
} //如果目录不存在就新建
if (access(dstpath.c_str(), ) == -)
{ cout << "mkdir " << dstpath << endl;
int flag=mkdir(dstpath.c_str(), );
} findAllSubDir(sudDirfiles, srcpath.c_str());
for (int i = ; i < sudDirfiles.size(); ++i)
{
//cout << sudDirfiles[i] << endl;
//遍历当前子目录中所有文件
std::vector<string> srcfiles;
string srcSudDir = srcpath + "/" + sudDirfiles[i];
string srcformat = ".jpg";
printf("the current subdir is : %s\n", srcSudDir.c_str()); string dstSudDir = dstpath + "/" + sudDirfiles[i];
//建立目标子目录
if (access(dstSudDir.c_str(), ) == -)
{
cout << "mkdir " << dstSudDir << endl;
int flag=mkdir(dstSudDir.c_str(), );
}
printf("the current subdir is : %s\n", dstSudDir.c_str()); readFileList(srcfiles, srcSudDir.c_str(), srcformat);
for (int j = ; j < srcfiles.size(); ++j)
{
cout << srcfiles[j] << endl;
string filename;
string fileformat;
GetStringFileName(srcfiles[j], filename, fileformat);
string dstfile = dstSudDir + "/" + filename + "." + fileformat;
cout << dstfile << endl;
}
}
} int main()
{
sence2();
// string filePath = "./lfw_small_raw/Aaron_Eckhart";
// std::vector<string> split;
// StringSplit(filePath, '/', split);
// string curSubDir = split[split.size() - 1];
// cout << curSubDir << endl;
// for (int i = 0; i < split.size(); ++i)
// {
// cout << split[i] << endl;
// } // string filename;
// string fileformat;
// GetStringFileName(filePath, filename, fileformat);
// //cout << filePath.substr(2, 3) << endl;
// cout << filePath << endl;
// cout << filename << endl;
// cout << fileformat << endl;
return ;
}

Linux C++ 访问子目录以及里面的文件的更多相关文章

  1. Linux 终端访问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上.google 一下. 方 ...

  2. Linux怎样访问Windows共享文件和文件夹

    常常使用Windows的人可能会发现,Windows计算机之前共享资料非常方便,但是有时候想玩玩Linux的时候,如Fedora.Ubuntu.CentOS等,该怎样才能访问Windows计算机上的文 ...

  3. Linux 终端访问 FTP 及 上传下载 文件[转]

    1.      Linux 终端连接FTP [oracle@Dave ~]$ ftp 10.85.7.97 Connected to 10.85.7.97. 220 Serv-U FTP Server ...

  4. linux下删除目录及其子目录下某种类型文件

    Linux下,如果想要删除目录及其子目录下某种类型文件,比如说所有的txt文件,则可以使用下面的命令: find . -name "*.txt" -type f -print -e ...

  5. win下gvim或者linux下的vim安装vundle都适用的配置文件 - 在当前目录及其子目录下**, 的所有文件* 中, 搜索当前光标所在的单词

    gvim下的普通配置: if v:lang =~ "utf8$" || v:lang =~ "UTF-8$" set fileencodings=utf-8,g ...

  6. Linux查看当前目录下所有子目录是否包含某个文件

    在Linux下,当需要找某个文件但又不知道这个文件在哪个具体的目录下,这时可以使用全目录查找 使用find命令: find . -type f -name "job_21_output*&q ...

  7. linux上搭建nginx+ftp,实现文件的上传与访问

    ftp服务器搭建 1.新建用户ftpuser并指定主目录为/home/ftpuser (注意:这个目录是后面存储和读取文件的目录) <!--创建用户并指定主目录--> useradd -d ...

  8. Linux centos7 VMware Apache访问日志不记录静态文件、访问日志切割、静态元素过期时间

    一.Apache访问日志不记录静态文件 网站大多元素为静态文件,如图片.css.js等,这些元素可以不用记录 vim /usr/local/apache2.4/conf/extra/httpd-vho ...

  9. linux复制指定目录下的全部文件到另一个目录中

    linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...

随机推荐

  1. UIView的alpha、hidden和opaque属性之间的关系和区别

    转自:http://blog.csdn.net/wzzvictory/article/details/10076323 作者:wangzz 原文地址:http://blog.csdn.net/wzzv ...

  2. GPG key retrieval failed

    Total size: 340 k Installed size: 1.2 M Is this ok [y/N]: y Downloading Packages: warning: rpmts_Hdr ...

  3. 转:GestureDetector: GestureDetector 基本使用

    Gesture在 ViewGroup中使用 GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等. 使用GestureDetector分三步: 1. 定义GestureDete ...

  4. Why do people integrate Spark with TensorFlow even if there is a distributed TensorFlow framework?

    https://www.quora.com/Why-do-people-integrate-Spark-with-TensorFlow-even-if-there-is-a-distributed-T ...

  5. 关于RPG游戏结构撰写的相关探索上篇

    本章节的目标是创造一个游戏理念.这个理念是: *简短的项目概括 *范围描述 *目标用户 *与其他游戏的区别 不要试图编写一款缺乏明确理念的RPG.因为这样可能只会产生与其他游戏雷同的项目. <i ...

  6. VirtualBox虚拟机网络环境解析和搭建-NAT、桥接、Host-Only、Internal、端口映射

    一.NAT模式 特点: 1.如果主机可以上网,虚拟机可以上网 2.虚拟机之间不能ping通 3.虚拟机可以ping通主机(此时ping虚拟机的网关,即是ping主机) 4.主机不能ping通虚拟机 应 ...

  7. ZooKeeper学习之文件系统的布局和格式

    本文来谈谈快照文件,事务日志文件在文件系统中是如何存放的. 写事务日志是事务处理的关键步骤,所以高度建议在一个独立的磁盘上存储.快照不需要在独立的磁盘存储,因为它们是由一个后台线程以懒汉式的(lazi ...

  8. kali下添加PATH环境变量

    添加PATH环境变量,第1种方法: [root@lx_web_s1 ~]# export PATH=/usr/local/webserver/mysql/bin:$PATH 再次查看: [root@l ...

  9. FastJson的常用操作

    FastJson的常用操作 2017-06-05 常用操作包括以下内容: 对象与(JsonObject或JsonArray)与String的互换 String转换为(JsonObject或JsonAr ...

  10. 基于ELK和Python搭建简单的监控告警系统

    Reference: https://www.jianshu.com/p/67e358dc065d 在做完支付系统后,我搭建了两套监控系统. 一套是点评的CAT,主要用于代码级的实时统计和历史统计以及 ...