CopyUSB/FileCopy.cs

194 lines
4.9 KiB
C#
Raw Permalink Normal View History

2023-10-13 16:29:15 +00:00
using CopyUSB.MyDB;
using System;
2023-10-01 10:12:37 +00:00
using System.Collections.Generic;
using System.Diagnostics;
2023-10-01 10:12:37 +00:00
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CopyUSB;
2023-10-01 13:07:25 +00:00
public class CopyList
{
public string Func { get; set; }
public long length { get; set; }
public FileInfo file { get; set; }
public string des { get; set; }
}
2023-10-01 10:12:37 +00:00
public class FileCopy
{
2023-10-14 13:55:20 +00:00
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);
}
}
}
2023-10-01 13:07:25 +00:00
2023-10-13 16:29:15 +00:00
public static void Copy(string source,string des)
2023-10-01 10:12:37 +00:00
{
try
{
var sourceDir = new DirectoryInfo(source);
var desDir = new DirectoryInfo(des);
// 确保目标目录存在
if (!desDir.Exists)
{
desDir.Create();
}
2023-10-14 13:55:20 +00:00
var cpFileList = new List<(FileInfo, FileInfo)>();
ListFileInDic(sourceDir, desDir, cpFileList);
var sortedFile = cpFileList.OrderBy(o=>o.Item1.Length).ToList();
using (var fileInfoDb = new FileInfoDb())
2023-10-01 10:12:37 +00:00
{
2023-10-14 13:55:20 +00:00
foreach(var file in sortedFile)
2023-10-01 10:56:34 +00:00
{
2023-10-14 06:46:11 +00:00
try
2023-10-01 10:56:34 +00:00
{
2023-10-14 13:55:20 +00:00
var tryGetFileDb = fileInfoDb.Files.Where(w=>w.Path==file.Item2.FullName).FirstOrDefault();
if (tryGetFileDb == null)
2023-10-13 16:29:15 +00:00
{
2023-10-14 13:55:20 +00:00
tryGetFileDb = new MyDB.Class.FileInfoTable();
tryGetFileDb.NeedChange = true;
tryGetFileDb.Path = file.Item2.FullName;
tryGetFileDb.Size = file.Item1.Length;
if (!file.Item2.Directory.Exists)
2023-10-14 06:46:11 +00:00
{
2023-10-14 13:55:20 +00:00
file.Item2.Directory.Create();
2023-10-14 06:46:11 +00:00
}
2023-10-14 13:55:20 +00:00
file.Item1.CopyTo(file.Item2.FullName,true);
fileInfoDb.Files.Add(tryGetFileDb);
Debug.WriteLine($"Copied and added into Db {file.Item1.FullName} --> {file.Item2.FullName}");
2023-10-13 16:29:15 +00:00
}
else
{
2023-10-14 13:55:20 +00:00
if(tryGetFileDb.Size == file.Item1.Length)
2023-10-14 06:46:11 +00:00
{
2023-10-14 13:55:20 +00:00
Debug.WriteLine($"Found Same file from db {file.Item1.FullName}");
2023-10-14 06:46:11 +00:00
}
else
{
2023-10-14 13:55:20 +00:00
file.Item1.CopyTo (file.Item2.FullName,true);
tryGetFileDb.Size = (int)file.Item1.Length;
tryGetFileDb.NeedChange= true;
Debug.WriteLine($"Renew {file.Item1.FullName}");
2023-10-14 06:46:11 +00:00
}
2023-10-13 16:29:15 +00:00
}
2023-10-14 13:55:20 +00:00
}catch (Exception ex)
2023-10-14 06:46:11 +00:00
{
2023-10-14 13:55:20 +00:00
Debug.WriteLine(ex.Message);
2023-10-14 06:46:11 +00:00
}
2023-10-01 10:56:34 +00:00
}
2023-10-13 16:29:15 +00:00
fileInfoDb.SaveChanges();
}
2023-10-01 10:12:37 +00:00
}
catch (Exception ex)
{
2023-10-13 16:29:15 +00:00
Debug.WriteLine(ex.ToString());
/*Console.WriteLine($"Copy Error {source}");*/
/*Console.WriteLine(ex.ToString());*/
}
}
public static long DicFileNum(string source)
{
long num = 0;
2023-10-13 16:29:15 +00:00
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)");
2023-10-13 16:29:15 +00:00
}
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)
{
2023-10-13 16:29:15 +00:00
Debug.WriteLine(ex.ToString());
/*Console.WriteLine($"Copy Error {source}");*/
/*Console.WriteLine(ex.ToString());*/
}
}
2023-10-13 16:29:15 +00:00
public static void SimpleCopy(string des,string baseDic , ref Int64 doneNum)
{
2023-10-13 16:29:15 +00:00
/*try
{*/
var desDir = new DirectoryInfo(des);
2023-10-13 16:29:15 +00:00
//数据库查找需要更改的数据
using (var fileInfoDb = new FileInfoDb())
{
2023-10-13 16:29:15 +00:00
var allNeedChangeFile = fileInfoDb.Files.Where(w => w.NeedChange == true).OrderBy(o => o.Size).ToList();
foreach (var file in allNeedChangeFile)
{
2023-10-13 16:29:15 +00:00
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;
2023-10-13 16:29:15 +00:00
continue;
}
2023-10-13 16:29:15 +00:00
if (!desInfo.Directory.Exists)
2023-10-14 06:46:11 +00:00
{
try
{
2023-10-13 16:29:15 +00:00
desInfo.Directory.Create();
2023-10-14 06:46:11 +00:00
}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()}");
}
2023-10-13 16:29:15 +00:00
doneNum++;
}
2023-10-13 16:29:15 +00:00
fileInfoDb.SaveChanges();
}
2023-10-13 16:29:15 +00:00
/*}
catch (Exception ex)
{
2023-10-13 16:29:15 +00:00
Debug.WriteLine(ex.ToString());
*//*Console.WriteLine($"Copy Error {source}");*/
/*Console.WriteLine(ex.ToString());*//*
}*/
2023-10-01 10:12:37 +00:00
}
}