递归遍历目录的实现(c)
LinuxC讲解系统调用readdir,readdir_r以及如何遍历目录下的所有文件
LinuxC讲解系统调⽤readdir,readdir_r以及如何遍历⽬录下的所有⽂件readdir与readdir_r简要说明readdir可以⽤来遍历指定⽬录路径下的所有⽂件。
不过,不包含⼦⽬录的⼦⽂件,如果要递归遍历,可以使⽤深度遍历,或者⼴度遍历算法。
readdir_r 是readdir的可重⼊版本,线程安全。
readdir因为直接返回了⼀个static的struct dirent,因此是⾮线程安全。
readdir如何遍历⽬录⼦⽂件?1. opendir打开⽬录opendir有2个版本:opendir,fopendir。
前者参数为⽬录对应字符串,后者参数为⽬录对应已打开⽂件描述符。
#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);DIR *fdopendir(int fd);⽤法模型:DIR *dirp;const char *base_dir = "/home/martin/document";if ((dirp = opendir(base_dir)) != NULL) {perror("opendir error");return -1;}// 调⽤readdir遍历⽬录⼦⽂件...closedir(base_dir);2. readdir遍历⽬录⼦⽂件readdir需要⼀个已打开(调⽤opendir)的DIR对象作为参数。
#include <dirent.h>struct dirent *readdir(DIR *dirp);int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);dirent 结构定义struct dirent {ino_t d_ino; /* inode number i节点编号 */off_t d_off; /* not an offset; see NOTES 早期⽂件系统中,telldir返回⽂件在⽬录内的偏移 */unsigned short d_reclen; /* length of this record dirent 记录的实际长度 */unsigned char d_type; /* type of file; not supportedby all filesystem types ⽂件类型 */char d_name[256]; /* filename ⽂件名 */};成员介绍:d_ino i节点编号,操作系统⽤来识别⽂件的,每个⽂件都有⼀个inode number(参见)d_off 早期⽂件系统中,⽂件系统使⽤平⾯表格,telldir返回⽂件在⽬录内的偏移,⽽d_off就代表这个偏移的缓存。
先序遍历的递归算法c语言
先序遍历的递归算法c语言先序遍历是二叉树遍历的一种方法,它的遍历顺序是先访问根结点,然后递归地先序遍历左子树,最后递归地先序遍历右子树。
在C语言中,我们可以通过递归算法来实现二叉树的先序遍历。
首先,我们需要定义二叉树的结构体,包括树的节点结构以及创建树的函数。
树的节点结构体定义如下:```ctypedef struct TreeNode {int data;struct TreeNode* left;struct TreeNode* right;} TreeNode;```接下来,我们可以编写递归函数来实现先序遍历。
先序遍历的递归算法如下:```cvoid preorderTraversal(TreeNode* root) {if (root == NULL) {return;}printf("%d ", root->data); // 访问根结点preorderTraversal(root->left); // 递归遍历左子树preorderTraversal(root->right); // 递归遍历右子树}```在这段代码中,我们首先判断根结点是否为空,如果为空则直接返回。
然后,我们先访问根结点的数据,然后递归地对左子树和右子树进行先序遍历。
接下来,我们可以编写一个测试函数来创建二叉树并进行先序遍历:```cint main() {// 创建二叉树TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));root->data = 1;root->left = (TreeNode*)malloc(sizeof(TreeNode));root->left->data = 2;root->left->left = NULL;root->left->right = NULL;root->right = (TreeNode*)malloc(sizeof(TreeNode));root->right->data = 3;root->right->left = NULL;root->right->right = NULL;// 先序遍历二叉树printf("Preorder traversal: ");preorderTraversal(root);return 0;}```在这个测试函数中,我们首先创建了一个简单的二叉树,然后调用先序遍历函数对这棵树进行遍历,并输出遍历结果。
全国浙教版信息技术高中选修1新授课第五节递归算法实例及程序实现教学设计
3.任务驱动法,培养自主学习能力:设计具有挑战性的递归任务,鼓励学生自主探究和解决问题。在任务完成过程中,引导学生发现问题、分析问题、解决问题,培养他们的自主学习能力。
a.递归算法在排序算法中的应用,如快速排序、归并排序等。
b.递归算法在图形绘制中的应用,如分形图形的绘制等。
c.递归算法在人工智能领域的应用,如深度学习中的递归神经网络等。
1.作业要求独立完成,不得抄袭他人成果,确保作业质量。
2.在编程过程中,注重代码规范,养成良好的编程习惯。
3.遇到问题时,要积极思考,可查阅资料、请教同学或老师,提高解决问题的能力。
c.结合迷宫问题,讨论递归算法的设计思路。
2.每个小组选代表进行分享,总结讨论成果。
3.老师针对学生的讨论进行点评,强调递归算法在实际应用中的注意事项。
(四)课堂练习
1.设计以下练习题目,让学生动手实践:
a.编写递归程序,计算阶乘。
b.编写递归程序,求解斐波那契数列。
c.分析并优化以下递归程序,提高程序性能。
4.掌握全国浙教版信息技术高中选修1新授课第五节递归算法相关知识点,形成系统的知识体系。
(二)过程与方法
1.通过实例分析,培养学生的问题发现和解决能力,提高学生的逻辑思维能力。
2.采用任务驱动法,引导学生自主探究递归算法的原理和实现方法,培养学生自主学习能力。
3.组织课堂讨论,让学生在交流与合作中碰撞思维火花,提高学生的沟通能力和团队协作能力。
WordCount程序(C语言实现)
WordCount程序(C语⾔实现)Word Count 程序GitHub地址:https:///MansonYe/Word-Count⼀、项⽬简介Word Count 是⽤以统计⽂本⽂件的字符数、单词数和⾏数的常⽤⼯具。
⼆、功能分析及实现情况· 基本功能:统计file.c的字符数(实现)统计file.c的单词数(实现)统计file.c的⾏数(实现)· 拓展功能:递归处理⽬录下符合类型的⽂件(实现)显⽰代码⾏、空⾏和注释⾏的⾏数(实现)⽀持通配符(* , ?)(实现)· ⾼级功能:⽀持GUI界⾯并显⽰详细信息(待实现)· 定义: 字符:可显⽰的ASCII码字符,因此不包括空格和‘\n’等控制字符 单词:由⼀串连续英⽂字母组成,遇到英⽂以外为单词的分隔 ⾏:每⾏以分⾏符或结束符为标志,分为三种: 空⾏:本⾏只由⾮显⽰字符组成,若有代码,则不超过⼀个可显⽰字符 代码⾏:本⾏包括多于⼀个字符的代码 注释⾏:本⾏不是代码⾏,且包括注释· 例⼦:如图为⼀个典型的C语⾔⽂本⽂件所有显⽰的字符均为纳⼊字符计算中:如2⾏有19个字符以⾮英⽂字母分隔单词:如10⾏单词数为3,但7⾏单词数为0包含多于⼀个代码的⾏为代码⾏:如10、14、21⾏等均为代码⾏不是代码⾏且包含注释为注释⾏:如4、5、22、24⾏等,6⾏因为在⽂档型注释中顾算注释⾏没有显⽰字符或只有⼀个代码的⾏为空⾏:如1、3、15⾏,但6⾏在⽂本注释中因此不算作空⾏,算作注释⾏三、PSPPSP Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)Planning计划 30 30Estimate· 估计这个任务需要多少时间 10 10Development开发 480 600Analysis· 需求分析 (包括学习新技术) 60 70Design Spec· ⽣成设计⽂档 55Design Review· 设计复审 (和同事审核设计⽂档) 30 50Coding Standard· 代码规范 (为⽬前的开发制定合适的规范) 1010Design· 具体设计 60 65Coding· 具体编码 480 540Code Review· 代码复审 60 75Test· 测试(⾃我测试,修改代码,提交修改) 60 120Reporting报告120 120Test Report· 测试报告3060Size Measurement· 计算⼯作量10 5Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划 30 60四、解题思路及功能实现:字符统计:遍历⽂档字符,通过排除⾮显⽰字符,统计显⽰字符数量;单词统计:遍历⽂档字符,利⽤变量记录字符是否为英⽂字母状态,统计进⼊该状态次数即为单词词数⾏数统计:遍历⽂档以⾏为单位的字符串,遍历次数即为⾏数特殊⾏数统计:遍历⽂档以⾏为单位的字符串,再利⽤指针遍历字符串;⾸先判断是否为代码⾏(优先级最⾼),其次判断是否为注释⾏,由于三种⾏互斥,顾空⾏数为总⾏数减去前两者。
C#递归读取目录里所有文件(包括子目录)及其文件操作
C#递归读取⽬录⾥所有⽂件(包括⼦⽬录)及其⽂件操作⽤到两个函数ParseDirectory 和CreatePathListvoid ParseDirectory(string path, string filter){string[] dirs = Directory.GetDirectories(path);//得到⼦⽬录IEnumerator iter = dirs.GetEnumerator();while(iter.MoveNext()){string str = (string)(iter.Current);ParseDirectory(str, filter);}string[] files = Directory.GetFiles(path, filter);if(files.Length > 0){m_numFiles += files.Length;m_pathList.Add(files);}}string[] CreatePathList(){if(m_numFiles <= 0){return null;}string[] str = new string[m_numFiles];int index = 0;try{IEnumerator pathIter = m_pathList.GetEnumerator();while(pathIter.MoveNext()){string[] ar = (string[])(pathIter.Current);IEnumerator fileIter = ar.GetEnumerator();while(fileIter.MoveNext()){str[index] = (string)(fileIter.Current);++index;}}}catch(Exception e){return null;}return str;}使⽤范例:如果要查找的:d⽬录下所有mp3⽂件string path="d:\\"; //⽬录名也可以⽤相当路径string filter="*.mp3"; //⽂件类型int m_numFiles=0; //⽂件总数ArrayList m_pathList = new ArrayList();//包含所有⽂件路径的数组string[] files; //所有⽂件名ParseDirectory(path, "*.mp3");files=CreatePathList(); //⽣成⽂件名数组if(files == null){throw new Exception(String.Concat("No file found in ", path));}⽂件处理类using System ;using System.Drawing ;using System.Collections ;using ponentModel ;using System.Windows.Forms ;using System.Data ;using System.IO ;using System.Drawing.Printing ;public class Form1 : Form{private RichTextBox richTextBox1 ;private Button button1 ;private Button button2 ;private Button button3 ;private Button button4 ;private Button button5 ;private OpenFileDialog openFileDialog1 ;private SaveFileDialog saveFileDialog1 ;private PrintDialog printDialog1 ;private PrintDocument ThePrintDocument ;private PrintPreviewDialog printPreviewDialog1 ;private StringReader myReader ;private ponentModel.Container components = null ;public Form1 ( ){//初始化窗体中的各个组件InitializeComponent ( ) ;}//清除程序中使⽤多的资源protected override void Dispose ( bool disposing ){if ( disposing ){if ( components != null ){components.Dispose ( ) ;}}base.Dispose ( disposing ) ;}private void InitializeComponent ( ){richTextBox1 = new RichTextBox ( ) ;button1 = new Button ( ) ;button2 = new Button ( ) ;button3 = new Button ( ) ;button4 = new Button ( ) ;button5 = new Button ( ) ;saveFileDialog1 = new SaveFileDialog ( ) ;openFileDialog1 = new OpenFileDialog ( ) ;printPreviewDialog1 = new PrintPreviewDialog ( ) ;printDialog1 = new PrintDialog ( ) ;ThePrintDocument = new PrintDocument ( ) ;ThePrintDocument.PrintPage += new PrintPageEventHandler ( ThePrintDocument_PrintPage ) ; SuspendLayout ( ) ;richTextBox1.Anchor = AnchorStyles.None ; = "richTextBox1" ;richTextBox1.Size = new Size ( 448 , 280 ) ;richTextBox1.TabIndex = 0 ;richTextBox1.Text = "" ;button1.Anchor = AnchorStyles.None ;button1.Location = new Point ( 41 , 289 ) ; = "button1" ;button1.Size = new Size ( 48 , 30 ) ;button1.TabIndex = 1 ;button1.Text = "打开" ;button1.Click += new System.EventHandler ( button1_Click ) ;button2.Anchor = AnchorStyles.None ;button2.Location = new Point ( 274 , 288 ) ; = "button2" ;button2.Size = new Size ( 48 , 30 ) ;button2.TabIndex = 4 ;button2.Text = "预览" ;button2.Click += new System.EventHandler ( button2_Click ) ;button3.Anchor = AnchorStyles.None ;button3.Location = new Point ( 108 , 288 ) ; = "button3" ;button3.Size = new Size ( 48 , 30 ) ;button3.TabIndex = 2 ;button3.Text = "保存" ;button3.Click += new System.EventHandler ( button3_Click ) ;button4.Anchor = AnchorStyles.None ;button4.Location = new Point ( 174 , 288 ) ; = "button4" ;button4.Size = new Size ( 80 , 30 ) ;button4.TabIndex = 3 ;button4.Text = "打印机设置" ;button4.Click += new System.EventHandler ( button4_Click ) ;button5.Anchor = AnchorStyles.None ;button5.Location = new Point ( 345 , 288 ) ; = "button5" ;button5.Size = new Size ( 48 , 30 ) ;button5.TabIndex = 5 ;button5.Text = "打印" ;button5.Click += new System.EventHandler ( button5_Click ) ;saveFileDialog1.DefaultExt = "*.txt" ;saveFileDialog1.FileName = "file.txt" ;saveFileDialog1.InitialDirectory = "c:\\" ;saveFileDialog1.Title = "另存为!" ;openFileDialog1.DefaultExt = "*.txt" ;openFileDialog1.FileName = "file.txt" ;openFileDialog1.InitialDirectory = "c:\\" ;openFileDialog1.Title = "打开⽂本⽂件!" ;AutoScaleBaseSize = new Size ( 6 , 14 ) ;ClientSize = new Size ( 448 , 325 ) ;this.Controls.Add ( button1 ) ;this.Controls.Add ( button2 ) ;this.Controls.Add ( button3 ) ;this.Controls.Add ( button4 ) ;this.Controls.Add ( button5 ) ;this.Controls.Add ( richTextBox1 ) ;this.MaximizeBox = false ; = "Form1" ;this.Text = "C#来操作⽂本⽂件" ;this.ResumeLayout ( false ) ;}static void Main ( ){Application.Run ( new Form1 ( ) ) ;}private void button1_Click ( object sender , System.EventArgs e ){try{if ( openFileDialog1.ShowDialog ( ) == DialogResult.OK ){FileStream fs = new FileStream ( openFileDialog1.FileName , FileMode.Open , FileAccess.Read ) ;StreamReader m_streamReader = new StreamReader ( fs ) ;//使⽤StreamReader类来读取⽂件m_streamReader.BaseStream.Seek ( 0 , SeekOrigin.Begin ) ;// 从数据流中读取每⼀⾏,直到⽂件的最后⼀⾏,并在richTextBox1中显⽰出内容this.richTextBox1.Text = "" ;string strLine = m_streamReader.ReadLine ( ) ;while ( strLine != null ){this.richTextBox1.Text += strLine + "\n" ;strLine = m_streamReader.ReadLine ( ) ;}//关闭此StreamReader对象m_streamReader.Close ( ) ;}}catch ( Exception em ){Console.WriteLine ( em.Message.ToString ( ) ) ;}}private void button3_Click ( object sender , System.EventArgs e ){try{//获得另存为的⽂件名称if ( saveFileDialog1.ShowDialog ( ) == DialogResult.OK ){//创建⼀个⽂件流,⽤以写⼊或者创建⼀个StreamWriterFileStream fs = new FileStream ( @saveFileDialog1.FileName , FileMode.OpenOrCreate , FileAccess.Write ) ; StreamWriter m_streamWriter = new StreamWriter ( fs ) ;m_streamWriter.Flush ( ) ;// 使⽤StreamWriter来往⽂件中写⼊内容m_streamWriter.BaseStream.Seek ( 0 , SeekOrigin.Begin ) ;// 把richTextBox1中的内容写⼊⽂件m_streamWriter.Write ( richTextBox1.Text ) ;//关闭此⽂件m_streamWriter.Flush ( ) ;m_streamWriter.Close ( ) ;}}catch ( Exception em ){Console.WriteLine ( em.Message.ToString ( ) ) ;}}private void button4_Click ( object sender , System.EventArgs e ){printDialog1.Document = ThePrintDocument ;printDialog1.ShowDialog ( ) ;}//预览打印⽂档private void button2_Click ( object sender , System.EventArgs e ){try{string strText = richTextBox1.Text ;myReader = new StringReader ( strText ) ;PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog ( ) ;printPreviewDialog1.Document = ThePrintDocument ;printPreviewDialog1.FormBorderStyle = FormBorderStyle.Fixed3D ;printPreviewDialog1.ShowDialog ( ) ;}catch ( Exception exp ){Console.WriteLine ( exp.Message.ToString ( ) ) ;}}//打印richTextBox1中的内容private void button5_Click ( object sender , System.EventArgs e ){printDialog1.Document = ThePrintDocument ;string strText = richTextBox1.Text ;myReader = new StringReader ( strText ) ;if ( printDialog1.ShowDialog ( ) == DialogResult.OK ){ThePrintDocument.Print ( ) ;}}protected void ThePrintDocument_PrintPage ( object sender , PrintPageEventArgs ev ){float linesPerPage = 0 ;float yPosition = 0 ;int count = 0 ;float leftMargin = ev.MarginBounds.Left ;float topMargin = ev.MarginBounds.Top ;string line = null ;Font printFont = richTextBox1.Font ;SolidBrush myBrush = new SolidBrush ( Color.Black ) ;//计算每⼀页打印多少⾏linesPerPage = ev.MarginBounds.Height / printFont.GetHeight ( ev.Graphics ) ;//重复使⽤StringReader对象 ,打印出richTextBox1中的所有内容while ( count < linesPerPage && ( ( line = myReader.ReadLine ( ) ) != null ) ){// 计算出要打印的下⼀⾏所基于页⾯的位置yPosition = topMargin + ( count * printFont.GetHeight ( ev.Graphics ) ) ;// 打印出richTextBox1中的下⼀⾏内容ev.Graphics.DrawString ( line , printFont , myBrush , leftMargin , yPosition , new StringFormat ( ) ) ; count++ ;}// 判断如果还要下⼀页,则继续打印if ( line != null )ev.HasMorePages = true ;elseev.HasMorePages = false ;myBrush.Dispose ( ) ;}}。
使用Python实现文件递归遍历的三种方式
使⽤Python实现⽂件递归遍历的三种⽅式今天有个脚本需要遍历获取某指定⽂件夹下⾯的所有⽂件,我记得很早前也实现过⽂件遍历和⽬录遍历的功能,于是找来看⼀看,嘿,不看不知道,看了吓⼀跳,原来之前我竟然⽤了这么搓的实现。
先发出来看看:def getallfiles(dir):"""遍历获取指定⽂件夹下⾯所有⽂件"""if os.path.isdir(dir):filelist = os.listdir(dir)for ret in filelist:filename = dir + "\\" + retif os.path.isfile(filename):print filenamedef getalldirfiles(dir, basedir):"""遍历获取所有⼦⽂件夹下⾯所有⽂件"""if os.path.isdir(dir):getallfiles(dir)dirlist = os.listdir(dir)for dirret in dirlist:fullname = dir + "\\" + dirretif os.path.isdir(fullname):getalldirfiles(fullname, basedir)我是⽤了 2 个函数,并且每个函数都⽤了⼀次 listdir,只是⼀次⽤来过滤⽂件,⼀次⽤来过滤⽂件夹,如果只是从功能实现上看,⼀点问题没有,但是这…太不优雅了吧。
开始着⼿优化,⽅案⼀:def getallfiles(dir):"""使⽤listdir循环遍历"""if not os.path.isdir(dir):print dirreturndirlist = os.listdir(dir)for dirret in dirlist:fullname = dir + "\\" + dirretif os.path.isdir(fullname):getallfiles(fullname)else:print fullname从上图可以看到,我把两个函数合并成了⼀个,只调⽤了⼀次 listdir,把⽂件和⽂件夹⽤ if~else~ 进⾏了分⽀处理,当然,⾃我调⽤的循环还是存在。
c#遍历一个文件夹下的所有文件包括子文件夹
c#遍历一个文件夹下的所有文件包括子文件夹using System;using System.IO;class ListAllFilesDemo{public static void Main(){Console.Write( "请输入要查询的目录: ");string dir = Console.ReadLine();try{ListFiles(new DirectoryInfo(dir));}catch(IOException e){Console.WriteLine(e.Message);}}public static void ListFiles(FileSystemInfo info){if (!info.Exists)return;else{DirectoryInfo dirInfo = info as DirectoryInfo;if (dirInfo != null){foreach (var file in dirInfo.GetFileSystemInfos()){FileInfo fileInfo = file as FileInfo;if (fileInfo != null)Console.WriteLine(fileInfo.FullName);else{listFiles(file as DirectoryInfo);}}}}}}C#中遍历目录下的目录的文件(二)1、遍历一个目录下的全部目录,要用到System.IO.DirectoryInfo 类的GetDirectories方法:DirectoryInfo dir = new DirectoryInfo(@"c:\");foreach(DirectoryInfo dChild in dir.GetDirectories("*")){//如果用GetDirectories("ab*"),那么全部以ab开头的目录会被显示Response.Write( + "<BR>");//打印目录名Response.Write(dChild.FullName + "<BR>");//打印路径和目录名}2、遍历一个目录下的全部文件,要用到System.IO.DirectoryInfo 类的GetFiles方法:DirectoryInfo dir = new DirectoryInfo(@"c:\");foreach(DirectoryInfo dChild in dir.GetFiles("*")){//如果用GetFiles("*.txt"),那么全部txt文件会被显示Response.Write( + "<BR>");//打印文件名Response.Write(dChild.FullName + "<BR>");//打印路径和文件名}如何获取指定目录包含的文件和子目录1. DirectoryInfo.GetFiles():获取目录中(不包含子目录)的文件,返回类型为FileInfo[],支持通配符查找;2. DirectoryInfo.GetDirectories():获取目录(不包含子目录)的子目录,返回类型为DirectoryInfo[],支持通配符查找;3. DirectoryInfo. GetFileSystemInfos():获取指定目录下(不包含子目录)的文件和子目录,返回类型为FileSystemInfo[],支持通配符查找;如何获取指定文件的基本信息;FileInfo.Exists:获取指定文件是否存在;,FileInfo.Extensioin:获取文件的名称和扩展名;FileInfo.FullName:获取文件的全限定名称(完整路径);FileInfo.Directory:获取文件所在目录,返回类型为DirectoryInfo;FileInfo.DirectoryName:获取文件所在目录的路径(完整路径);FileInfo.Length:获取文件的大小(字节数);FileInfo.IsReadOnly:获取文件是否只读;FileInfo.Attributes:获取或设置指定文件的属性,返回类型为FileAttributes枚举,可以是多个值的组合FileInfo.CreationTime、stAccessTime、stWriteTime:分别用于获取文件的创建时间、访问时间、修改时间;采用递归的方式遍历,文件夹和子文件中的所有文件。
两种方法使用VC遍历文件夹下所有文件和文件夹
两种方法使用VC遍历文件夹下所有文件和文件夹1.使用网上最普通的方法find(char * lpPath){char szFind[MAX_PATH];WIN32_FIND_DATA FindFileData;strcpy(szFind,lpPath);strcat(szFind,"*.*");HANDLE hFind=::FindFirstFile(szFind,&FindFileData);if(INVALID_HANDLE_VALUE == hFind) return;while(TRUE){if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){if(FindFileData.cFileName[0]!='.'){strcpy(szFile,lpPath);strcat(szFile,"");strcat(szFile,FindFileData.cFileName);find(szFile);}}else{cout << FindFileData.cFileName;}if(!FindNextFile(hFind,&FindFileData)) break;}FindClose(hFind);}2.利用CFileFind类较简洁的实现该功能void CModelDlg::FindBmpFile(CString strFoldername){CString m_cstrFileList="";CFileFind tempFind;BOOL bFound; //判断是否成功找到文件bFound=tempFind.FindFile(strFoldername + "\\*.*"); /修改" "内内容给限定查找文件类型CString strTmp; //如果找到的是文件夹存放文件夹路径while(bFound) //遍历所有文件{bFound=tempFind.FindNextFile(); //第一次执行FindNextFile 是选择到第一个文件,以后执行为选择//到下一个文件if(!tempFind.IsDots()) continue; //如果找到的是返回上层的目录则结束本次查找if(tempFind.IsDirectory()) //找到的是文件夹,则遍历该文件夹下的文件{strTmp="";strTmp=tempFind.GetFilePath();FindFile(strTmp);}else{strTmp=tempFind.GetFileName(); //保存文件名,包括后缀名// 在此处添加对找到文件的处理}}tempFind.Close(); return;}。
c 遍历文件夹下所有文件的多种方法
c 遍历文件夹下所有文件的多种方法在C语言中,遍历文件夹下所有文件有多种方法,以下是其中几种常见的方法:1. 使用操作系统提供的API大多数操作系统都提供了遍历文件夹的API,例如Windows平台的FindFirstFile和FindNextFile函数,Linux平台的opendir和readdir函数等。
这些API可以遍历文件夹下的所有文件和子文件夹,并返回文件的信息。
以下是一个使用Linux平台opendir和readdir函数的示例代码:```cinclude <>include <>int main() {DIR dir;struct dirent ent;char path[1035];// 打开当前目录dir = opendir(".");if (dir != NULL) {// 遍历目录下的所有文件和子文件夹 while ((ent = readdir(dir)) != NULL) { printf("%s\n", ent->d_name);}closedir(dir);} else {// 打开目录失败perror("");return 1;}return 0;}```2. 使用第三方库除了操作系统提供的API外,还有一些第三方库可以方便地遍历文件夹下的所有文件,例如GLib库中的g_directory_list_all函数。
这些库通常提供了更高级的遍历功能,例如支持递归遍历子文件夹、过滤特定类型的文件等。
3. 使用命令行工具的输出除了编程方式外,还可以使用命令行工具来遍历文件夹下的所有文件,例如Windows平台的dir命令和Linux平台的ls命令。
这些命令可以输出文件夹下的所有文件和子文件夹,并将结果输出到标准输出流中。
可以将命令的输出通过管道传递给C程序的标准输入流中,然后使用C语言的输入输出函数来解析输出结果。
Qt实现遍历文件夹和文件目录(递归)
Qt实现遍历⽂件夹和⽂件⽬录(递归)bool FindFile(const QString & path){QDir dir(path);if (!dir.exists())return false;dir.setFilter(QDir::Dirs|QDir::Files);dir.setSorting(QDir::DirsFirst);QFileInfoList list = dir.entryInfoList();int i=0;do{QFileInfo fileInfo = list.at(i);if(fileInfo.fileName()=="."|fileInfo.fileName()==".."){i++;continue;}bool bisDir=fileInfo.isDir();if(bisDir){nFiles++;std::cout << qPrintable(QString("%1 %2 %3").arg(fileInfo.size(), 10).arg(fileInfo.fileName(),10).arg(fileInfo.path()))<<endl;FindFile(fileInfo.filePath());}else{nFiles++;std::cout << qPrintable(QString("%1 %2 %3").arg(fileInfo.size(), 10).arg(fileInfo.fileName(),10).arg(fileInfo.path()))<<endl;}i++;}while(i<list.size());return true;}详细描述QDir类提供了访问⽬录结构和它们的内容的与平台⽆关的⽅式。
c++的getfilenames用法
一、概述C++中的getfilenames是一个非常有用的函数,它可以用于获取指定目录下的所有文件名。
在实际的编程开发中,我们经常会遇到需要获取某个目录下所有文件名的情况,而getfilenames函数可以帮助我们轻松实现这一功能。
接下来,本文将介绍getfilenames的基本用法及注意事项,以帮助读者更好地掌握这一函数。
二、基本用法1. 包含头文件在使用getfilenames函数之前,首先需要包含相应的头文件。
在C++中,获取文件名的功能通常是由<dirent.h>头文件提供的,因此我们需要在程序中包含这个头文件。
```cpp#include <dirent.h>```2. 打开目录在使用getfilenames函数之前,需要先打开目标目录。
我们可以使用opendir函数来打开目录,它的用法如下:```cppDIR *dir;dir = opendir("path/to/directory");```在上面的代码中,"path/to/directory"是目标目录的路径,需要根据实际情况进行替换。
3. 读取文件名一旦目录打开成功,我们就可以使用getfilenames函数来读取目录下的文件名了。
这里我们可以使用readdir函数来逐个读取文件名,其用法如下:```cppstruct dirent *file;while ((file = readdir(dir)) != NULL) {cout << file->d_name << endl;}```在上面的代码中,file->d_name表示当前读取到的文件名,我们可以通过这个成员来获取目录下的所有文件名。
4. 关闭目录我们需要在程序结束时关闭目录,以释放资源。
这可以通过closedir函数来实现:```cppclosedir(dir);```以上就是使用getfilenames函数的基本流程,通过这些步骤,我们可以轻松地获取指定目录下的所有文件名。
C语言实现二叉树的中序遍历(递归)
C语 言 实 现 二 叉 树 的 中 序 遍 历 ( 递 归 )
二叉树的前序遍历、中序遍历、后续遍历 (包括递归、非递归,共六种) 1、中序遍历(递归): #include #include struct BiTNode//定义结构体 { char data; struct BiTNode *lchild,*rchild; }; void later(struct BiTNode *&p) //前序创建树 { char ch; scanf("%c",&ch); if(ch==' ') p=NULL; else { p=(struct BiTNode *)malloc(sizeof(struct BiTNode)); p->data=ch; later(p->lchild); later(p->rchild); } } void print(struct BiTNode *p) //中序遍历(输出二叉树) { if(p!=NULL) { print(p->lchild); printf("%c",p->data); print(p->rchild); } else printf(" ");
C++遍历指定文件夹中的所有文件
p->fileName=fileName;
p->left=head;
head=p;
return 0;
}
//显示整个查找到的文件的信息
void displayLink(struct fileInfoNode* head)//IN:头结点,值传递参数
while(head!=NULL)
{
fout<<"fileName: "<<head->fileName<<endl;
fout<<"fileSize: "<<dec<<head->fileInfo.size<<"字节"<<endl;
fout<<"fileAttrib: "<<"0x"<<hex<<head->fileInfo.attrib<<endl;
searchAllFile(filePathSub,++layer,fileInfoOut);
layer--;
}
//把搜集到的信息连接到文件
else
{
// cout<<"是文件,存储信息!"<<endl;
// cin.get();
counter++;
_findclose(handle);
//layer==时,完成链表的存储
C++遍历文件夹下所有文件的多种方法
C++遍历⽂件夹下所有⽂件的多种⽅法为数不多的好⽤的代码,遍历⽂件夹获取所有⼦⽂件名,"filespec"可⽤通配符“*?”。
注意如果⽤相对路径的话,获取所有⽂件名后应再调⽤SetInitDir将初始⽬录改为当前⽬录,否则中间⽣成的⽂件都会放在之前的“InitDir”内。
C/C++遍历⽂件夹感觉真是很不好⽤,建议还是使⽤C/C++做单任务处理,然后通过脚本语⾔实现遍历⽐较合理。
CBrowseDir.h#include <io.h>#include <stdlib.h>#include <direct.h>#include <iostream>#include <string>#include <vector>using namespace std;class CBrowseDir{protected://存放初始⽬录的绝对路径,以'\'结尾char m_szInitDir[_MAX_PATH];public://缺省构造器CBrowseDir();//设置初始⽬录为dir,如果返回false,表⽰⽬录不可⽤bool SetInitDir(const char *dir);//开始遍历初始⽬录及其⼦⽬录下由filespec指定类型的⽂件//filespec可以使⽤通配符 * ?,不能包含路径。
//如果返回false,表⽰遍历过程被⽤户中⽌bool BeginBrowse(const char *filespec);vector<string> BeginBrowseFilenames(const char *filespec);protected://遍历⽬录dir下由filespec指定的⽂件//对于⼦⽬录,采⽤迭代的⽅法//如果返回false,表⽰中⽌遍历⽂件bool BrowseDir(const char *dir,const char *filespec);vector<string> GetDirFilenames(const char *dir,const char *filespec);//函数BrowseDir每找到⼀个⽂件,就调⽤ProcessFile//并把⽂件名作为参数传递过去//如果返回false,表⽰中⽌遍历⽂件//⽤户可以覆写该函数,加⼊⾃⼰的处理代码virtual bool ProcessFile(const char *filename);//函数BrowseDir每进⼊⼀个⽬录,就调⽤ProcessDir//并把正在处理的⽬录名及上⼀级⽬录名作为参数传递过去//如果正在处理的是初始⽬录,则parentdir=NULL//⽤户可以覆写该函数,加⼊⾃⼰的处理代码//⽐如⽤户可以在这⾥统计⼦⽬录的个数virtual void ProcessDir(const char *currentdir,const char *parentdir);};CBrowseDir.cpp#include "CBrowseDir.h"CBrowseDir::CBrowseDir(){//⽤当前⽬录初始化m_szInitDirgetcwd(m_szInitDir,_MAX_PATH);//如果⽬录的最后⼀个字母不是'\',则在最后加上⼀个'\'int len=strlen(m_szInitDir);if (m_szInitDir[len-1] != '\\')strcat(m_szInitDir,"\\");}bool CBrowseDir::SetInitDir(const char *dir){return false;//判断⽬录是否存在if (_chdir(m_szInitDir) != 0)return false;//如果⽬录的最后⼀个字母不是'\',则在最后加上⼀个'\'int len=strlen(m_szInitDir);if (m_szInitDir[len-1] != '\\')strcat(m_szInitDir,"\\");return true;}vector<string> CBrowseDir::BeginBrowseFilenames(const char *filespec) {ProcessDir(m_szInitDir,NULL);return GetDirFilenames(m_szInitDir,filespec);}bool CBrowseDir::BeginBrowse(const char *filespec){ProcessDir(m_szInitDir,NULL);return BrowseDir(m_szInitDir,filespec);}bool CBrowseDir::BrowseDir(const char *dir,const char *filespec){_chdir(dir);//⾸先查找dir中符合要求的⽂件long hFile;_finddata_t fileinfo;if ((hFile=_findfirst(filespec,&fileinfo)) != -1){do{//检查是不是⽬录//如果不是,则进⾏处理if (!(fileinfo.attrib & _A_SUBDIR)){char filename[_MAX_PATH];strcpy(filename,dir);strcat(filename,);cout << filename << endl;if (!ProcessFile(filename))return false;}} while (_findnext(hFile,&fileinfo) == 0);_findclose(hFile);}//查找dir中的⼦⽬录//因为在处理dir中的⽂件时,派⽣类的ProcessFile有可能改变了//当前⽬录,因此还要重新设置当前⽬录为dir。
中序遍历二叉树的递归算法c语言代码
中序遍历二叉树的递归算法c语言代码二叉树的中序遍历递归算法是左子树-> 根节点-> 右子树。
以下是C语言代码实现:```c#include <stdio.h>#include <stdlib.h>// 定义二叉树节点结构体struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;};// 定义二叉树中序遍历函数void inorderTraversal(struct TreeNode *root) {if (root == NULL) { // 如果根节点为空,直接返回return;}inorderTraversal(root->left); // 先遍历左子树printf("%d ", root->val); // 输出根节点值inorderTraversal(root->right); // 最后遍历右子树}int main() {// 创建一棵二叉树struct TreeNode *root = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node1 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node2 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node3 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node4 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node5 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node6 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node7 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node8 = (struct TreeNode*)malloc(sizeof(struct TreeNode));struct TreeNode *node9 = (struct TreeNode*)malloc(sizeof(struct TreeNode));node1->val = 1;node1->left = node2;node1->right = node3;node2->val = 2;node2->left = NULL;node2->right = NULL;node3->val = 3;node3->left = node4;node3->right = node5;node4->val = 4;node4->left = NULL;node4->right = NULL;node5->val = 5;node5->left = NULL;node5->right = NULL;root->val = 0; // 设置根节点值为0,这样在遍历时会跳过根节点输出0,避免输出多个根节点值。
CC++遍历目录下的所有文件(Windows篇,超详细)
CC++遍历⽬录下的所有⽂件(Windows篇,超详细)注:1. 本⽂讨论的是怎么⽤Windows API遍历⽬录下的所有⽂件。
除Windows API,还有⼀种Windows/Linux通⽤的⽅式,使⽤<io.h>。
2. 本⽂部分翻译⾃MSDN,翻译可能不准确。
WIN32_FIND_DATA结构遍历⽬录下的⽂件需要⽤到WIN32_FIND_DATA结构。
实际上有两种结构:WIN32_FIND_DATAA和WIN32_FIND_DATAW。
A和W分别代表ASCII和宽字符(Unicode)。
定义UNICODE宏时,WIN32_FIND_DATA指WIN32_FIND_DATAW;否则指WIN32_FIND_DATAA。
下⾯是两个结构的定义(minwinbase.h,VS2015):typedef struct _WIN32_FIND_DATAA {DWORD dwFileAttributes;FILETIME ftCreationTime;FILETIME ftLastAccessTime;FILETIME ftLastWriteTime;DWORD nFileSizeHigh;DWORD nFileSizeLow;DWORD dwReserved0;DWORD dwReserved1;_Field_z_ CHAR cFileName[ MAX_PATH ];_Field_z_ CHAR cAlternateFileName[ 14 ];#ifdef _MACDWORD dwFileType;DWORD dwCreatorType;WORD wFinderFlags;#endif} WIN32_FIND_DATAA;typedef struct _WIN32_FIND_DATAW {DWORD dwFileAttributes;FILETIME ftCreationTime;FILETIME ftLastAccessTime;FILETIME ftLastWriteTime;DWORD nFileSizeHigh;DWORD nFileSizeLow;DWORD dwReserved0;DWORD dwReserved1;_Field_z_ WCHAR cFileName[ MAX_PATH ];_Field_z_ WCHAR cAlternateFileName[ 14 ];#ifdef _MACDWORD dwFileType;DWORD dwCreatorType;WORD wFinderFlags;#endif} WIN32_FIND_DATAW;关于_MAC宏的部分可以忽略,这是有历史原因的——曾今Microsoft是Mac的最⼤开发者,为了⽅便Windows上的应⽤移植到Mac上,就使⽤_MAC宏,如果是Mac操作系统_MAC就是有定义的。
C语言的递归算法解析
C语言的递归算法解析递归算法是一种经常在编程中使用的重要技术。
在C语言中,递归算法可以通过函数的自我调用来实现。
本文将对C语言中的递归算法进行详细解析,并介绍递归算法在实际应用中的一些常见场景。
一、什么是递归算法递归算法是一种通过函数的自我调用来解决问题的方法。
在递归算法中,一个函数可以直接或间接地调用自身。
递归算法通常分为两个部分:基本情况和递归情况。
基本情况是指能够直接解决的问题,而递归情况是指将问题划分为子问题并通过递归调用解决。
递归算法的核心思想是将原问题转化为规模更小的子问题,并通过递归调用解决子问题。
递归算法必须要有一个终止条件,否则会进入无限循环,导致程序崩溃或者运行时间过长。
二、递归算法的实现在C语言中,递归算法可以通过函数的自我调用来实现。
下面是一个求解斐波那契数列的递归算法示例:```c#include <stdio.h>int fibonacci(int n) {if (n == 0 || n == 1) {return n;} else {return fibonacci(n-1) + fibonacci(n-2);}}int main() {int n = 10;int result = fibonacci(n);printf("The %dth Fibonacci number is: %d\n", n, result);return 0;}```在上述代码中,`fibonacci`函数通过递归调用自身来求解斐波那契数列的第n个数。
如果n为0或者1,那么直接返回n,否则将问题划分为求解第n-1个数和第n-2个数的和,并通过递归调用来解决子问题。
三、递归算法的优缺点递归算法具有以下优点:1. 递归算法可以简化问题的解决过程,将大问题划分为小问题,降低了问题解决的复杂度。
2. 递归算法的逻辑清晰,代码简洁,易于理解和维护。
然而,递归算法也存在一些缺点:1. 递归算法需要占用大量的系统栈空间,函数的调用层级过深可能导致栈溢出的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
由于工作中需要使用到遍历目录,所以就自己收集整理相关资料,写了下面的函数,希望对大家有所帮助。
#include <stdio.h>
#include <string.h>
#include <io.h>
#include <stdlib.h>
//将数组myarray的内容复制到数组S中
void initarray(char s[],char myarray[])
{
int i;
for(i=0;i<strlen(myarray);i++)
{
s[i]=myarray[i];
}
s[i]='\0';
strcat(s,"\\");
}
//递归的列出文件夹下所有的子文件夹和文件
//参数path:要进行查找的目录路径
void queryfolder(char path[])
{
struct _finddata_t FileInfo; //_finddata_t是文件信息结构体
long Handle;
char str1[256],str2[256];
initarray(str1,path);
strcat(str1,"*");
initarray(str2,path);
if((Handle=_findfirst(str1,&FileInfo))==-1L) //查找目录中符合条件的文件
printf("没有找到\n");
else
{
//最先找到的是当前文件夹".",所以不用处理
while(!_findnext(Handle,&FileInfo))
{
//printf("%s\n",);
if((FileInfo.attrib & _A_SUBDIR)==16 && strcmp(,".."))
{
//printf("%s是文件夹\n",);
strcat(str2,);
printf("子文件夹:%s\n",str2);
queryfolder(str2);
}
else if(!(FileInfo.attrib & _A_SUBDIR))
{
strcat(str2,);
printf("文件:%s\n",str2);
}
initarray(str2,path);
}
_findclose(Handle);
}
}
int main(void)
{
char fpath[256]="F:\\c";
queryfolder(fpath);
return 0;
}
/*******
struct _finddata_t 是用来存储文件各种信息的结构体
定义如下:
struct _finddata_t
{ unsigned attrib; //文件属性
time_t time_create; //创建时间
time_t time_access; //文件最后一次被访问时间按
time_t time_write; //文件最后一次被修改时间
_fsize_t size; //文件大小
char name[_MAX_FNAME]; //文件名
};
unsigned atrrib:文件属性的存储位置。
它存储一个unsigned单元,用于表示文件的属性。
文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONL Y(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
这些都是在<io.h>中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。
既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,
来得到几个属性的综合。
例如只读+隐藏+系统属性,
应该为:_A_HIDDEN | _A_RDONL Y | _A_SYSTEM 。
*********/。