获取本地文件然后批量存储到数据库
能遍历路径获取全部数据(根据File.length)获取当前遍历的进度条,然后存储到表里面,并通过SqlBulkCopy的WriteToServer方法存储到数据库中,有进度条。
先建立一个目录结构体 用来存储数据
默认结构是
public struct FileTree { public string FileName; public long FileSize; /// <summary> /// 0是文件夹。1是文件 /// </summary> public int Type; //如果想修改上级目录名称等可以不写路径,根据HeighID遍历路径 public string path; //上级id public string HeighID; //完整ID 默认 E盘_1_1 是当前文件夹id(int 自增)+HeighID public string CompleteID; //层次结构 public List<FileTree> FileOrDirData; }
因为批量插入走的路线是SqlBulkCopy.WriteToServer ,先建立一个表,表头名称和字段类型要和数据库的一致。
public long Size;//通过size判断遍历进度
Expression<Func<FileTree, FileTree>> AllFileTree = a => new FileTree { };
public static DataTable dt1 = new DataTable();
dt1.Columns.Add("FileName", typeof(string)); dt1.Columns.Add("FileSize", typeof(long)); dt1.Columns.Add("type", typeof(int)); dt1.Columns.Add("path", typeof(string)); // dt1.Columns.Add("FileID", typeof(int)); dt1.Columns.Add("HeighID", typeof(string)); dt1.Columns.Add("CompleteID", typeof(string));
然后递归遍历数据库
FileTree FileTree1 = t.GetExpression(new FileTree { FileName = "E盘", CompleteID = "01E", HeighID = "0", path = "", Type = -1 }, "E:\\", out size); public FileTree GetExpression(FileTree filetree, string Path, out long driver) { driver = 0; if (!Directory.Exists(Path)) return filetree; DirectorySecurity dir = new DirectorySecurity(Path, AccessControlSections.Access); if (!dir.AreAccessRulesProtected && !dir.AreAuditRulesProtected) { long DirSize = 0; int i = 0; filetree.FileOrDirData = new List<FileTree>(); foreach (DirectoryInfo item in new DirectoryInfo(Path).GetDirectories()) { if (item.FullName.Contains("System Volume Information")) continue; i++; DirSize = 0; /*filetree.FileOrDirData.Add(*/ GetExpression(new FileTree { FileName = item.Name, /*FileID = i,*/ path = item.FullName, HeighID = filetree.CompleteID, CompleteID = filetree.CompleteID + "_" + i, Type = 0 }, item.FullName, out DirSize); //filetree.FileSize += DirSize; driver += DirSize; dt1.Rows.Add(item.Name, DirSize, 0, item.FullName,/* i,*/ filetree.CompleteID, filetree.CompleteID + "_" + i); } foreach (FileInfo item in new DirectoryInfo(Path).GetFiles()) { i++; driver += item.Length; Size += item.Length; //filetree.FileOrDirData.Add(new FileTree { FileName = item.Name, FileID = i, path = item.FullName, HeighID = filetree.FileID, CompleteID = filetree.CompleteID + "_" + i, FileSize = item.Length, Type = 1 }); dt1.Rows.Add(item.Name, item.Length, 1, item.FullName/*, i*/, filetree.CompleteID, filetree.CompleteID + "_" + i); // filetree.FileSize += item.Length; } } // filetree.FileOrDirData.Add(GetExpression(filetree, Path)); //} return filetree; } }
然后对表dt1进行批量插入操作.
using (SqlConnection conn = new SqlConnection("Server = .; Database =DB; user = sa; pwd =*********")) { SqlBulkCopy bulkCopy = new SqlBulkCopy(conn); //数据库的名称。 bulkCopy.DestinationTableName = "AllFileData"; //一次写入数据库的数量,因为如果数目过大会造成崩溃等,只单纯的定义数量,但不同的数量速度有影响。 bulkCopy.BatchSize = count ?? ExpressionWithFile.dt1.Rows.Count; //进度条使用,当插入多少条触发BulkCopy_SqlRowsCopied事件。 bulkCopy.NotifyAfter = ExpressionWithFile.dt1.Rows.Count / 100; bulkCopy.SqlRowsCopied += BulkCopy_SqlRowsCopied; conn.Open(); if (ExpressionWithFile.dt1 != null && ExpressionWithFile.dt1.Rows.Count != 0) { bulkCopy.WriteToServer(ExpressionWithFile.dt1); } bulkCopy.Close(); new Action(() => { progressBarX1.Value = progressBarX1.Maximum; progressBarX1.Text = "目录提取完成"; }).Invoke(); }
private void BulkCopy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
++progressBarX1.Value;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!