亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

多線程處理大量文件

2019-11-17 01:39:32
字體:
來源:轉載
供稿:網友

多線程處理大量文件

上周做了一個多線程處理大量文件的功能 一是記錄 二是分享 三是請博友指出不足 更多的了解多線程。

1.任務:將大量(大約5G)一目錄下有日期規則命名的html文件按照年月日三個層次目錄存放,目的是為了提高文件檢索效率。

2.具體實現:開啟10個線程 將文件拷貝到目標文件夾;不符合要求的文件拷貝到別處;記錄錯誤信息和不符合要求的信息;循環判斷狀態 執行完畢給出提示。

3.開始設想和后來出現問題:

開了10個線程 處理所有文件,如果一文件已在目標文件下存在 則不處理,但是線程間幾乎是同時進行的 這樣就會報錯"該文件已被另一線程占用"。這樣處理是不行的 于是就改善了。讓每個線程按順序處理固定條數的文件,則每個線程不會處理處理同個文件。

4.代碼實現:

 聲明變量

    /    /App.config 配置路徑        //源文件路徑        string sourcePath = ConfigurationManager.AppSettings["sourcePath"];        //目標路徑        string toPath = ConfigurationManager.AppSettings["toPath"];        //錯誤文件存放路徑        string errorLogPath = "http://log";        //文件總數        int totalFileCount;        //復制文件數        PRivate int OperaFileCount;        //未復制文件數        int notCopyFileCount;        //文件名稱過長文件數        int longNameFileCount;        //線程數        int threadCount = 10;

將所有文件名稱進行分批處理 分頁方法
        /// <summary>        /// 將所有文件名稱進行分頁        /// </summary>        /// <param name="PageSize">每頁條數</param>        /// <param name="CurPage">當前頁</param>        /// <param name="objs">集合</param>        /// <returns></returns>        public static List<string> QueryByPage(int PageSize, int CurPage, List<string> objs)        {            return objs.Take(PageSize * CurPage).Skip(PageSize * (CurPage - 1)).ToList();        }              public class Page        {            public int pageIndex { get; set; }            public int pageCount { get; set; }            public int pageSize { get; set; }            public List<string> list { get; set; }        }

拷貝文件的方法

        #region DoWork方法        private string errorFieName;        public void DoWork(object obj)        {            Object locker = new object();            Page page = (Page)obj;            Console.WriteLine(ThreadName());            int PageSize = page.pageSize;            int CurPage = page.pageIndex;            var grouList = QueryByPage(PageSize, CurPage, page.list);            foreach (string file in grouList)            {                string fileName = Path.GetFileName(file);                errorFieName = fileName;                if (fileName != null && fileName.Length != 18)                {                    Console.WriteLine(fileName + "文件名稱不符合要求!");                    CopyErrorFile(fileName);                    Write(fileName + "文件名稱不符合要求!");                    continue;                }                //Console.WriteLine(fileName.Length);                try                {                    //截取文件名稱 源文件名稱規則 ABC2014200...html 意思是:2014年第200天 可以推算出年月日                    string subYearMonth = fileName.Substring(3, 5);                    int yearNum = 0;                    int dayNum = 0;                    int.TryParse(subYearMonth.Substring(0, 2), out yearNum);                    int.TryParse(subYearMonth.Substring(2, 3), out dayNum);                    int.TryParse("20" + yearNum, out yearNum);                    if (yearNum < 1 || dayNum < 1)                    {                        Console.WriteLine(fileName + "文件名稱不符合要求!");                        CopyErrorFile(fileName);                        //Write(fileName + "文件名稱不符合要求!");                        continue;                    }                    //聲明日期                    DateTime date = new DateTime();                    date = date.AddYears(yearNum).AddYears(-1);                    date = date.AddDays(dayNum).AddDays(-1);                    string fullSavePath = string.Format("{0}//{1}//{2}//{3}//", toPath, yearNum, date.Month, date.Day);                    if (!Directory.Exists(fullSavePath))                    {                        Directory.CreateDirectory(fullSavePath);                    }                    lock (fullSavePath)                    {                        File.Copy(file, fullSavePath + fileName, true);                        operaFileCount++;                        //Write("處理完成:" + fileName);                    }                }                catch (Exception ex)                {                    Console.WriteLine("文件名稱:" + errorFieName + "處理錯誤:" + ex.Message);                    Write(ex.Message);                    throw new Exception(ex.Message);                }            }        }        #endregion    

