今天我遇到了这样一个任务:要求编写一个程序,统计和这个程序在同一目录下(及其子目录)所有文件的单词数。统计单词数十分倒不是太难,倒是找出同一目录下的所有文件,是我从来没有接触过的。仔细分析,这个问题其实包含两个小问题:

1. 如何获取当前程序所在文件夹的路径
2. 如何给定一个路径,递归地找到其中(包括子目录)所有文件的文件名(相对路径)

那我们就依次解决这两个问题。

.

.

1. 如何获取当前程序所在文件夹的路径

.

.

解决这个问题只需要一个简单的函数即可(需要包含一个输入输出库):

#include <io.h>
char *getcwd( char *buffer, int maxlen );

这个函数能够获取当前的工作目录,具体来说,它会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数maxlen为buffer的空间大小。

.

我们可以写一个程序来测试一下。

#include<iostream>
#include<io.h>
using namespace std; #define MAX_PATH 80 int main()
{
char buffer[MAX_PATH];
getcwd(buffer, MAX_PATH);
cout << buffer << endl;
return 0;
}



.

运行成功!

.

.

.

2. 如何给定一个路径,递归地找到其中(包括子目录)所有文件的文件名(相对路径)

.

.

这里我使用了网上现成的代码,先附上链接

.

这里,他定义了一个函数(需要包含一个向量库,当然,还有我们在上一个问题里需要使用的输入输出库)

#include <io.h>
#include<vector>
void getFiles(string path, vector<string>& files);

它的用处是,给定一个文件目录path,然后找到其中所有(包括其子目录里)的文件,将文件名放入files中,files是一个字符串向量的引用类型。

.

具体的函数内容是这样的:

void getFiles( string path, vector<string>& files )
{
//文件句柄
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
string p;
if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1)
{
do
{
//如果是目录,迭代之
//如果不是,加入列表
if((fileinfo.attrib & _A_SUBDIR))
{
if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0)
getFiles( p.assign(path).append("\\").append(fileinfo.name), files );
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
}
}while(_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}

.

下面给出一个运用这个函数的例子:

#include<iostream>
#include<vector>
#include<io.h>
using namespace std; #define MAX_PATH 80
void getFiles( string path, vector<string>& files ); int main()
{
vector<string> files;
char * filePath = "C:\\Users\\Star\\Desktop\\SoftTest";
////获取该路径下的所有文件
getFiles(filePath, files);
char str[30];
int size = files.size();
for (int i = 0;i < size;i++)
{
cout<<files[i].c_str()<<endl;
}
return 0;
}



运行成功!

.

.

.

3. 组合以后的完整代码

.

#include<iostream>
#include<vector>
#include<io.h>
using namespace std; #define MAX_PATH 80
void getFiles( string path, vector<string>& files ); int main()
{
vector<string> files;
char buffer[MAX_PATH];
getcwd(buffer, MAX_PATH);
char * filePath = buffer;
////获取该路径下的所有文件
getFiles(filePath, files );
char str[30];
int size = files.size();
for (int i = 0;i < size;i++)
{
cout<<files[i].c_str()<<endl;
}
return 0;
} void getFiles( string path, vector<string>& files )
{
//文件句柄
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
string p;
if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1)
{
do
{
//如果是目录,迭代之
//如果不是,加入列表
if((fileinfo.attrib & _A_SUBDIR))
{
if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0)
getFiles( p.assign(path).append("\\").append(fileinfo.name), files );
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
}
}while(_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}

.

这段代码的运行结果和上面的运行结果相同,我就不给出运行结果了。

.

.

.

4.返回相对路径

.

之前的那种方法很好,不过唯一的缺点是,函数返回的都是绝对路径,如果想要改成相对路径,该怎么办呢?

.

.

我将代码进行了修改,具体做法是在getFile()函数中加入了一个path2参数,改进后的代码如下:

.

