#region API 遍历文件夹及其子文件夹和子文件

#region 声明WIN32API函数以及结构 **************************************
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr FindFirstFile(string pFileName, ref Win32FindData pFindFileData);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool FindNextFile(IntPtr hndFindFile, ref Win32FindData lpFindFileData);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool FindClose(IntPtr hndFindFile);

private int FILE_SHARE_READ = 0x00000001;
private int FILE_SHARE_WRITE = 0x00000002;
private int FILE_SHARE_DELETE = 0x00000004;
private int FILE_ATTRIBUTE_READONLY = 0x00000001;
private int FILE_ATTRIBUTE_HIDDEN = 0x00000002;
private int FILE_ATTRIBUTE_SYSTEM = 0x00000004;
private int FILE_ATTRIBUTE_DIRECTORY = 0x00000010;
private int FILE_ATTRIBUTE_ARCHIVE = 0x00000020;
private int FILE_ATTRIBUTE_DEVICE = 0x00000040;
private int FILE_ATTRIBUTE_NORMAL = 0x00000080;
private int FILE_ATTRIBUTE_TEMPORARY = 0x00000100;
private int FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200;
private int FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400;
private int FILE_ATTRIBUTE_COMPRESSED = 0x00000800;
private int FILE_ATTRIBUTE_OFFLINE = 0x00001000;
private int FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000;
private int FILE_ATTRIBUTE_ENCRYPTED = 0x00004000;
private int FILE_ATTRIBUTE_INTEGRITY_STREAM = 0x00008000;
private int FILE_ATTRIBUTE_NO_SCRUB_DATA = 0x00020000;
#endregion

