• (转)非递归实现文件夹遍历


    原文地址:http://www.cnblogs.com/hlxs/p/3760827.html

    思路简单介绍:

    1:先将这个文件夹的路径加入一个队列中;

    2:判断队列的元素个数是否大于0,如果元素个数大于0,遍历第一个元素对应的文件夹,用一个变量fileCounts记录这个文件夹中文件的个数,如果这个文件夹中有文件夹,就将这个文件夹的路径加入队列中,扫描完一个文件夹后,第一个元素弹出队列,继续执行第二步,如果队列中没有元素,就执行第三步;

    3:退出循环

    C++

    #include "stdafx.h"
    #include <Windows.h>
    #include <iostream>
    #include <queue>
    using namespace std;
    
    int QueryFileCounts( LPCTSTR Path )
    {
        queue<std::wstring> qFolders; 
        qFolders.push(Path);
    
        int fileCounts = 0;   
        WIN32_FIND_DATA findResult;
        HANDLE handle=NULL;
          
        while(qFolders.size()>0)
        { 
            std::wstring tempFolder = qFolders.front();
            tempFolder.append(L"\*.*");
            handle = FindFirstFile(tempFolder.c_str(), &findResult);
            do
            {   
                if (findResult.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                    if (lstrcmp(L".",findResult.cFileName)==0 || lstrcmp(L"..",findResult.cFileName)==0)
                    {
                        continue;
                    } 
                    tempFolder=qFolders.front();
                    tempFolder.append(L"\").append(findResult.cFileName);
                    qFolders.push(tempFolder); 
                }else{
                    fileCounts++;
                } 
            }
            while (FindNextFile(handle, &findResult));
            qFolders.pop();
        } 
        if (handle)
        {
            FindClose(handle);
            handle = NULL;
        } 
        return fileCounts;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        {    
            cout<< "文件个数:"<<QueryFileCounts(L"D:\feinno\RunImage")<<endl; 
        }
        system("pause");
        return 0;
    }

    C#

    using System;
    using System.Collections.Generic;
    namespace FileFind
    {  
        class Program
        {
            [Serializable, System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential,
                CharSet = System.Runtime.InteropServices.CharSet.Auto),System.Runtime.InteropServices.BestFitMapping(false)]
            private struct WIN32_FIND_DATA
            {
                public int dwFileAttributes;
                public int ftCreationTime_dwLowDateTime;
                public int ftCreationTime_dwHighDateTime;
                public int ftLastAccessTime_dwLowDateTime;
                public int ftLastAccessTime_dwHighDateTime;
                public int ftLastWriteTime_dwLowDateTime;
                public int ftLastWriteTime_dwHighDateTime;
                public int nFileSizeHigh;
                public int nFileSizeLow;
                public int dwReserved0;
                public int dwReserved1;
                [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr,SizeConst = 260)]
                public string cFileName;
                [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr,SizeConst = 14)]
                public string cAlternateFileName;
            }
            [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
            private static extern IntPtr FindFirstFile(string pFileName, ref WIN32_FIND_DATA pFindFileData);
            [System.Runtime.InteropServices.DllImport("kernel32.dll",CharSet = System.Runtime.InteropServices.CharSet.Auto,SetLastError = true)]
            private static extern bool FindNextFile(IntPtr hndFindFile, ref WIN32_FIND_DATA lpFindFileData);
            [System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
            private static extern bool FindClose(IntPtr hndFindFile);
     
            static int QueryFileCounts( string Path )
            {
                Queue<string> qFolders=new Queue<string>(); 
                qFolders.Enqueue(Path);
                IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
                int fileCounts = 0;   
                WIN32_FIND_DATA FindFileData=new WIN32_FIND_DATA();
                System.IntPtr hFind=INVALID_HANDLE_VALUE;
                  
                while(qFolders.Count>0)
                {
                    string floder=qFolders.Dequeue(); 
                    string tempFolder = floder;
                    tempFolder+="\*.*";
                    hFind = FindFirstFile(tempFolder ,ref FindFileData);
                    if (hFind == INVALID_HANDLE_VALUE)
                    {
                        continue;
                    }
                    do
                    {
                        if ((FindFileData.dwFileAttributes & 0x10) != 0)
                        {
                            if (FindFileData.cFileName.Equals(".") || FindFileData.cFileName.Equals(".."))
                            { 
                                continue;
                            }
                            tempFolder=floder+"\"+FindFileData.cFileName;
                            qFolders.Enqueue(tempFolder); 
                        }else{
                            fileCounts++;
                        } 
                    }
                    while (FindNextFile(hFind,ref FindFileData));
                }
                if (hFind != INVALID_HANDLE_VALUE)
                {
                    FindClose(hFind);
                } 
                return fileCounts;
            }
    
            static void Main(string[] args)
            {
                int count=QueryFileCounts(@"D:\feinno\RunImage");
                Console.WriteLine("文件个数:" + count );
                Console.Read();
            }
        }
    }
  • 相关阅读:
    (转) c++ 迭代器
    (转) 学习C++ -> 向量(vector)
    latex 模版
    javascript继承篇
    ES6的Map和Set的使用,以及weakMap的一点理解
    JavaScript中的eval函数
    Node.js中的进程与线程
    普通函数与箭头函数的区别是什么?
    git 远程拉去代码 输入用户名密码
    npm 设置镜像
  • 原文地址:https://www.cnblogs.com/hhhh2010/p/8675779.html
Copyright © 2020-2023  润新知