#include<iostream>
#include<vector>
#include<io.h>
using namespace std; #define MAX_PATH 80
void getFiles( string path, string path2, vector<string>& files ); int main(){
vector<string> files;
char buffer[MAX_PATH];
getcwd(buffer, MAX_PATH);
string filePath;
filePath.assign(buffer).append("\\");
////获取该路径下的所有文件
getFiles(filePath,"", files );
char str[30];
int size = files.size();
for (int i = 0;i < size;i++)
{
cout<<files[i].c_str()<<endl;
}
return 0;
} void getFiles( string path, string path2, vector<string>& files )
{
//文件句柄
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
string p,p2;
if((hFile = _findfirst(p.assign(path).append(path2).append("*").c_str(),&fileinfo)) != -1)
{
do
{
//如果是目录,迭代之
//如果不是,加入列表
if((fileinfo.attrib & _A_SUBDIR))
{
if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0)
getFiles( p.assign(path).append("\\"),p2.assign(fileinfo.name).append("\\"), files );
}
else
{
files.push_back(p.assign(path2).append(fileinfo.name) ); //这一行可以给出相对路径
//files.push_back(p.assign(fileinfo.name) ); //这一行可以给出文件名
}
}while(_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}

.

运行结果:



成功地给出了相对路径!!

.

.

也可以给出文件名:



.

.

.

C++如何获取当前路径下所有文件的文件名的更多相关文章

  1. 获取当前路径下的所有文件路径 :listFiles

    获取当前路径下的所有文件路口 :listFiles

  2. Python获取当前路径下的配置文件

    Python获取当前路径下的配置文件 有的时候想读取当前目录下的一个配置文件.其采用的办法是: import os # 获取当前路径 curr_dir = os.path.dirname(os.pat ...

  3. python ftplib.FTP 获取当前路径下所有目录

    FTP 模块里有一个dir函数,可以打印出当前路径下所有文件,但是这个函数没有返回值,只是打印出来. 还有一个nlst函数,可以返回一个文件名的列表,但是只有文件名,没有详细信息,无法判断是否是目录. ...

  4. 取CPU序列号,获取网卡,取硬盘系列号,获取目录下的文件,强制删除目录

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  5. Python开发【笔记】:获取目录下所有文件

    获取文件 import os def sub_dirs(rdir): li = os.listdir(rdir) return li def main(rdir): content = sub_dir ...

  6. Golang获取目录下的文件及目录信息

    一.获取当前目录下的文件或目录信息(不包含多级子目录) func main() {  pwd,_ := os.Getwd() //获取当前目录  //获取文件或目录相关信息  fileInfoList ...

  7. python 获取当前目录下的文件目录和文件名

    python 获取当前目录下的文件目录和文件名   os模块下有两个函数: os.walk() os.listdir() 1 # -*- coding: utf-8 -*- 2 3 import os ...

  8. 阿里云OSS 获取目录下所有文件

    public class AliyunHandle { public static string accessKeyId = "a1uI5xxxxxxxxxrP4H"; publi ...

  9. shell获取目录下所有文件夹的名称并输出

    获取指定目录/usr/下所有文件夹的名称并输出: shell代码: #!/bin/bash #方法一 dir=$(ls -l /usr/ |awk '/^d/ {print $NF}') for i ...

随机推荐

  1. notepad++之删除空行

    正则表达式替换 查找目标: \r\n{0,1}[\s\t]*\r\n 替换为: \r\n 循环查找:勾选

  2. Nginx 安装学习笔记(1.安装和启动)

    centos7 编译安装和启动.停止https://www.cnblogs.com/xingyunblog/p/9072553.html 一.安装nginx 1.下载 wget http://ngin ...

  3. Traceback (most recent call last): File "c:\program files (x86)\microsoft visual studio\2019\community\common7\ide\extensions\microsoft\python\core\Packages\ptvsd\_vendored\pydevd\_pydevd_bundle\pyd

    某次编码,debug的时候突然突然突然给我报这个错: Traceback (most recent call last):   File "c:\program files (x86)\mi ...

  4. nginx优化php-fpm优化 压力测试达到每分150万访问量webbench网站压力

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装:引用wget http: ...

  5. WMS二开:外挂页面开发培训

    springboot:MAVEN结构前后台都是MVC架构基于模板引擎thymeleafapplication.yml文件里面配置了一个DEV\TEST\PROD,用于自动选择配置文件applicati ...

  6. Java框架spring Boot学习笔记(四):Spring Boot操作MySQL数据库

    在pom.xml添加一下代码,添加操作MySQL的依赖jar包. <dependency> <groupId>org.springframework.boot</grou ...

  7. Commit can not be set while enrolled in a transaction

    [java] Exception: java.sql.SQLException [java] Message: Commit can not be set while enrolled in a tr ...

  8. Ubuntu16.04 藍牙連上,但是聲音裏面找不到設備

    解決辦法: 1. sudo apt-get install blueman bluez* 2. sudo vim /etc/pulse/default.pa 注釋掉下面的代碼: #.ifexists ...

  9. Mac 安装 mongoDB

    因Homebrew被墙, 这里使用压缩包安装. 一 从官网下载压缩包 二 解压缩 cd ~/Downloads/ tar -zxvf mongodb-osx-ssl-x86_64-4.0.8.tgz ...

  10. 重构现有代码:Refactoring

    重构现有代码:Refactoring 1.WHY SHOULD WE REFACTOR? 1.Refactoring Improves the Design of Software Without r ...