循環執行線程

        public void CopyFile()        {            //開始方法時刪除上次記錄            DeleteLog();            List<Thread> threadList = new List<Thread>(); ;            for (int i = 0; i < threadCount; i++)            {                try                {                    if (!Directory.Exists(toPath))                    {                        Directory.CreateDirectory(toPath);                    }                    //string[] fileNames = Directory.GetFileSystemEntries(sourcePath);                    string[] fileNames = Directory.GetFiles(sourcePath);                    var fileNameList = fileNames.ToList();                    totalFileCount=fileNames.Length;                                       //共threadCount個線程 每個線程執行oneThreadNameCount條                    int oneThreadNameCount = (int)Math.Ceiling(((double)fileNames.Length) / threadCount);                    Page page;                    //當前執行的線程                    page = new Page { pageIndex = i + 1, pageSize = oneThreadNameCount, list = fileNameList };                    threadList.Add(new Thread(new ParameterizedThreadStart(DoWork)));                    threadList[i].Start(page);                    threadList[i].Name = i + "_thread";                }                catch (Exception ex)                {                    Console.WriteLine("錯誤信息:" + ex.Message);                    Write(ex.Message);                }            }            //判斷線程執行情況            bool isRanning;            bool isComplete = false;            while (!isComplete)            {                //2秒判斷一次                Thread.Sleep(2000);                isRanning = false;                foreach (var item in threadList)                {                    if (item.ThreadState == ThreadState.Running)                    {                        isRanning = true;                    }                }                if (!isRanning)                 {                     isComplete = true;                    Console.WriteLine();                    Console.WriteLine("處理結果 共" + totalFileCount+";已處理:"+operaFileCount);                    Console.WriteLine("不符合要求:" + notCopyFileCount + "(已拷貝到errorfile文件夾);無法拷貝名稱過長文件:" + longNameFileCount);                    Console.WriteLine("請查看文件夾" + toPath);                }            }            Console.ReadKey();        }

輔助方法

        #region copy不符合要求文件        private void CopyErrorFile(string fileName)        {            //實際長度超過222報錯,并且無法拋出異常            if (fileName.Length > 180)            {                longNameFileCount += 1;                Write(fileName + "名稱過長!");                return;            }            notCopyFileCount += 1;            string strErrorPath  =toPath+"http://errorfile";            if(!Directory.Exists(strErrorPath)) Directory.CreateDirectory(strErrorPath);            File.Copy(sourcePath+"http://"+fileName, toPath+"http://errorfile//" + fileName, true);        }        #endregion        private void DeleteLog()        {            try            {                if (!Directory.Exists(toPath + errorLogPath)) return;                foreach (string var in Directory.GetFiles(toPath + errorLogPath))                {                    File.Delete(var);                }            }            catch            {                //Directory.CreateDirectory(toPath + errorLogPath);            }        }        private void Write(string message)        {            object obj = new object();            lock (obj)            {                try                {                    string logPath=toPath+errorLogPath;                    if (!Directory.Exists(logPath)) Directory.CreateDirectory(logPath);                    Thread primaryThread = Thread.CurrentThread;                    //當前線程名稱                    stri
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品久久17c| 欧美日韩国产一区二区| 亚洲天堂av网| 一区二区欧美在线| 久久99久国产精品黄毛片入口| 日韩女在线观看| 日韩成人av在线播放| 欧美丰满少妇xxxxx做受| 日韩专区中文字幕| 国产精品丝袜久久久久久高清| 91久久精品日日躁夜夜躁国产| 亚洲天堂av在线播放| 亚洲国产精品999| 国产精品一区二区久久| 日本久久久久久久久久久| 国产精品毛片a∨一区二区三区|国| 亚洲系列中文字幕| www国产精品视频| 亚洲xxxx3d| 日韩在线观看你懂的| 日韩av三级在线观看| 亚洲午夜精品久久久久久久久久久久| 久久人人爽人人| 91国产美女视频| 国产精品久久婷婷六月丁香| 91亚洲精品一区二区| 亚洲欧美国产日韩中文字幕| 欧亚精品在线观看| 国产亚洲视频中文字幕视频| 久久激情五月丁香伊人| 中文字幕欧美精品在线| 国产精品第七影院| 欧美性色xo影院| 91chinesevideo永久地址| 精品综合久久久久久97| 日韩在线国产精品| 欧美在线中文字幕| 国产99在线|中文| 91在线免费观看网站| 亚洲欧美日韩直播| 在线观看亚洲视频| 久久久女人电视剧免费播放下载| 国产日韩精品一区二区| 在线日韩中文字幕| 亚洲综合中文字幕68页| 一区二区三区天堂av| 一区二区三区四区在线观看视频| 最新69国产成人精品视频免费| www.欧美精品| 日韩美女av在线免费观看| 日韩黄色高清视频| 日本精品性网站在线观看| 欧美成人激情在线| 国产精品激情av在线播放| 日本在线观看天堂男亚洲| 亚洲乱码一区av黑人高潮| 伊人一区二区三区久久精品| 久久久久久久久久久国产| 午夜精品99久久免费| 国产性色av一区二区| 日韩视频在线免费观看| 欧美丰满少妇xxxxx| 国产日韩欧美一二三区| 成人动漫网站在线观看| 久久久av免费| 日av在线播放中文不卡| 自拍偷拍免费精品| 8x海外华人永久免费日韩内陆视频| 国产精品igao视频| 亚洲激情视频在线观看| 国产精品久久久久久亚洲影视| 久久亚洲一区二区三区四区五区高| 国产在线播放不卡| 精品日韩视频在线观看| 黑丝美女久久久| 91高清免费在线观看| 亚洲精品在线不卡| 日韩hd视频在线观看| 欧美日韩一区免费| 日韩欧美在线看| 91夜夜未满十八勿入爽爽影院| 一区二区三区视频在线| 欧美第一淫aaasss性| 国产va免费精品高清在线| 91麻豆国产语对白在线观看| 亚洲国产日韩欧美在线99| 亚洲视频在线播放| 国产精品丝袜视频| 亚洲桃花岛网站| 亚洲精品99久久久久中文字幕| 成人xvideos免费视频| 亚洲成色777777在线观看影院| 久久成人精品一区二区三区| 97精品视频在线播放| 欧美午夜片在线免费观看| 国产激情综合五月久久| 久久人91精品久久久久久不卡| 亚洲直播在线一区| 成人国内精品久久久久一区| 久久精品国产久精国产思思| 日韩中文在线观看| 精品福利在线视频| 91视频国产精品| 国产精品久久久久久久久久ktv| 亚洲老司机av| 亚洲精品视频播放| 日韩成人av网| 欧美激情啊啊啊| 2020欧美日韩在线视频| 国产视频一区在线| 2018中文字幕一区二区三区| 久久激情五月丁香伊人| 91色p视频在线| 国产成人精品午夜| 久久久久久久久久久久av| 最近2019年中文视频免费在线观看| 亚洲第一二三四五区| 欧美丝袜一区二区三区| 久久777国产线看观看精品| 久久国产精品久久国产精品| 69视频在线播放| 日本精品免费一区二区三区| 国产97色在线|日韩| 欧美极品少妇xxxxⅹ喷水| 美日韩精品免费观看视频| 亚洲美女性生活视频| 国产91色在线|| 久久成人av网站| 欧美视频在线免费| 亚洲免费伊人电影在线观看av| 98精品国产高清在线xxxx天堂| 国产精品自拍偷拍| 成人综合网网址| 日韩美女毛茸茸| 日韩美女免费视频| 国产极品jizzhd欧美| 国产成人一区二区三区电影| 亚洲欧美日韩在线一区| www国产精品视频| 91高清视频免费| 午夜精品三级视频福利| 国产精品国产三级国产aⅴ浪潮| 国产精品美女免费| 日韩av色综合| 一区二区亚洲精品国产| 欧洲精品在线视频| 中文亚洲视频在线| 欧美午夜美女看片| 亚洲女人初尝黑人巨大| 一区二区中文字幕| 国产精品旅馆在线| 国产日韩精品综合网站| 国产日韩欧美夫妻视频在线观看| 欧美日韩中文字幕在线| 69久久夜色精品国产69乱青草| 国产欧美韩国高清| 狠狠干狠狠久久| 国产在线观看不卡| 日韩在线高清视频| 精品国产一区二区三区久久久狼| 亚洲第一男人av| 亚洲美女动态图120秒| 国产一区二区黑人欧美xxxx| 国产日韩在线精品av|