zoukankan      html  css  js  c++  java
  • 获取本地文件然后批量存储到数据库

    能遍历路径获取全部数据(根据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;
                   }

     
  • 相关阅读:
    monit官方摘录
    monit配置文件
    monit检测语法
    monit介绍和配置
    ganglia-gmond.conf配置文件
    ganglia问题汇总
    ganglia使用nagios告警
    ganglia-gmetad 配置文件
    监控项目
    监控方案
  • 原文地址:https://www.cnblogs.com/niubi007/p/8474439.html
Copyright © 2011-2022 走看看