Files
easySif/mainProgram/ProjectManager.cs
2022-03-15 10:19:53 +08:00

1030 lines
35 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.IO;
using System.Windows.Forms;
namespace mainProgram
{
public delegate void UpdateProgressBarInfoDelegate(int ipos, string vinfo);//申明委托类型:用于进度条的更新
public delegate void RadCompleteDelegate();//申明委托类型:福亮度完成后调用的委托
public class DateFolder : IComparable//接口
{
private int mYear;
private int mMonth;
private int mDay;
//int hout;
//int minute;
//int second;
public string mDateFolder;
public DateFolder(string dateFolder)
{
string[] tmp = dateFolder.Split('_');
mYear = int.Parse(tmp[0]);
mMonth = int.Parse(tmp[1]);
mDay = int.Parse(tmp[2]);
mDateFolder = dateFolder;
}
public string GetDateFolder()
{
return mDateFolder;
}
//重载运算符
public static bool operator >(DateFolder a, DateFolder b)
{
if (a.mYear > b.mYear)
{
return true;
}
else if (a.mYear < b.mYear)
{
return false;
}
else if (a.mYear == b.mYear)
{
if (a.mMonth > b.mMonth)
{
return true;
}
else if (a.mMonth < b.mMonth)
{
return false;
}
else if (a.mMonth == b.mMonth)
{
if (a.mDay > b.mDay)
{
return true;
}
else if (a.mDay < b.mDay)
{
return false;
}
else if (a.mDay == b.mDay)
{
}
}
}
return false;
}
public static bool operator <(DateFolder a, DateFolder b)
{
if (a.mYear < b.mYear)
{
return true;
}
else if (a.mYear > b.mYear)
{
return false;
}
else if (a.mYear == b.mYear)
{
if (a.mMonth < b.mMonth)
{
return true;
}
else if (a.mMonth > b.mMonth)
{
return false;
}
else if (a.mMonth == b.mMonth)
{
if (a.mDay < b.mDay)
{
return true;
}
else if (a.mDay > b.mDay)
{
return false;
}
else if (a.mDay == b.mDay)
{
}
}
}
return false;
}
//负数值:当前对象小于参数对象;
//正数值:当前对象大于参数对象;
//零:两个对象在比较时相等;
public int CompareTo(object obj)//IComparable接口
{
DateFolder df = (DateFolder)obj;
if (this.mYear < df.mYear)
{
return -1;
}
else if (this.mYear > df.mYear)
{
return 1;
}
else if (this.mYear == df.mYear)
{
if (this.mMonth < df.mMonth)
{
return -1;
}
else if (this.mMonth > df.mMonth)
{
return 1;
}
else if (this.mMonth == df.mMonth)
{
if (this.mDay < df.mDay)
{
return -1;
}
else if (this.mDay > df.mDay)
{
return 1;
}
else if (this.mDay == df.mDay)
{
}
}
}
return 0;
}
}
public class ProjectManager
{
public ProjectManager(string xx)
{
mProjectPath = xx;
}
private string mProjectPath;
private string mMetadataPath;
private string mRawPath;
private string mRadPath;
public string mSifPath;
public string mSifTmpPath;
private int mCsvFileCount;
public string ProjectPath
{
get
{
return mProjectPath;
}
set
{
mProjectPath = value;
}
}
public string MetadataPath
{
get
{
return mMetadataPath;
}
set
{
mMetadataPath = value;
}
}
public string RawPath
{
get
{
return mRawPath;
}
set
{
mRawPath = value;
}
}
public string RadPath
{
get
{
return mRadPath;
}
set
{
mRadPath = value;
}
}
public string SifPath
{
get
{
return mSifPath;
}
set
{
mSifPath = value;
}
}
public void CreateProject(string calFilePath, string dataPath)
{
if (mProjectPath.Length == 0)
{
return;
}
DelectDir(mProjectPath);//删除工程路径下的所有内容
CreateProjectStructure();
CopyCalFiles2Project(calFilePath);//复制定标文件到工程结构对应文件夹
CopyFiles2Project(dataPath);//复制原始数据文件到工程结构对应文件夹
////创建工程元数据
//string myXMLFilePath = mMetadataPath + "/metadata.xml";
////生成xml文件
//GenerateXMLFile(myXMLFilePath);
////遍历xml文件的信息
//GetXMLInformation(myXMLFilePath);
////修改xml文件的信息
//ModifyXmlInformation(myXMLFilePath);
////向xml文件添加节点信息
//AddXmlInformation(myXMLFilePath);
////删除指定节点信息
//DeleteXmlInformation(myXMLFilePath);
}
public bool OpenProject()
{
if (!Directory.Exists(mProjectPath))
return false;
mMetadataPath = Path.Combine(mProjectPath, ".project");
mRawPath = Path.Combine(mProjectPath, "1raw");
mRadPath = Path.Combine(mProjectPath, "2rad");
mSifPath = Path.Combine(mProjectPath, "3sif");
if (Directory.Exists(mMetadataPath) & Directory.Exists(mRawPath) & Directory.Exists(mRadPath) & Directory.Exists(mSifPath))
{
BinaryReader br = new BinaryReader(new FileStream(Path.Combine(mMetadataPath, "CsvFileCount.dat"), FileMode.Open));
mCsvFileCount = br.ReadInt32();
br.Close();
return true;
}
else
{
return false;
}
//if (false == Directory.Exists(mMetadataPath))
//{
// Directory.CreateDirectory(mMetadataPath);
// MessageBox.Show("工程打开成功!", "提示");
//}
//if (false == Directory.Exists(mRawPath))
//{
// Directory.CreateDirectory(mRawPath);
//}
//if (false == Directory.Exists(mRadPath))
//{
// Directory.CreateDirectory(mRadPath);
//}
//if (false == Directory.Exists(mSifPath))
//{
// Directory.CreateDirectory(mSifPath);
//}
}
public void SaveProject()
{
}
public void AddData()
{
}
public void DeleteFile(string name)
{
File.Delete(name);
}
//生成工程元数据
public void GenerateXMLFile(string xmlFilePath)
{
try
{
//初始化一个xml实例
XmlDocument myXmlDoc = new XmlDocument();
//创建xml的根节点
XmlElement rootElement = myXmlDoc.CreateElement("Computers");
//将根节点加入到xml文件中AppendChild
myXmlDoc.AppendChild(rootElement);
//初始化第一层的第一个子节点
XmlElement firstLevelElement1 = myXmlDoc.CreateElement("Computer");
//填充第一层的第一个子节点的属性值SetAttribute
firstLevelElement1.SetAttribute("ID", "11111111");
firstLevelElement1.SetAttribute("Description", "Made in China");
//将第一层的第一个子节点加入到根节点下
rootElement.AppendChild(firstLevelElement1);
//初始化第二层的第一个子节点
XmlElement secondLevelElement11 = myXmlDoc.CreateElement("name");
//填充第二层的第一个子节点的值InnerText
secondLevelElement11.InnerText = "Lenovo";
firstLevelElement1.AppendChild(secondLevelElement11);
XmlElement secondLevelElement12 = myXmlDoc.CreateElement("price");
secondLevelElement12.InnerText = "5000";
firstLevelElement1.AppendChild(secondLevelElement12);
XmlElement firstLevelElement2 = myXmlDoc.CreateElement("Computer");
firstLevelElement2.SetAttribute("ID", "2222222");
firstLevelElement2.SetAttribute("Description", "Made in USA");
rootElement.AppendChild(firstLevelElement2);
XmlElement secondLevelElement21 = myXmlDoc.CreateElement("name");
secondLevelElement21.InnerText = "IBM";
firstLevelElement2.AppendChild(secondLevelElement21);
XmlElement secondLevelElement22 = myXmlDoc.CreateElement("price");
secondLevelElement22.InnerText = "10000";
firstLevelElement2.AppendChild(secondLevelElement22);
//将xml文件保存到指定的路径下
myXmlDoc.Save(xmlFilePath);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
public void GetXMLInformation(string xmlFilePath)
{
try
{
XmlDocument myXmlDoc = new XmlDocument();//初始化一个xml实例
myXmlDoc.Load(xmlFilePath);//加载xml文件参数为xml文件的路径
XmlNode rootNode = myXmlDoc.SelectSingleNode("Computers");//获得第一个姓名匹配的节点SelectSingleNode此xml文件的根节点
string innerXmlInfo = rootNode.InnerXml.ToString();//分别获得该节点的InnerXml和OuterXml信息
string outerXmlInfo = rootNode.OuterXml.ToString();
XmlNodeList firstLevelNodeList = rootNode.ChildNodes;//获得该节点的子节点(即:该节点的第一层子节点)
foreach (XmlNode node in firstLevelNodeList)
{
XmlAttributeCollection attributeCol = node.Attributes;//获得该节点的属性集合
foreach (XmlAttribute attri in attributeCol)
{
//获取属性名称与属性值
string name = attri.Name;
string value = attri.Value;
Console.WriteLine("{0} = {1}", name, value);
}
//判断此节点是否还有子节点
if (node.HasChildNodes)
{
XmlNode secondLevelNode1 = node.FirstChild;//获取该节点的第一个子节点
string name = secondLevelNode1.Name;//获取该节点的名字
string innerText = secondLevelNode1.InnerText;//获取该节点的值InnerText
Console.WriteLine("{0} = {1}", name, innerText);
XmlNode secondLevelNode2 = node.ChildNodes[1];//获取该节点的第二个子节点(用数组下标获取)
name = secondLevelNode2.Name;
innerText = secondLevelNode2.InnerText;
Console.WriteLine("{0} = {1}", name, innerText);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
public void ModifyXmlInformation(string xmlFilePath)
{
try
{
XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.Load(xmlFilePath);
XmlNode rootNode = myXmlDoc.FirstChild;
XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
foreach (XmlNode node in firstLevelNodeList)
{
//修改此节点的属性值
if (node.Attributes["Description"].Value.Equals("Made in USA"))
{
node.Attributes["Description"].Value = "Made in HongKong";
}
}
//要想使对xml文件所做的修改生效必须执行以下Save方法
myXmlDoc.Save(xmlFilePath);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
public void AddXmlInformation(string xmlFilePath)
{
try
{
XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.Load(xmlFilePath);
//添加一个带有属性的节点信息
foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
{
XmlElement newElement = myXmlDoc.CreateElement("color");
newElement.InnerText = "black";
newElement.SetAttribute("IsMixed", "Yes");
node.AppendChild(newElement);
}
//保存更改
myXmlDoc.Save(xmlFilePath);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
public void DeleteXmlInformation(string xmlFilePath)
{
try
{
XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.Load(xmlFilePath);
foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
{
//记录该节点下的最后一个子节点(简称:最后子节点)
XmlNode lastNode = node.LastChild;
//删除最后子节点下的左右子节点
lastNode.RemoveAll();
//删除最后子节点
node.RemoveChild(lastNode);
}
//保存对xml文件所做的修改
myXmlDoc.Save(xmlFilePath);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
//文件复制实现https://www.cnblogs.com/sun-shadow/p/7553556.html
public void CopyFiles2Project(string sourceFolderName)//
{
if (Directory.Exists(mRawPath))
{
DelectDir(mRawPath);
}
mCsvFileCount = 0;
CopySubFun(sourceFolderName, mRawPath, true);//因为此函数会递归,所以把它摘出来
}
public void CopyCalFiles2Project(string sourceFolderName)
{
if (!Directory.Exists(sourceFolderName))
{
return;
}
if (!Directory.Exists(mMetadataPath))
{
Directory.CreateDirectory(mMetadataPath);
}
string[] sourceFilesPath = Directory.GetFileSystemEntries(sourceFolderName);
for (int i = 0; i < sourceFilesPath.Length; i++)
{
string sourceFilePath = sourceFilesPath[i];
string[] forlders = sourceFilePath.Split('\\');
if (File.Exists(sourceFilePath))//是文件,直接拷贝
{
string dest = mMetadataPath;
string sourceFileName = Path.GetFileName(sourceFilePath);//获取文件名
File.Copy(sourceFilePath, Path.Combine(dest, sourceFileName), true);
}
else if (Directory.Exists(sourceFilePath))//是文件夹,拷贝文件夹;并递归
{
string lastDirectory = forlders[forlders.Length - 1];
string dest = Path.Combine(mMetadataPath, lastDirectory);
if (!Directory.Exists(dest))
{
Directory.CreateDirectory(dest);
}
CopySubFun(sourceFilePath, dest, true);
}
}
}
private void CopySubFun(string sourceFolderName, string destFolderName, bool overwrite)//因为此函数会递归,所以把它摘出来
{
if (!Directory.Exists(sourceFolderName))
{
return;
}
if (!Directory.Exists(destFolderName))
{
Directory.CreateDirectory(destFolderName);
}
string[] sourceFilesPath = Directory.GetFileSystemEntries(sourceFolderName);
for (int i = 0; i < sourceFilesPath.Length; i++)
{
string sourceFilePath = sourceFilesPath[i];
string[] forlders = sourceFilePath.Split('\\');
if (File.Exists(sourceFilePath))//是文件,直接拷贝
{
string dest = destFolderName;
string sourceFileName = Path.GetFileName(sourceFilePath);//获取文件名
File.Copy(sourceFilePath, Path.Combine(dest, sourceFileName), overwrite);
//统计文件个数
mCsvFileCount++;
}
else if (Directory.Exists(sourceFilePath))//是文件夹,拷贝文件夹;并递归
{
string lastDirectory = forlders[forlders.Length - 1];
string dest = Path.Combine(destFolderName, lastDirectory);
if (!Directory.Exists(dest))
{
Directory.CreateDirectory(dest);
}
CopySubFun(sourceFilePath, dest, overwrite);
}
}
//将文件个数写入到可执行文件所在目录 → 打开工程时需要读取
BinaryWriter bw = new BinaryWriter(new FileStream(Path.Combine(mMetadataPath, "CsvFileCount.dat"), FileMode.Create));
bw.Write(mCsvFileCount);
bw.Close();
}
public void DelectDir(string srcPath)
{
DirectoryInfo dir = new DirectoryInfo(srcPath);
FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //返回目录中所有文件和子目录
foreach (FileSystemInfo i in fileinfo)
{
if (i is DirectoryInfo) //判断是否文件夹
{
DirectoryInfo subdir = new DirectoryInfo(i.FullName);
subdir.Delete(true); //删除子目录和文件
}
else
{
File.Delete(i.FullName); //删除指定文件
}
}
}
public void DelectDirIncludeItself(string srcPath)
{
DirectoryInfo dir = new DirectoryInfo(srcPath);
dir.Delete(true);
}
//工程结构
public void CreateProjectStructure()
{
//创建工程文件夹结构
//mMetadataPath = mProjectPath + "\\.project\\";
//mRawPath = mProjectPath + "\\1raw\\";
//mRadPath = mProjectPath + "\\2rad\\";
//mSifPath = mProjectPath + "\\3sif\\";
mMetadataPath = Path.Combine(mProjectPath, ".project");
mRawPath = Path.Combine(mProjectPath, "1raw");
mRadPath = Path.Combine(mProjectPath, "2rad");
mSifPath = Path.Combine(mProjectPath, "3sif");
if (false == Directory.Exists(mMetadataPath))
{
Directory.CreateDirectory(mMetadataPath);
}
if (false == Directory.Exists(mRawPath))
{
Directory.CreateDirectory(mRawPath);
}
if (false == Directory.Exists(mRadPath))
{
Directory.CreateDirectory(mRadPath);
}
if (false == Directory.Exists(mSifPath))
{
Directory.CreateDirectory(mSifPath);
}
}
public int getNonLinearFileCount()
{
string[] metaFilesPath = Directory.GetFileSystemEntries(mMetadataPath);
int txtFileCount = 0;
for (int i = 0; i < metaFilesPath.Length; i++)//
{
if (metaFilesPath[i].Contains("nonLinear"))
{
txtFileCount++;
}
}
return txtFileCount;
}
public int getCalFileCount()
{
string[] metaFilesPath = Directory.GetFileSystemEntries(mMetadataPath);
int datFileCount = 0;
for (int i = 0; i < metaFilesPath.Length; i++)//
{
if (metaFilesPath[i].Contains("cal"))
{
datFileCount++;
}
}
return datFileCount;
}
//如果一个委托不需要再其定义的类之外被触发,那么就可以将其转化为事件,这样可以保证它不会在外部被随意触发。
//public UpdateProgressBarInfoDelegate UpdateProgressBarInfo;//申明委托变量
public event UpdateProgressBarInfoDelegate UpdateProgressBarInfoEvent;//申明事件
//public RadCompleteDelegate RadComplete;//申明委托变量
public event RadCompleteDelegate RadCompleteEvent;//申明委托变量
//处理工程中的数据
public void Rad()
{
int counter = 0;
//读取标定文件:辐射定标文件 + 非线性校正文件
int datFileCount = getCalFileCount();
int txtFileCount = getNonLinearFileCount();
CalData[] calDatas = new CalData[datFileCount];
NonLinearData[] nonLinearDatas = new NonLinearData[txtFileCount];
int d1 = 0, d2 = 0;
string[] metaFilesPath = Directory.GetFileSystemEntries(mMetadataPath);
for (int i = 0; i < metaFilesPath.Length; i++)
{
if (metaFilesPath[i].Contains("nonLinear"))
{
nonLinearDatas[d1] = ReadNonLinearFile(metaFilesPath[i]);
d1++;
}
else if (metaFilesPath[i].Contains("cal"))
{
calDatas[d2] = ReadCalFile(metaFilesPath[i]);
d2++;
}
}
//对文件夹中的文件遍历处理:非线性校正 + 辐射定标
Console.WriteLine("工程目录为" + mProjectPath);
DelectDir(mRadPath);
string[] sourceFilesPath = Directory.GetFileSystemEntries(mRawPath);
for (int i = 0; i < sourceFilesPath.Length; i++)//mRawPath下的每个日期文件夹
{
//构建rad中的输出文件夹
string[] forlders = sourceFilesPath[i].Split('\\');
string lastDirectory = forlders[forlders.Length - 1];
string dest = Path.Combine(mRadPath, lastDirectory);
if (!Directory.Exists(dest))
{
Directory.CreateDirectory(dest);
}
string[] rawFiles = Directory.GetFileSystemEntries(Path.Combine(mRawPath, lastDirectory));
foreach (string rawFileName in rawFiles)//日期文件夹下的每个DN值csv文件
{
string[] nameTmp = rawFileName.Split('\\');
string name = nameTmp[nameTmp.Length - 1];
SpectralDataReaderWriter spectralDataReaderWriter = new SpectralDataReaderWriter(rawFileName);
for (int j = 1; j <= spectralDataReaderWriter.TotalSpectralCount; j++)//处理 csv文件中的每条光谱
{
SpectralData spectralData = spectralDataReaderWriter.GetSpectral(j);
int nonLinearData_index = GetnonLinearDataIndex(spectralData, nonLinearDatas);
int calData_index = GetCalDataIndex(spectralData, calDatas);
SpectralProcessor sp = new SpectralProcessor();
if (nonLinearData_index >= 0)//非线性校正
{
sp.NonLinearCorrection(nonLinearDatas[nonLinearData_index].nonLinearData, spectralData.spectral, spectralData.spectralDataLength);
}
if (calData_index >= 0)//福亮度转换
{
sp.RadCorrection(calDatas[calData_index].gain, calDatas[calData_index].exposureTime, spectralData.spectral, spectralData.exposureTime, spectralData.spectralDataLength);
}
spectralDataReaderWriter.UpdateSpectral(j, spectralData);
}
string destFileName = Path.Combine(dest, name);
spectralDataReaderWriter.SaveCSV(destFileName);
counter++;
float tmp1 = (float)counter / (float)mCsvFileCount;
float tmp2 = tmp1 * 100;
//if (UpdateProgressBarInfo != null)//确认委托有方法
//{
// UpdateProgressBarInfo((int)tmp2, name + "\r\n");
//}
if (UpdateProgressBarInfoEvent != null)
{
UpdateProgressBarInfoEvent((int)tmp2, name + "\r\n");
}
}
}
////福亮度转换完成后,需要做得动作
//if (RadComplete != null)//确认委托有方法
//{
// RadComplete();
//}
if (RadCompleteEvent != null)//确认事件有方法可以执行
{
RadCompleteEvent();
}
}
/*
返回值:-1代表没有匹配项
*/
public int GetnonLinearDataIndex(SpectralData spectralData, NonLinearData[] nonLinearData)
{
for (int i = 0; i < nonLinearData.GetLength(0); i++)
{
if (nonLinearData[i].SN.Contains(spectralData.SN))
{
return i;
}
}
return -1;
}
/*
返回值:-1代表没有匹配项
*/
public int GetCalDataIndex(SpectralData spectralData, CalData[] calData)
{
for (int i = 0; i < calData.GetLength(0); i++)
{
if (calData[i].SN.Contains(spectralData.SN) && calData[i].position==spectralData.position)
{
return i;
}
}
return -1;
}
public CalData ReadCalFile(string calFilePath)
{
CalData calFile;
string[] forlders = calFilePath.Split('\\');
string filename = forlders[forlders.Length - 1].Split('.')[0];
string[] tmp = filename.Split('_');
calFile.SN = tmp[0];
calFile.SN = filename;
calFile.position = int.Parse(tmp[tmp.Length - 1]);
FileStream fs2 = new FileStream(calFilePath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs2);
calFile.exposureTime = br.ReadUInt32();
calFile.temperature = br.ReadSingle();
calFile.pixelCount = br.ReadInt32();
calFile.waveLengthInNM = new float[calFile.pixelCount];
calFile.gain = new double[calFile.pixelCount];
calFile.offset = new double[calFile.pixelCount];
for (int ii = 0; ii < calFile.pixelCount; ii++)
{
calFile.waveLengthInNM[ii] = br.ReadSingle();
}
for (int ii = 0; ii < calFile.pixelCount; ii++)
{
calFile.gain[ii] = br.ReadDouble();
}
for (int ii = 0; ii < calFile.pixelCount; ii++)
{
calFile.offset[ii] = br.ReadDouble();
}
return calFile;
}
public NonLinearData ReadNonLinearFile(string nonLinearFilePath)
{
NonLinearData nonLinearData;
string[] forlders = nonLinearFilePath.Split('\\');
nonLinearData.SN = forlders[forlders.Length - 1].Split('.')[0];
int lineCount = FindMaxRowCount(nonLinearFilePath);
nonLinearData.nonLinearData = new double[lineCount];
FileStream fs = new FileStream(nonLinearFilePath, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
string strLine = "";//记录每次读取的一行记录
int i = 0;
while ((strLine = sr.ReadLine()) != null)//逐行读取CSV中的数据
{
nonLinearData.nonLinearData[i] = double.Parse(strLine);
i++;
}
return nonLinearData;
}
public int FindMaxRowCount(string filePath)
{
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
string strLine = "";
int maxColunmCount = 0;
while ((strLine = sr.ReadLine()) != null)
{
maxColunmCount++;
}
sr.Close();
fs.Close();
return maxColunmCount;
}
DateFolder[] df;
public void FindTimespan()//因为此函数会递归,所以把它摘出来
{
if (!Directory.Exists(mRadPath))
{
return;
}
string[] dateFolders = Directory.GetFileSystemEntries(mRadPath);
df = new DateFolder[dateFolders.Length];
for (int i = 0; i < dateFolders.Length; i++)
{
string dateFolder = dateFolders[i];
if (Directory.Exists(dateFolder))//是文件夹
{
string[] splitPath = dateFolder.Split('\\');//
string lastDirectory = splitPath[splitPath.Length - 1];
df[i] = new DateFolder(lastDirectory);
}
}
Array.Sort(df);
}
public string GetMinDate()
{
return df[0].mDateFolder;
}
public string GetMaxDate()
{
return df[df.Length - 1].mDateFolder;
}
public void CopyWantedFiles(string minTime, string maxTime)
{
mSifTmpPath = Path.Combine(mProjectPath, "sifTmp");//mSifTmpPath
if (false == Directory.Exists(mSifTmpPath))
{
Directory.CreateDirectory(mSifTmpPath);
}
DelectDir(mSifTmpPath);//删除文件夹中的内容
//遍历,复制文件夹[minTimemaxTime]中的文件到mSifTmpPath
DateFolder minDateFolder = new DateFolder(minTime);
DateFolder maxDateFolder = new DateFolder(maxTime);
foreach (DateFolder currentFolder in df)
{
if (minDateFolder > currentFolder | currentFolder > maxDateFolder)
{
continue;
}
//复制文件
string sourcePath = Path.Combine(mRadPath, currentFolder.mDateFolder);
CopyWithModifyName(sourcePath, mSifTmpPath, true);
}
}
private void CopyWithModifyName(string sourceFolderPath, string destFolderPath, bool overwrite)//
{
if (!Directory.Exists(sourceFolderPath))
{
return;
}
if (!Directory.Exists(destFolderPath))
{
Directory.CreateDirectory(destFolderPath);
}
string[] sourceFilesPath = Directory.GetFileSystemEntries(sourceFolderPath);
for (int i = 0; i < sourceFilesPath.Length; i++)
{
string sourceFilePath = sourceFilesPath[i];
//构建文件名
string destFileName="";
string[] forlders = sourceFilePath.Split('\\');
string sourceFolderName = forlders[forlders.Length - 2];//获取文件所在目录的目录名
string sourceFileName = forlders[forlders.Length - 1];//获取文件名sourceFileName
//string sourceFileName = Path.GetFileName(sourceFilePath);
int firstIndex = sourceFileName.IndexOf("_");
int lastIndex = sourceFileName.LastIndexOf("_");
if (firstIndex != -1)
{
destFileName = sourceFileName.Substring(firstIndex);
}
if (File.Exists(sourceFilePath))//是文件,直接拷贝
{
File.Copy(sourceFilePath, Path.Combine(destFolderPath, sourceFolderName + destFileName), overwrite);
}
else if (Directory.Exists(sourceFilePath))//是文件夹,拷贝文件夹;并递归 → 减而治之
{
string lastDirectory = forlders[forlders.Length - 1];
string dest = Path.Combine(destFolderPath, lastDirectory);
if (!Directory.Exists(dest))
{
Directory.CreateDirectory(dest);
}
CopySubFun(sourceFilePath, dest, overwrite);
}
}
}
}
}