#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. iOS CADisplayLink 定时器的使用

    CADisplayLink 是一个能让我们以和屏幕刷新频率相同的频率将内容刻画到屏幕上的定时器,在应用中创建一个新的CADisplayLink对象,把他添加到一个runloop中,并且给他提供一个ta ...

  2. 字符串转数字_atoi_stringstream

    一.#include <cstdlib> 字符串转换到整型数,函数原型:int atoi(const char *nptr) 注意事项:有符号整型,能转换的最大字符串是:"214 ...

  3. 怎么使用CKEDITOR

    出于工作需求,自己在网上找了个文本编辑器控件, 网址是http://ckeditor.com/ 怎么使用? 先插入脚本<script type="text/javascript&quo ...

  4. 20145215实验二 Java面向对象程序设计

    一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 二.实验步骤 (一)单元测试 (1)三种代码 伪代码: ...

  5. Unity学习疑问记录之触摸点坐标

    Vector3 pos=Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position); 类似的鼠标点击Camera.main.ScreenToW ...

  6. 解决导入so库报错小结

    最近公司准备将重构后的项目上线,可是等到我接手的时候发现一个很纠结的问题:安卓5.0以上的手机(例如我现在在用的红米note3)运行重构后项目发生报错,提示缺少某so库. 而5.0以下的手机(我的小米 ...

  7. HDU 3605 Escape(状压+最大流)

    Escape Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  8. “菜”鸟理解.NET Framework(CLI,CLR,CTS,CLS,BCL,FCL)

    既然要学.NET,就要先认识认识她,我不喜欢大段大段文字的东西,自己通过理解,画个图,来看看.NET的沉鱼落雁,闭月羞花之容. 最下层蓝色部分是.NET Framework的基础,也是所有应用软件的基 ...

  9. JDBC的使用(一):引用外部jar;代码链接数据库

    一:引用外部jar 1.首先不jar文件放到项目下: 2.在Eclipse中,右键相应的项目--构建路径--配置构建路径--库--添加外部jar:选中-打开-应用-确定. 二:代码链接数据库 1.加载 ...

  10. jQuery 一句代码返回顶部

    兼容各大主流浏览器,jQuery返回顶部,一句代码搞定 <a class="top" href="javascript:;" style="po ...