#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. 2016huasacm暑假集训训练四 DP_B

    题目链接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/M 题意:有N件物品和一个容量为V的背包.第i件物品的费用是体积c[i],价值是w[ ...

  2. QT的程序开机自启动方法

    /home/fa/.config/lxsession/LXDE/autostart文件最后添加脚本

  3. 巧妙利用before和after伪类实现文字的展开和收起

    需求:一段文字,当收起的时候,显示4行,并且多余4行的部分用省略号表示,关键是在省略号前面留有空白部分来放一些图标等东西:展开的时候,全部显示. 例如下面的示例图: 收起的时候: 展开的时候: 在不用 ...

  4. [不好分类]SD卡无法读取,显示RAW

    上周同事拿来了一个8G的SD卡,插入读卡器后显示“需要格式化”.无法读取.文件格式处显示“RAW”,磁盘大小显示0字节. 处理步骤如下: 1.按照提示,格式化,选择“快速格式化”. 2.采用数据恢复软 ...

  5. 原来 laravel 路由 参数可以为可选。。。 很灵活

    基本路由 您的应用程序的绝大多数路由将在 app/routes.php 文件中定义.Laravel 中最简单的路由由一个 URI 和一个闭包调用组成. 基本 GET 路由 复制代码代码如下: Rout ...

  6. 解决svn working copy locked问题

    标题:working copy locked 提示:your working copy appears to be locked. run cleanup to amend the situation ...

  7. Android开发环境搭建之Eclipse/AndroidStudio

    时隔两年之后,回头来整理曾经走过的Android开发之路.记录下开发环境的配置,也方便与新入门的小伙伴们快速搭建自己的Android平台. 一.Android SDK Manager 1.下载与安装[ ...

  8. JavaScript的3大组成部分&&ECMAScript函数&&闭包

    1.JavaScript实现是由ECMAScript.DOM和BOM组成.a.ECMAScript仅仅是一个描述,定义了脚本语言的所有属性.方法和对象.b.DOM[文档对象模型]是HTML和XML的应 ...

  9. 关于AFNetworking中header的bug问题

    关于AFNetworking中header的bug问题 [摘要:AFNetworking那个正在ios开辟中便未几道了,网上一搜一大推,然则详细用法我便没有道了,偶然间我会整顿一下详细的一些用法.本日 ...

  10. 《linux内核设计与实现》读书笔记第十七章

    第17章 设备与模块 四种内核成分 设备类型:在所有 Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对象:内核数据结构中支持面向 ...