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 = ...
随机推荐
- Areas on the Cross-Section Diagram
Areas on the Cross-Section Diagram Aizu - ALDS1_3_D Areas on the Cross-Section Diagram 地域の治水対策として.洪 ...
- 第一章-第四题(ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么?软件工程是不是教那些不怎么会写程序的人开发软件? 你怎么看?这个游戏团队, 有很好的软件,但是商业模式和其他软件之外的因素呢?有没有考虑到)--By梁旭晖
引用 http://baike.baidu.com/link?url=z_phkcEO4_HjFG_Lt163dGFAubdb68IbfcfzWscTOrrZ55WbJEQKzyMQ5eMQKyatD ...
- div span
无牵无挂,不带任何样式,因此经常使用div完成整体样式的构建,span完成细微样式的构建. div为块级元素,span为行内元素. 使用div完成显示区域的居中.左右浮动等,完成整体的样式布局,然后在 ...
- java swing文件内容检索工具
Java相关技术 - 文件内容检索工具 拿到一个几百M甚至上G的project让你去学习 有时候你会想知道某个关键词是在哪个文件里 比如:spring MVC配置的@RequestMapping,你从 ...
- NOI上看到的几个小学奥数
:余数相同问题 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为除数分别除a,b,c,得到的余数相同 ...
- CSS之伪元素
1. :first-line 向元素的首行文本添加样式,不必关心首行是元素节点还是文本节点 <style> body,htm,div,p{ margin:0; padding:0; } d ...
- vm网络设置
设置NET模式 cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" BOOTPROTO="stati ...
- Renci.SshNet在Linux运维的应用
SSH.NET是一个.net的SSH应用库,支持并发.该库最新的代码可以从github上下载下来,比Sharp.SSH更新的频繁.它可以模拟ssh登陆,类似xshell.putty等工具.不过有更多的 ...
- QT 调试时出现 During startup program exited with code 0xc0000135 错误
我用的QT creator 5.70 出现上述原因是动态库加载不成功,但是QTcreator 不会提示什么动态库,具体缺乏什么动态库要用VS新建一个工程调用才可以看到,这也是QT Creator很大的 ...
- wdcp安装
下载安装(ssh登录服务器,执行如下操作即可,需要用到root用户权限来安装)v3版本已经发布,更多可看论坛 wdCP v3版本讨论区更多安装请看 http://www.wdlinux.cn/bbs/ ...