程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Win32非遞歸遍歷和搜索文件以及目錄算法,win32遞歸

Win32非遞歸遍歷和搜索文件以及目錄算法,win32遞歸

編輯:C++入門知識

Win32非遞歸遍歷和搜索文件以及目錄算法,win32遞歸


轉載請注明來源:http://www.cnblogs.com/xuesongshu

要點:

1、搜索的頂層目錄在進入循環之前進棧

2、棧元素存儲字符串指針,出棧時釋放資源

3、每次循環開始,棧頂元素出棧

4、在遍歷一個文件夾時,遇到子文件夾則進棧

5、外層循環以堆棧是否為空為標志,內層循環以FindNextFile返回值為標志

6、本搜索算法適用於按關鍵字搜索,當文件夾名稱符合搜索條件時文件夾作為搜索結果通知調用者,不會入棧。

7、回調函數地址使用long型傳遞

8、本程序功能是批量增加、修改或者刪除指定文件夾下所有文件前綴,附帶遍歷功能。在參照流程圖編寫實現代碼時與流程圖所畫邏輯會稍有出入。

流程圖如下:

需要引入的頭文件:

#include <stack>
#include <iostream>
#include <fstream>
#include <list>
#include <set>

  

回調函數定義:

typedef HRESULT (__stdcall *XCallbackMethodType)(HWND,BSTR,int);

  

實現代碼如下:

STDMETHODIMP CFileTool::SearchFiles(BSTR topDirectoryName, BSTR key, HWND mainWnd,long callbackAddress)
{
	HINSTANCE dllInst=(HINSTANCE)GetModuleHandle(L"xssfj.dll");

	WCHAR finishedMsg[256]={0};
	LoadString(dllInst,IDS_FILE_DELETESPECIFY_SEARCHSUCCESS,finishedMsg,256);
	XCallbackMethodType callbackMsg=(XCallbackMethodType)callbackAddress;
	DWORD attribute=GetFileAttributesW(topDirectoryName);
	if(!(attribute&FILE_ATTRIBUTE_DIRECTORY))
		return E_INVALIDARG;
	if(!callbackMsg)
		return E_INVALIDARG;
	if(StrStrI(topDirectoryName,key))
	{
		callbackMsg(mainWnd,topDirectoryName,2);
		callbackMsg(mainWnd,finishedMsg,0);
		return S_OK;
	}
	std::stack<WCHAR*> directoryNameStack;
	WCHAR* tmpStackData=(WCHAR*)calloc(MAX_PATH,sizeof(WCHAR));
	lstrcpyW(tmpStackData,topDirectoryName);
	directoryNameStack.push(tmpStackData);
	while(!directoryNameStack.empty())
	{
		WCHAR* currentDirName=directoryNameStack.top();
		directoryNameStack.pop();
		callbackMsg(mainWnd,currentDirName,1);
		WCHAR tmpParentPath[MAX_PATH]={0};
		lstrcpy(tmpParentPath,currentDirName);
		if(currentDirName[lstrlen(currentDirName)-1]!='\\')
		{
			lstrcat(tmpParentPath,L"\\");
			lstrcat(currentDirName,L"\\*.*");
		}
		else
			lstrcat(currentDirName,L"*.*");
		WIN32_FIND_DATA meiju={0};

		HANDLE tmpHandle=FindFirstFile(currentDirName,&meiju);
		if(tmpHandle!=INVALID_HANDLE_VALUE&&tmpHandle)
		{
			if(lstrcmpW(meiju.cFileName,L".")!=0&&lstrcmpW(meiju.cFileName,L"..")!=0)
			{
				if(StrStrI(meiju.cFileName,key))
				{
					WCHAR tmpFsObj[MAX_PATH]={0};
					lstrcpyW(tmpFsObj,tmpParentPath);
					lstrcat(tmpFsObj,meiju.cFileName);
					callbackMsg(mainWnd,tmpFsObj,2);
				}
			}
			do
			{
				DWORD tmpFileResult=FindNextFile(tmpHandle,&meiju);
				if(tmpFileResult==ERROR_NO_MORE_FILES||tmpFileResult==0)
					break;
				if(lstrcmpW(meiju.cFileName,L".")==0||lstrcmpW(meiju.cFileName,L"..")==0)
					continue;
				if(StrStrI(meiju.cFileName,key))
				{
					WCHAR tmpFsObj[MAX_PATH]={0};
					lstrcpyW(tmpFsObj,tmpParentPath);
					lstrcat(tmpFsObj,meiju.cFileName);
					callbackMsg(mainWnd,tmpFsObj,2);
				}
				else
				{
					WCHAR tmpFsobjPath[MAX_PATH]={0};
					lstrcpy(tmpFsobjPath,tmpParentPath);
					lstrcat(tmpFsobjPath,meiju.cFileName);
					callbackMsg(mainWnd,tmpFsobjPath,1);
					DWORD tmpFileAttribute=GetFileAttributes(tmpFsobjPath);
					if(tmpFileAttribute&FILE_ATTRIBUTE_DIRECTORY)
					{
						WCHAR* tmpData=(WCHAR*)calloc(MAX_PATH,sizeof(WCHAR));
						lstrcpy(tmpData,tmpFsobjPath);
						directoryNameStack.push(tmpData);
					}
				}
			}
			while(true);
			FindClose(tmpHandle);
		}
		free(currentDirName);
	}
	callbackMsg(mainWnd,finishedMsg,0);
	return S_OK;
}

  


