//修改单个文件夹的时间(指定+遍历)(传入path)
        public void ChangeOneFolderTimeWithSettingWithTraversal(string path, DateTime create, DateTime modify, DateTime access)
        {
            //获取所有文件和文件夹的列表
            List <FileFolderInfoNode>  all_filefolder = new List <FileFolderInfoNode>();
            Queue <FileFolderInfoNode> temp_folder    = new Queue <FileFolderInfoNode>();
            FileFolderInfoNode         temp           = new FileFolderInfoNode();

            temp.type        = OverAllData.FILETYPE_FOLDER;
            temp.folder_info = new DirectoryInfo(path);
            all_filefolder.Add(temp);
            temp_folder.Enqueue(temp);
            while (temp_folder.Count != 0)
            {
                FileFolderInfoNode fn = temp_folder.Dequeue();
                foreach (DirectoryInfo di in fn.folder_info.GetDirectories())
                {
                    FileFolderInfoNode fn_t = new FileFolderInfoNode();
                    fn_t.type        = OverAllData.FILETYPE_FOLDER;
                    fn_t.folder_info = new DirectoryInfo(di.FullName);
                    all_filefolder.Add(fn_t);
                    temp_folder.Enqueue(fn_t);
                }
                foreach (FileInfo fi in fn.folder_info.GetFiles())
                {
                    FileFolderInfoNode fn_t = new FileFolderInfoNode();
                    fn_t.type      = OverAllData.FILETYPE_FILE;
                    fn_t.file_info = new FileInfo(fi.FullName);
                    all_filefolder.Add(fn_t);
                }
            }
            //开始修改文件+文件夹的时间
            all_filefolder.Reverse();
            foreach (FileFolderInfoNode ffin in all_filefolder)
            {
                //文件类型
                if (ffin.type == OverAllData.FILETYPE_FILE)
                {
                    ChangeOneFileTime(ffin.file_info, create, modify, access);
                }
                //文件夹类型
                else if (ffin.type == OverAllData.FILETYPE_FOLDER)
                {
                    ChangeOneFolderTimeWithSettingNoTraversal(ffin.folder_info, create, modify, access);
                }
            }

            Console.WriteLine("文件夹" + path + "时间修改成功!(指定时间+遍历)");
        }
        //修改单个文件夹的时间(默认+遍历)(传入DirectoryInfo)
        //规则:
        //1、对于单个文件:
        //    如果创建时间晚于修改时间,则修改创建时间=修改时间,访问时间=修改时间
        //2、对于文件夹:
        //    创建时间=最早创建时间(子文件+子文件夹),修改时间=最晚修改时间(子文件+子文件夹)
        //    如果为空,则时间不变
        //3、设置文件夹的访问时间=修改时间
        public void ChangeOneFolderTimeNoSettingWithTraversal(DirectoryInfo directoryInfo)
        {
            //获取所有文件夹的列表
            List <FileFolderInfoNode>  all_folder  = new List <FileFolderInfoNode>();
            Queue <FileFolderInfoNode> temp_folder = new Queue <FileFolderInfoNode>();
            FileFolderInfoNode         temp        = new FileFolderInfoNode();

            temp.type        = OverAllData.FILETYPE_FOLDER;
            temp.folder_info = directoryInfo;
            all_folder.Add(temp);
            temp_folder.Enqueue(temp);
            while (temp_folder.Count != 0)
            {
                FileFolderInfoNode fn = temp_folder.Dequeue();
                foreach (DirectoryInfo di in fn.folder_info.GetDirectories())
                {
                    FileFolderInfoNode fn_t = new FileFolderInfoNode();
                    fn_t.type        = OverAllData.FILETYPE_FOLDER;
                    fn_t.folder_info = new DirectoryInfo(di.FullName);
                    all_folder.Add(fn_t);
                    temp_folder.Enqueue(fn_t);
                }
            }
            //开始修改文件+文件夹的时间
            all_folder.Reverse();
            foreach (FileFolderInfoNode ffi in all_folder)
            {
                //记录所有文件+文件夹的链表
                List <DateTime> all_time = new List <DateTime>();
                //获取文件夹节点
                DirectoryInfo di = ffi.folder_info;
                //对于其中的所有文件
                foreach (FileInfo fi_in in di.GetFiles())
                {
                    all_time.Add(fi_in.LastWriteTime);
                    DateTime file_create = fi_in.CreationTime;
                    DateTime file_modify = fi_in.LastWriteTime;
                    if (DateTime.Compare(file_create, file_modify) > 0)
                    {
                        fi_in.CreationTime = file_modify;
                    }
                    fi_in.LastAccessTime = file_modify;
                }
                //对于该文件夹,获取最早的创建时间,最晚的修改时间
                if (!(di.GetFiles().Length == 0 && di.GetDirectories().Length == 0))
                {
                    //获取最早的创建时间
                    foreach (DirectoryInfo di_in in di.GetDirectories())
                    {
                        all_time.Add(di_in.LastWriteTime);
                    }
                    DateTime most_early = utils.GetMostEarlyTimeFromList(all_time);
                    //获取最晚的修改时间
                    DateTime most_late = utils.GetMostLateTimeFromList(all_time);
                    //修改创建时间=最早时间
                    di.CreationTime = most_early;
                    //修改修改时间=最晚时间
                    di.LastWriteTime = most_late;
                    //修改访问时间=修改时间
                    di.LastAccessTime = di.LastWriteTime;
                }
            }
            Console.WriteLine("文件夹" + directoryInfo.FullName + "时间修改成功!(默认设置+遍历)");
        }
示例#3
0
        //修改文件夹中的所有子文件和文件夹的时间
        //规则:
        //1、对于单个文件:
        //  创建时间:若早于'参考基准时间',则不修改;否则修改为earlier(原有创建时间,修改时间)
        //  访问时间:earlier(原有访问时间,later(创建时间,修改时间))
        //2、对于文件夹:
        //  创建时间:若早于'参考基准时间',则不修改;否则将[earlier(所有文件创建时间 + 所有文件夹创建时间 - 早于'参考基准时间2'的时间)] 与其自身原有的创建时间比较,取较早的那个
        //  修改时间:若早于'参考基准时间',则不修改;否则将[later(所有文件修改时间 + 所有文件夹修改时间)] 与其自身原有的修改时间比较,取较早的那个
        //  访问时间:若早于'参考基准时间',则不修改;否则修改为:later(创建时间,修改时间)
        public void ChangeFolderTimeWithSpecialNeed(string path, string refertime, string refertime2)
        {
            //转换基准时间
            if ((!utils.CheckTimeString(refertime)) || (!utils.CheckTimeString(refertime2)))
            {
                Console.WriteLine("基准时间格式设置错误!");
                return;
            }
            DateTime reference_time           = utils.GetDateTimeFromString(refertime);
            DateTime not_early_than_this_time = utils.GetDateTimeFromString(refertime2);
            //获取所有文件夹的列表
            List <FileFolderInfoNode>  all_folder  = new List <FileFolderInfoNode>();
            Queue <FileFolderInfoNode> temp_folder = new Queue <FileFolderInfoNode>();
            FileFolderInfoNode         temp        = new FileFolderInfoNode();

            temp.type        = OverAllData.FILETYPE_FOLDER;
            temp.folder_info = new DirectoryInfo(path);
            all_folder.Add(temp);
            temp_folder.Enqueue(temp);
            while (temp_folder.Count != 0)
            {
                FileFolderInfoNode fn = temp_folder.Dequeue();
                foreach (DirectoryInfo di in fn.folder_info.GetDirectories())
                {
                    FileFolderInfoNode fn_t = new FileFolderInfoNode();
                    fn_t.type        = OverAllData.FILETYPE_FOLDER;
                    fn_t.folder_info = new DirectoryInfo(di.FullName);
                    all_folder.Add(fn_t);
                    temp_folder.Enqueue(fn_t);
                }
            }
            //开始修改文件+文件夹的时间
            all_folder.Reverse();
            foreach (FileFolderInfoNode ffi in all_folder)
            {
                //获取文件夹节点
                DirectoryInfo di = ffi.folder_info;
                //对于其中的所有文件
                foreach (FileInfo fi_in in di.GetFiles())
                {
                    //删除只读属性
                    FileAttributes origin_attr = fi_in.Attributes;
                    fi_in.Attributes = origin_attr & (~FileAttributes.ReadOnly);
                    //设置创建时间
                    List <DateTime> list_temp1 = new List <DateTime>();
                    if (DateTime.Compare(fi_in.CreationTime, reference_time) > 0)
                    {
                        list_temp1.Add(fi_in.CreationTime);
                        list_temp1.Add(fi_in.LastWriteTime);
                        fi_in.CreationTime = utils.GetMostEarlyTimeFromList(list_temp1);
                    }
                    //设置访问时间
                    list_temp1.Clear();
                    list_temp1.Add(fi_in.CreationTime);
                    list_temp1.Add(fi_in.LastWriteTime);
                    DateTime dt1 = utils.GetMostLateTimeFromList(list_temp1);
                    list_temp1.Clear();
                    list_temp1.Add(fi_in.LastAccessTime);
                    list_temp1.Add(dt1);
                    fi_in.LastAccessTime = utils.GetMostEarlyTimeFromList(list_temp1);
                    //还原原有属性
                    fi_in.Attributes = origin_attr;
                }
                //设置该文件夹的信息
                if (!(di.GetFiles().Length == 0 && di.GetDirectories().Length == 0))
                {
                    //去除只读属性
                    FileAttributes origin_attr = di.Attributes;
                    di.Attributes = origin_attr & (~FileAttributes.ReadOnly);
                    //设置创建时间
                    if (DateTime.Compare(di.CreationTime, reference_time) > 0)
                    {
                        //收集:所有文件创建时间 + 所有文件夹创建时间
                        List <DateTime> list_temp2 = new List <DateTime>();
                        foreach (FileInfo fi_in in di.GetFiles())
                        {
                            list_temp2.Add(fi_in.CreationTime);
                        }
                        foreach (DirectoryInfo di_in in di.GetDirectories())
                        {
                            list_temp2.Add(di_in.CreationTime);
                        }
                        //从列表中删除早于'参考基准时间2'的时间
                        list_temp2 = utils.DeleteTimeEarlyThanReferenceTime(list_temp2, not_early_than_this_time);
                        //获取列表中最早的时间
                        DateTime dt2 = utils.GetMostEarlyTimeFromList(list_temp2);
                        list_temp2.Clear();
                        list_temp2.Add(di.CreationTime);
                        list_temp2.Add(dt2);
                        di.CreationTime = utils.GetMostEarlyTimeFromList(list_temp2);
                    }
                    //设置修改时间
                    if (DateTime.Compare(di.LastWriteTime, reference_time) > 0)
                    {
                        //收集:所有文件修改时间 + 所有文件夹修改时间
                        List <DateTime> list_temp3 = new List <DateTime>();
                        foreach (FileInfo fi_in in di.GetFiles())
                        {
                            list_temp3.Add(fi_in.LastWriteTime);
                        }
                        foreach (DirectoryInfo di_in in di.GetDirectories())
                        {
                            list_temp3.Add(di_in.LastWriteTime);
                        }
                        DateTime dt3 = utils.GetMostLateTimeFromList(list_temp3);
                        list_temp3.Clear();
                        list_temp3.Add(di.LastWriteTime);
                        list_temp3.Add(dt3);
                        di.LastWriteTime = utils.GetMostEarlyTimeFromList(list_temp3);
                    }
                    //设置访问时间
                    if (DateTime.Compare(di.LastAccessTime, reference_time) > 0)
                    {
                        List <DateTime> list_temp4 = new List <DateTime>();
                        list_temp4.Add(di.CreationTime);
                        list_temp4.Add(di.LastWriteTime);
                        di.LastAccessTime = utils.GetMostLateTimeFromList(list_temp4);
                    }
                    //还原原有属性
                    di.Attributes = origin_attr;
                }
            }
            Console.WriteLine("文件夹:" + path + "设置成功!");
        }