using CopyUSB.MyDB; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CopyUSB; public class CopyList { public string Func { get; set; } public long length { get; set; } public FileInfo file { get; set; } public string des { get; set; } } public class FileCopy { private static void ListFileInDic(DirectoryInfo source,DirectoryInfo target,List<(FileInfo,FileInfo)> values) { foreach (var file in source.GetFiles()) { /*Debug.WriteLine(Path.Join(target.FullName, file.Name));*/ try { values.Add((file, new FileInfo(Path.Join(target.FullName, file.Name)))); }catch (Exception ex) { Debug.WriteLine(ex); } } foreach(var dir in source.GetDirectories()) { try { ListFileInDic(dir, new DirectoryInfo(Path.Join(target.FullName, dir.Name)), values); }catch(Exception ex) { Debug.WriteLine(ex); } } } public static void Copy(string source,string des) { try { var sourceDir = new DirectoryInfo(source); var desDir = new DirectoryInfo(des); // 确保目标目录存在 if (!desDir.Exists) { desDir.Create(); } var cpFileList = new List<(FileInfo, FileInfo)>(); ListFileInDic(sourceDir, desDir, cpFileList); var sortedFile = cpFileList.OrderBy(o=>o.Item1.Length).ToList(); using (var fileInfoDb = new FileInfoDb()) { foreach(var file in sortedFile) { try { var tryGetFileDb = fileInfoDb.Files.Where(w=>w.Path==file.Item2.FullName).FirstOrDefault(); if (tryGetFileDb == null) { tryGetFileDb = new MyDB.Class.FileInfoTable(); tryGetFileDb.NeedChange = true; tryGetFileDb.Path = file.Item2.FullName; tryGetFileDb.Size = file.Item1.Length; if (!file.Item2.Directory.Exists) { file.Item2.Directory.Create(); } file.Item1.CopyTo(file.Item2.FullName,true); fileInfoDb.Files.Add(tryGetFileDb); Debug.WriteLine($"Copied and added into Db {file.Item1.FullName} --> {file.Item2.FullName}"); } else { if(tryGetFileDb.Size == file.Item1.Length) { Debug.WriteLine($"Found Same file from db {file.Item1.FullName}"); } else { file.Item1.CopyTo (file.Item2.FullName,true); tryGetFileDb.Size = (int)file.Item1.Length; tryGetFileDb.NeedChange= true; Debug.WriteLine($"Renew {file.Item1.FullName}"); } } }catch (Exception ex) { Debug.WriteLine(ex.Message); } } fileInfoDb.SaveChanges(); } } catch (Exception ex) { Debug.WriteLine(ex.ToString()); /*Console.WriteLine($"Copy Error {source}");*/ /*Console.WriteLine(ex.ToString());*/ } } public static long DicFileNum(string source) { long num = 0; using (var fileInfoDb = new FileInfoDb()) { num = fileInfoDb.Files.Where(w=>w.NeedChange==true).Count(); /*FileNum(source,ref num);*/ Debug.WriteLine($"Totle Dic Num is {num} (From Db)"); } return num<0?0:num; } private static void FileNum(string source, ref long num) { try { var sourceDir = new DirectoryInfo(source); num += sourceDir.GetFiles().Length; //遍历目录 foreach (var subDir in sourceDir.GetDirectories()) { FileNum(subDir.FullName,ref num); } } catch (Exception ex) { Debug.WriteLine(ex.ToString()); /*Console.WriteLine($"Copy Error {source}");*/ /*Console.WriteLine(ex.ToString());*/ } } public static void SimpleCopy(string des,string baseDic , ref Int64 doneNum) { /*try {*/ var desDir = new DirectoryInfo(des); //数据库查找需要更改的数据 using (var fileInfoDb = new FileInfoDb()) { var allNeedChangeFile = fileInfoDb.Files.Where(w => w.NeedChange == true).OrderBy(o => o.Size).ToList(); foreach (var file in allNeedChangeFile) { var desInfo = new FileInfo(Path.Join(des, file.Path.Replace(baseDic, ""))); var fileInfo = new FileInfo(file.Path); if (!fileInfo.Exists) { Debug.WriteLine($"Cannot Find File In Computer {fileInfo.FullName}"); file.NeedChange= false; continue; } if (!desInfo.Directory.Exists) { try { desInfo.Directory.Create(); }catch(Exception ex) { Debug.WriteLine(ex.ToString()); } } try { fileInfo.CopyTo(desInfo.FullName, true); fileInfo.Delete(); file.NeedChange = false; Debug.WriteLine($"moved the file and marked into Db {fileInfo.FullName} --> {desInfo.FullName}"); } catch(Exception ex) { Debug.WriteLine($"Error: moved the file and marked into Db {fileInfo.FullName} --> {desInfo.FullName}\n{ex.ToString()}"); } doneNum++; } fileInfoDb.SaveChanges(); } /*} catch (Exception ex) { Debug.WriteLine(ex.ToString()); *//*Console.WriteLine($"Copy Error {source}");*/ /*Console.WriteLine(ex.ToString());*//* }*/ } }