使用java遞歸方法遍歷指定目錄下所有子目錄與子文件

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
* 讀取目錄及子目錄下指定文件名的路徑 並放到一個數組裡面返回遍歷
* @author zdz8207
*
*/
public class FileViewer {
public static void main(String[] args) {
//List arrayList = FileViewer.getListFiles("d:/com","html",true);

//讀取d:/com下的以java 結尾的文件 如有子目錄,包含之(後綴名為null則為所有文件)
//List arrayList = FileViewer.getListFiles("d:/com","java",true);

//經試驗,後綴不能不填寫,否則編譯不通過,提示“FileViewer.java:17: 非法的表達式開始”。
//另外後綴為""時的情況需要 增加到IF 裡去,否則 後綴為""時,不會顯示所有文件
List arrayList = FileViewer.getListFiles("d:/com","",true);
if(arrayList.isEmpty())
{
System.out.println("沒有符號要求的文件");
}
else
{
String message = "";
message += "符號要求的文件數:" + arrayList.size() + "\r\n";
System.out.println(message);

for (Iterator i = arrayList.iterator(); i.hasNext();)
{
String temp = (String) i.next();
System.out.println(temp);
message += temp + "\r\n";
}
//將顯示的文件路徑寫到指定的文件裡,若文件不存在,則提示IO異常
//java.io.FileNotFoundException: d:\ajax\menu.txt (系統找不到指定的路徑。)
//如果 加個文件是否存在的判斷,如不存在就在當前目錄新建一個,則更好。
appendMethod("d:/menu.txt",message);
}
}
public static List<String> fileList = new ArrayList<String>();

/**
*
* @param path 文件路徑
* @param suffix 後綴名
* @param isdepth ......余下全文>>
 

編寫一個程序,實現二叉樹的先序遍歷,中序遍歷,後序遍歷的各種遞歸與非遞歸算法,以及層次遍歷的算法

文件 main.cpp 代碼如下:

#include<malloc.h> // malloc()等
#include<stdio.h> // 標准輸入輸出頭文件,包括EOF(=^Z或F6),NULL等
#include<stdlib.h> // atoi(),exit()
#include<math.h> // 數學函數頭文件,包括floor(),ceil(),abs()等

#define ClearBiTree DestroyBiTree // 清空二叉樹和銷毀二叉樹的操作一樣

typedef struct BiTNode
{
int data; // 結點的值
BiTNode *lchild,*rchild; // 左右孩子指針
}BiTNode,*BiTree;

int Nil=0; // 設整型以0為空
void visit(int e)
{ printf("%d ",e); // 以整型格式輸出
}
void InitBiTree(BiTree &T)
{ // 操作結果:構造空二叉樹T
T=NULL;
}

void CreateBiTree(BiTree &T)
{ // 算法6.4:按先序次序輸入二叉樹中結點的值(可為字符型或整型,在主程中定義),
// 構造二叉鏈表表示的二叉樹T。變量Nil表示空(子)樹。修改
int number;
scanf("%d",&number); // 輸入結點的值
if(number==Nil) // 結點的值為空
T=NULL;
else // 結點的值不為空
{ T=(BiTree)malloc(sizeof(BiTNode)); // 生成根結點
if(!T)
exit(OVERFLOW);
T->data=number; // 將值賦給T所指結點
CreateBiTree(T->lchild); // 遞歸構造左子樹
CreateBiTree(T->rchild); // 遞歸構造右子樹
}
}

void DestroyBiTree(BiTree &T)
{ // 初始條件:二叉樹T存在。操作結果:銷毀二叉樹T
if(T) // 非空樹
{ DestroyBiTree(T->lchild); // 遞歸銷毀左子樹,如無左子樹,則不執行任何操作
DestroyBiTree(T->rchild); // 遞歸銷毀右子樹,如無右子樹,則不執行任何操作
free(T); // 釋放根結點
T=NULL; // 空指針賦0
}
}

void PreOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始條件:二叉樹T......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved