using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace GetJsonFile
{
public class ProductsDataItem
{
public bool isFpcDataInvalid=false;
public bool isFileInvalid=false;
public List<string> canBeRestoreFile = new List<string>();
public List<string> restoreFailFile = new List<string>();
public List<string> MustBeDeletFile = new List<string>();
}
public class SearchAndAdd
{
private string _searchDir = "";
Dictionary<string, ProductsDataItem> ProductsData = new Dictionary<string, ProductsDataItem>();
// List<string> MustBeDeletFile = new List<string>();
Dictionary<string, string> SourceFile = new Dictionary<string, string>();
public SearchAndAdd(string dir = @"D:\bin\Products")
{
_searchDir = dir;
}
public void GetAllFile()
{
if (string.IsNullOrEmpty(_searchDir))
{
Console.WriteLine($"校验路径为空,不执行校验");
return ;
}
if (!Directory.Exists(_searchDir))
{
Console.WriteLine($"{_searchDir}输入路径不存在,不执行校验");
return ;
}
try
{
DirectoryInfo info = new DirectoryInfo(_searchDir);
DirectoryInfo[] infos = info.GetDirectories(); //产品目录数组
for (int i = 0; i < infos.Length; i++)
{
string fileName = infos[i].Name;//产品目录名
string fileDir = infos[i].FullName;//完整路径
ProductsDataItem productsData = new ProductsDataItem();
ProductsData.Add(fileName, productsData);
//分类出可修复和需要删除的文件
GetFileData(fileDir, ProductsData[fileName]);
}
//提取全部文件,开始恢复
foreach (var item in ProductsData)
{
if (item.Value.canBeRestoreFile.Count == 0&& item.Value.MustBeDeletFile.Count==0)
{
Console.WriteLine($"{item} 没有需要恢复的文件");
}
if(item.Value.canBeRestoreFile.Count != 0 && item.Value.MustBeDeletFile.Count == 0)
{
Console.WriteLine($"开始修复文件{item}");
RestoreInvalidFile(item.Value);
}
}
}
catch (Exception e)
{
Console.WriteLine($"异常:{e.Message}");
}
}
public void RestoreInvalidFile(ProductsDataItem productsDataItem)
{
try
{
if (SourceFile.Count == 0)
{
Console.WriteLine("文件全部损坏,获取源文件失败");
return;
}
for (int i = 0; i < productsDataItem.canBeRestoreFile.Count; i++)
{
string fileName = productsDataItem.canBeRestoreFile[i].Substring(productsDataItem.canBeRestoreFile[i].LastIndexOf("\\") + 1);
if (SourceFile.ContainsKey(fileName))
{
File.Copy(SourceFile[fileName], productsDataItem.canBeRestoreFile[i], true);
Console.WriteLine("文件修复完成");
}
else
{
productsDataItem.restoreFailFile.Add(fileName);
Console.WriteLine($"所有程序{fileName}损坏,源文件缺失文件{fileName},恢复程序失败");
}
}
}
catch (Exception e)
{
Console.WriteLine($"异常:{e.Message}");
}
}
public void GetFileData(string dir, ProductsDataItem dataItem)
{
try
{
string[] files = Directory.GetFiles(dir,"*.json",SearchOption.AllDirectories);//json文件
//先检查FPC文件,如果文件损坏,收集到删除文件清单里,直接退出此产品目录判断。
foreach (var file in files)
{
if (file.Contains("FpcBoardData"))
{
dataItem.isFpcDataInvalid = !IsFileInvalid(file);
if (dataItem.isFpcDataInvalid)
{
dataItem.MustBeDeletFile.Add(file);
Console.WriteLine($"{ file }生产数据已经损坏,无法修复,必须删除整个程序文件夹");
break;
}
}
}
//FPC没损坏前提下,检查其他文件,其他文件损坏收集到可修复文件清单;其他文件没损坏,并且该文件文件不在源文件里,把它收集到源文件字典里。
if (!dataItem.isFpcDataInvalid)
{
foreach (var item in files)
{
if (!item.Contains("FpcBoardData"))
{
dataItem.isFileInvalid = !IsFileInvalid(item);
if (dataItem.isFileInvalid)
{
dataItem.canBeRestoreFile.Add(item);
// InvalideFile.Add(item.Substring(item.LastIndexOf("\\") + 1));
}
if (!dataItem.isFileInvalid)
{
string sourceFileNamen = item.Substring(item.LastIndexOf("\\")+1);
if (!SourceFile.ContainsKey(sourceFileNamen))
{
SourceFile.Add(sourceFileNamen, item);
}
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine($"异常:{e.Message}");
}
}
//检查文件
public bool IsFileInvalid(string file)
{
using (StreamReader sr=new StreamReader(file))
{
string data = sr.ReadLine();
if (!string.IsNullOrEmpty(data)&&data.Contains("{"))
{
return true;
}
}
return false;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GetJsonFile
{
class Program
{
static void Main(string[] args)
{
SearchAndAdd item = new SearchAndAdd();
item.GetAllFile();
Console.WriteLine("按任何按键退出");
Console.ReadKey();
}
}
}