windowsAPI遍历文件夹(速度高于递归)
#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遍历文件夹(速度高于递归)的更多相关文章
- JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)
JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...
- Java File类应用:递归遍历文件夹和递归删除文件
要求: 1)采用递归遍历文件夹下的所有文件,包括子文件夹下的文件 2)采用递归删除文件下的所有文件 注意: 以下递归删除文件的方法,只能删除文件,所有的文件夹都还会存在 若要删除正文文件夹,可以在递归 ...
- linux文件夹操作及递归遍历文件夹
文件夹相关函数介绍 //mkdir 函数创建文件夹 #include <sys/stat.h> #include <sys/types.h> int mkdir(const c ...
- Python【day 14-2】递归遍历文件夹
#需求 遍历文件夹中所有的子文件夹及子文件--用递归实现 '''''' ''' 伪代码 1.遍历根目录--listdir for 得到第一级子文件夹(不包含子文件夹的子文件)和文件 2.判断是文件还是 ...
- TypeScript ES6-Promise 递归遍历文件夹中的文件
貌似很多人都爱用这个作为写文章的初尝试,那来吧.遍历文件夹下的所有文件,如遍历文件夹下并操作HTML/CSS/JS/PNG/JPG步骤如下:1.传入一个路径,读取路径里面所有的文件:2.遍历读取的文件 ...
- PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹
PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹 一.使用递归获取树形菜单 数据表category(id,name,parent_id) <?php class category{ / ...
- Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合
复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...
- java 遍历文件夹里的文件
Java遍历文件夹的2种方法: A.不使用递归: import java.io.File; import java.util.LinkedList; public class FileSystem { ...
- JAVA 遍历文件夹下的所有文件
JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...
随机推荐
- php 开启socket配置
我在Windows命令行输入命令:C:\wamp\bin\php\php5.2.6\php.exe getXml.php以执行php文件. 出现错误:Fatal error: Call to unde ...
- *HDU3047 并查集
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- ArcEngine 岛状多边形内部环的获取
ArcEngine岛状多边形获取其内部环 查阅了帮助文档相关接口,内部环的获方法get_InteriorRingBag() 需要外部环作为参数.而外部环可以直接通过ExteriorRingBag属性获 ...
- Objective-O Runtime 运行时初体验
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...
- jquery插件学习之元素顶部悬浮
jquery插件的学习: HTML部分及应用 <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...
- iOS 面试题(一):寻找最近公共 View --转自唐巧
题目:找出两个 UIView 的最近的公共 View,如果不存在,则输出 nil . 分析:这其实是数据结构里面的找最近公共祖先的问题. 一个 UIViewController 中的所有 view 之 ...
- Python开发程序:RPC异步执行命令(RabbitMQ双向通信)
RPC异步执行命令 需求: 利用RibbitMQ进行数据交互 可以对多台服务器进行操作 执行命令后不等待命令的执行结果,而是直接让输入下一条命令,结果出来后自动打印 实现异步操作 不懂rpc的请移步h ...
- Android 基于Android的手机邮件收发(JavaMail)之二( Welcome.java 和 ReceiveAndSend.java )
周末休息,这次我们继上次内容继续.上一篇内容我们讲述的是一些准备工作.下载两个javamail.jar和activation.jar文件,然后再BuildPath~ 言归正传,为了展示效果,在这里我申 ...
- 【翻译】如何给tomcat配置memcached-session-manager
原文在这 ,其实不是忠实翻译,就是按照自己理解记录一下 第一步,下载所需的jar包 下载 memcached-session-manager-x.y.z.jar, memcached-session- ...
- lua 类支持属性不能被修改
背景 lua是类是借助表的来实现的, 类被定义后, 在使用场景下, 不希望被修改.如果被修改, 则影响的类的原始定义, 影响所有使用类的地方. 例如: --- router.lua class fil ...