//具体参数方法函数
readonly Stack<KeyValuePair<string, string>> _mScopes = new Stack<KeyValuePair<string, string>>();
private static readonly IntPtr InvalidHandleValue = new IntPtr(-1);
Win32FindData _findFileData;
private IntPtr _hFind = InvalidHandleValue;
private double MAXDWORD = 4294967295;
private void FindFileInDir(string root, string pid, List<UpAndDownFolderInfo> lis)
{
_mScopes.Clear();
KeyValuePair<string, string> kvp = new KeyValuePair<string, string>(root, pid);
start:
string path = kvp.Key;
string parentId = kvp.Value;
new FileIOPermission(FileIOPermissionAccess.PathDiscovery, Path.Combine(path, ".")).Demand();
if (path[path.Length - 1] != '\\')
{
path = path + "\\";
}
_hFind = FindFirstFile(Path.Combine(path, "*"), ref _findFileData);

string guid = Guid.NewGuid().ToString();
UpAndDownFolderInfo udfolder = new UpAndDownFolderInfo
{
CreateDate = DateTime.Now,
LGuid = guid,
Name = path.TrimEnd('\\').Substring(path.TrimEnd('\\').LastIndexOf('\\') + 1),
CreaterGuid = CurRuningData.LoginUser.WGuid,
ParentGuid = parentId,
TransState = (byte)EUpAndDownFileStateType.正在传输,
WGuid = guid,
WorkType = (byte)EUpAndDownFileWorkType.上传
};
do
{
if (_hFind != InvalidHandleValue)
{
//将本目录和上一层目录过滤掉
if (_findFileData.cFileName.Equals(@".") || _findFileData.cFileName.Equals(@"..") || _findFileData.dwFileAttributes == (int)FileAttributes.Hidden)
continue;
//如果是文件夹
if ((_findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY &&
(_findFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != FILE_ATTRIBUTE_HIDDEN)
{
_mScopes.Push(new KeyValuePair<string, string>(Path.Combine(path, _findFileData.cFileName), udfolder.LGuid));
}
//反之则是文件
else
{
string ft = _findFileData.cFileName.Substring(_findFileData.cFileName.LastIndexOf('.') + 1);
if (ft != "wjyishandsomeboy" && (_findFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != FILE_ATTRIBUTE_HIDDEN)
{
UpAndDownFileInfo udfile = new UpAndDownFileInfo
{
CreateDate = DateTime.Now,
CreaterGuid = CurRuningData.LoginUser.WGuid,
FilePath = path + _findFileData.cFileName,
FileType = ft,
LGuid = Guid.NewGuid().ToString(),
Name = _findFileData.cFileName,//.Substring(0, _findFileData.cFileName.LastIndexOf('.') - 1),
ParentGuid = udfolder.LGuid,
TransState = (byte)EUpAndDownFileStateType.等待传输,
UsedSpaceSizeB = (long)(_findFileData.nFileSizeHigh * (MAXDWORD + 1) + _findFileData.nFileSizeLow),
WGuid = Guid.Empty.ToString(),
WorkType = (byte)EUpAndDownFileWorkType.上传,
MD5 = ""//FileHelper.GetMD5(path + _findFileData.cFileName)
};
udfolder.ChildFiles.Add(udfile);
}
}
}
}
while (FindNextFile(_hFind, ref _findFileData));
lis.Add(udfolder);
FindClose(_hFind);
if (_mScopes.Count > 0)
{
kvp = _mScopes.Pop();
goto start;
}
}

#endregion

windowsAPI遍历文件夹(速度高于递归)的更多相关文章

  1. JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

  2. Java File类应用:递归遍历文件夹和递归删除文件

    要求: 1)采用递归遍历文件夹下的所有文件,包括子文件夹下的文件 2)采用递归删除文件下的所有文件 注意: 以下递归删除文件的方法,只能删除文件,所有的文件夹都还会存在 若要删除正文文件夹,可以在递归 ...

  3. linux文件夹操作及递归遍历文件夹

    文件夹相关函数介绍 //mkdir 函数创建文件夹 #include <sys/stat.h> #include <sys/types.h> int mkdir(const c ...

  4. Python【day 14-2】递归遍历文件夹

    #需求 遍历文件夹中所有的子文件夹及子文件--用递归实现 '''''' ''' 伪代码 1.遍历根目录--listdir for 得到第一级子文件夹(不包含子文件夹的子文件)和文件 2.判断是文件还是 ...

  5. TypeScript ES6-Promise 递归遍历文件夹中的文件

    貌似很多人都爱用这个作为写文章的初尝试,那来吧.遍历文件夹下的所有文件,如遍历文件夹下并操作HTML/CSS/JS/PNG/JPG步骤如下:1.传入一个路径,读取路径里面所有的文件:2.遍历读取的文件 ...

  6. PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹

    PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹 一.使用递归获取树形菜单 数据表category(id,name,parent_id) <?php class category{ / ...

  7. Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合

    复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...

  8. java 遍历文件夹里的文件

    Java遍历文件夹的2种方法: A.不使用递归: import java.io.File; import java.util.LinkedList; public class FileSystem { ...

  9. JAVA 遍历文件夹下的所有文件

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

随机推荐

  1. Oracle数据库字符集试验

    对于初学者我们可以理解字符集就是一种字符编码方式,试想人可以直接语言进行交流,使用文字进行记录,而计算机却不认得我们人类创立的文字,计算机只认得0和1这样的二进制代码.当我们要通过计算机记录文字信息的 ...

  2. USACO翻译:USACO 2014 MARCH GOLD P2 Sabotage

    1.破坏{DOLD题2} sabotage.pas/c/cpp [问题描述] 农夫约翰的头号敌人保罗决定破坏农民约翰的挤奶设备.挤奶设备排成一行,共N(3<= N <=100000)台挤奶 ...

  3. 安卓中級教程(7):annotation中的 public @interface的用法

    package com.example.ele_me.util; import java.lang.annotation.Retention; import java.lang.annotation. ...

  4. MySQL数据的主从复制、半同步复制和主主复制详解

    一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...

  5. JMeter之JMS接口测试

    JMeter是Apache开发的一款小巧易用的开源性能测试工具,由java语言开发.JMeter不仅免费开源而且功能强大.易于扩展,如果有一定Java开发基础的话还可以在JMeter上做扩展开发新的插 ...

  6. TypeScript 自动编译

    安装Typescript npm install -g typescript 手动编译 tsc greeter.ts 自动编译 tsc -w greeter.ts

  7. Mvc自定义路由让支持.html的格式

    前言 在大多时候,我们都需要自定义路由,当我们设置为/list/1.html的时候,有的时候会出现以下异常. routes.MapRoute( "category", // 路由名 ...

  8. imx6 关闭调试串口

    需要关闭imx6调试串口,用作普通的串口使用. 参考链接 http://blog.csdn.net/neiloid/article/details/7585876 http://www.cnblogs ...

  9. 移动BI来袭我们要做哪些准备?

    (了解更多商业智能行业资讯.商业智能BI解决方案.商业智能客户案例,请访问:http://www.powerbi.com.cn/service) 随着智能手机的发展,商业智能(BI)基础架构也扩展到移 ...

  10. AngularJS 2.0

    https://angular.io/docs/ts/latest/guide/learning-angular.html QuickStart: git clone https://github.c ...