/// <summary> /// 执行操作 /// </summary> /// <param name="modifyRecord">文件记录</param> public void Fix(ModifyRecord modifyRecord) { if (modifyRecord == null) { return; } DispatcherAdd("正在删除..."); for (int i = 0; i < modifyRecord.DeleteCollection.Count; i++) { DispatcherAdd("删除 " + modifyRecord.DeleteCollection[i]); File.Delete(modifyRecord.DeleteCollection[i]); } DispatcherAdd("正在移动..."); for (int i = 0; i < modifyRecord.MoveCollection1.Count; i++) { DispatcherAdd("将 " + modifyRecord.MoveCollection1[i] + "重命名到 " + modifyRecord.MoveCollection2[i]); File.Move(modifyRecord.MoveCollection1[i], modifyRecord.MoveCollection2[i]); } DispatcherAdd("正在复制..."); for (int i = 0; i < modifyRecord.CopyCollection1.Count; i++) { DispatcherAdd("将 " + modifyRecord.CopyCollection1[i] + "复制到 " + modifyRecord.CopyCollection2[i]); File.Copy(modifyRecord.CopyCollection1[i], modifyRecord.CopyCollection2[i]); } DispatcherAdd("创建空文件夹..."); for (int i = 0; i < modifyRecord.createDirectories.Count; i++) { DispatcherAdd("创建文件夹" + modifyRecord.createDirectories[i]); Directory.CreateDirectory(modifyRecord.createDirectories[i]); } DispatcherAdd("删除多余的文件夹..."); for (int i = 0; i < modifyRecord.deleteDirectories.Count; i++) { DispatcherAdd("删除文件夹" + modifyRecord.deleteDirectories[i]); Directory.Delete(modifyRecord.deleteDirectories[i], true); } DispatcherAdd("正在生成backup文件..."); if (modifyRecord.source != "" && modifyRecord.target != "") { WriteFileAndMD5toSpecificFile(modifyRecord.source,modifyRecord.target,modifyRecord.SyncType); } DispatcherAdd("完毕."); }
/// <summary> /// 当前文件夹第一次执行同步 /// </summary> /// <param name="dirSource">左文件夹</param> /// <param name="dirTarget">右文件夹</param> /// <returns>ModifyRecord</returns> private ModifyRecord InitializeDirectory(string dirSource, string dirTarget) { ModifyRecord modifyRecord = new ModifyRecord(); DirectoryInfo infoSource = new DirectoryInfo(dirSource); DirectoryInfo infoTarget = new DirectoryInfo(dirTarget); FileInfo[] sourceFileInfos = null; FileInfo[] targetFileInfos = null; try { sourceFileInfos = infoSource.GetFiles("*", SearchOption.AllDirectories); targetFileInfos = infoTarget.GetFiles("*", SearchOption.AllDirectories); } catch (UnauthorizedAccessException e) { Debug.WriteLine("{0}", e.Message); } var tarLock = new bool[targetFileInfos.Length]; var souLock = new bool[sourceFileInfos.Length]; for (int i = 0; i < sourceFileInfos.Length; i++) { souLock[i] = true; } for (int j = 0; j < targetFileInfos.Length; j++) { tarLock[j] = true; } // 此处不优化成一层循环是因为需要获取sou与tar两端的被锁定的文件的位置 for (int i = 0; i < sourceFileInfos.Length; i++) { for (int j = 0; j < targetFileInfos.Length; j++) { if (sourceFileInfos[i].FullName.Substring(dirSource.Length) .Equals(targetFileInfos[j].FullName.Substring(dirTarget.Length))) { if (sourceFileInfos[i].LastWriteTime.CompareTo(targetFileInfos[j].LastWriteTime) > 0) { modifyRecord.DeleteCollection.Add(targetFileInfos[j].FullName); modifyRecord.CopyCollection1.Add(sourceFileInfos[i].FullName); modifyRecord.CopyCollection2.Add(targetFileInfos[j].FullName); } else if (sourceFileInfos[i].LastWriteTime.CompareTo(targetFileInfos[j].LastWriteTime) < 0) { modifyRecord.DeleteCollection.Add(sourceFileInfos[i].FullName); modifyRecord.CopyCollection1.Add(targetFileInfos[j].FullName); modifyRecord.CopyCollection2.Add(sourceFileInfos[i].FullName); } souLock[i] = false; tarLock[j] = false; break; } } } // sou端对应在tar的可以用来的剪切的副本,即内容相同 string[] saveCache = new string[sourceFileInfos.Length]; for (int i = 0; i < sourceFileInfos.Length; i++) saveCache[i] = ""; for (int i = 0; i < sourceFileInfos.Length; i++) { if (!souLock[i]) { continue; } for (int j = 0; j < targetFileInfos.Length; j++) { if (tarLock[j] && MainWindow.GetMD5HashFromFile(sourceFileInfos[i].FullName) .Equals(MainWindow.GetMD5HashFromFile(targetFileInfos[j].FullName))) { if (sourceFileInfos[i].CreationTime.CompareTo(targetFileInfos[j].CreationTime) >= 0) { if (!Directory.Exists(dirTarget + sourceFileInfos[i].DirectoryName.Substring(dirSource.Length))) Directory.CreateDirectory(dirTarget + sourceFileInfos[i].DirectoryName.Substring(dirSource.Length)); modifyRecord.MoveCollection1.Add(targetFileInfos[j].FullName); modifyRecord.MoveCollection2.Add(dirTarget+sourceFileInfos[i].FullName.Substring(dirSource.Length)); } else { if (!Directory.Exists(dirSource + targetFileInfos[j].DirectoryName.Substring(dirTarget.Length))) Directory.CreateDirectory(dirSource + targetFileInfos[j].DirectoryName.Substring(dirTarget.Length)); modifyRecord.MoveCollection1.Add(sourceFileInfos[i].FullName); modifyRecord.MoveCollection2.Add(dirSource + targetFileInfos[j].FullName.Substring(dirTarget.Length)); } tarLock[j] = false; souLock[i] = false; break; } } } // 双向复制 for (int i = 0; i < sourceFileInfos.Length; i++) { if (souLock[i]) { FileInfo souInfo = sourceFileInfos[i]; if (!Directory.Exists(dirTarget + souInfo.DirectoryName.Substring(dirSource.Length))) Directory.CreateDirectory(dirTarget + souInfo.DirectoryName.Substring(dirSource.Length)); modifyRecord.CopyCollection1.Add(souInfo.FullName); modifyRecord.CopyCollection2.Add(dirTarget + souInfo.FullName.Substring(dirSource.Length)); } } for (int j = 0; j < targetFileInfos.Length; j++) { if (tarLock[j]) { FileInfo tarInfo = targetFileInfos[j]; if (!Directory.Exists(dirSource + tarInfo.DirectoryName.Substring(dirTarget.Length))) Directory.CreateDirectory(dirSource + tarInfo.DirectoryName.Substring(dirTarget.Length)); modifyRecord.CopyCollection1.Add(tarInfo.FullName); modifyRecord.CopyCollection2.Add(dirSource + tarInfo.FullName.Substring(dirTarget.Length)); } } modifyRecord.source = dirSource; modifyRecord.target = dirTarget; return modifyRecord; }
/// <summary> /// 当前文件夹再次执行同步 /// </summary> /// <param name="dirSource">左文件夹</param> /// <param name="dirTarget">右文件夹</param> /// <returns>ModifyRecord</returns> private ModifyRecord ContrastDirectory(string dirSource, string dirTarget, int type) { //先读数据,然后把文件删了 Hashtable souhashtable = new Hashtable(); Hashtable tarhashtable = new Hashtable(); string sousoutarspecificText = MainWindow.CreateBackupFileName(MainWindow.FormatPath(dirSource), dirSource, dirTarget, type.ToString()); string soutarsouspecificText = MainWindow.CreateBackupFileName(MainWindow.FormatPath(dirSource), dirTarget, dirSource, type.ToString()); string tarsoutarspecificText = MainWindow.CreateBackupFileName(MainWindow.FormatPath(dirTarget), dirSource, dirTarget, type.ToString()); string tartarsouspecificText = MainWindow.CreateBackupFileName(MainWindow.FormatPath(dirTarget), dirTarget, dirSource, type.ToString()); string[] tmpcontrastFiles; if (File.Exists(sousoutarspecificText)) { tmpcontrastFiles = File.ReadAllLines(sousoutarspecificText); File.Delete(sousoutarspecificText); File.Delete(tarsoutarspecificText); } else { tmpcontrastFiles = File.ReadAllLines(soutarsouspecificText); File.Delete(soutarsouspecificText); File.Delete(tartarsouspecificText); } string[,] contrastFiles = new string[tmpcontrastFiles.Length, 2]; for (int i = 0; i < tmpcontrastFiles.Length; i++) { string contrastFile = tmpcontrastFiles[i]; string[] tmp = contrastFile.Split(new char[] { '#' }); if (tmp.Length != 2) MessageBox.Show("真是出了大问题了!!!!!"); contrastFiles[i, 0] = tmp[0]; contrastFiles[i, 1] = tmp[1]; } int contrastFilesIndexLength = contrastFiles.Length/contrastFiles.Rank; ModifyRecord modifyRecord = new ModifyRecord(); DirectoryInfo infoSource = new DirectoryInfo(dirSource); DirectoryInfo infoTarget = new DirectoryInfo(dirTarget); FileInfo[] sourceFileInfos = null; FileInfo[] targetFileInfos = null; try { sourceFileInfos = infoSource.GetFiles("*", SearchOption.AllDirectories); targetFileInfos = infoTarget.GetFiles("*", SearchOption.AllDirectories); } catch (UnauthorizedAccessException e) { Debug.WriteLine("{0}", e.Message); } // 存入hashtable for (int i = 0; i < sourceFileInfos.Length; i++) { souhashtable.Add(sourceFileInfos[i].FullName, i); } for (int i = 0; i < targetFileInfos.Length; i++) { tarhashtable.Add(targetFileInfos[i].FullName, i); } // 建立MD5缓存 string[] souMD5 = new string[sourceFileInfos.Length]; string[] tarMD5 = new string[targetFileInfos.Length]; for (int i = 0; i < sourceFileInfos.Length; i++) { souMD5[i] = ""; } for (int j = 0; j < targetFileInfos.Length; j++) { tarMD5[j] = ""; } var tarLock = new bool[targetFileInfos.Length]; var souLock = new bool[sourceFileInfos.Length]; var conLock = new bool[contrastFilesIndexLength]; for (int i = 0; i < sourceFileInfos.Length; i++) { souLock[i] = true; } for (int j = 0; j < targetFileInfos.Length; j++) { tarLock[j] = true; } for (int z = 0; z < contrastFilesIndexLength; z++) { conLock[z] = true; } //正式开始 for (int i = 0; i < contrastFilesIndexLength; i++) { conLock[i] = false; if (File.Exists(dirSource + contrastFiles[i,0])&&File.Exists(dirTarget+contrastFiles[i,0])) { #region 左右同时存在 (到目前为止可以判断的) FileInfo souInfotmp = new FileInfo(dirSource + contrastFiles[i,0]); FileInfo tarInfotmp = new FileInfo(dirTarget + contrastFiles[i,0]); tarLock[(int)tarhashtable[dirTarget + contrastFiles[i, 0]]] = false; souLock[(int)souhashtable[dirSource + contrastFiles[i, 0]]] = false; if (tarInfotmp.LastWriteTime.CompareTo(souInfotmp.LastWriteTime) > 0) { modifyRecord.CopyCollection1.Add(tarInfotmp.FullName); modifyRecord.CopyCollection2.Add(souInfotmp.FullName); modifyRecord.DeleteCollection.Add(souInfotmp.FullName); } else if (tarInfotmp.LastWriteTime.CompareTo(souInfotmp.LastWriteTime) < 0) { modifyRecord.CopyCollection1.Add(souInfotmp.FullName); modifyRecord.CopyCollection2.Add(tarInfotmp.FullName); modifyRecord.DeleteCollection.Add(tarInfotmp.FullName); } #endregion } else if (!File.Exists(dirSource + contrastFiles[i, 0]) && !File.Exists(dirTarget + contrastFiles[i, 0])) { #region 左右同时不存在 FileInfo tarInfotmp = null; FileInfo souInfotmp = null; bool tarxxx = true; for (int tarsearch = 0; tarsearch < targetFileInfos.Length; tarsearch++) { #region 在tar去找那个重命名的文件 if (tarLock[tarsearch] && getMD5(ref tarMD5, targetFileInfos[tarsearch].FullName, ref tarhashtable) .Equals(contrastFiles[i, 1])) { tarLock[tarsearch] = false; // 找到了重命名的 tarxxx = false; tarInfotmp = targetFileInfos[tarsearch]; break; } #endregion } bool souxxx = true; for (int sousearch = 0; sousearch < sourceFileInfos.Length; sousearch++) { #region 在sou去找那个重命名的文件 if (souLock[sousearch] && getMD5(ref souMD5, sourceFileInfos[sousearch].FullName, ref souhashtable) .Equals(contrastFiles[i, 1])) { souLock[sousearch] = false; souxxx = false; souInfotmp = sourceFileInfos[sousearch]; break; } #endregion } if (souxxx && tarxxx) { } else if (!souxxx && !tarxxx) { if (tarInfotmp.CreationTime.CompareTo(souInfotmp.CreationTime) > 0) { if (!Directory.Exists(dirSource + tarInfotmp.DirectoryName.Substring( dirTarget.Length))) Directory.CreateDirectory(dirSource + tarInfotmp.DirectoryName.Substring( dirTarget.Length)); modifyRecord.MoveCollection1.Add(souInfotmp.FullName); modifyRecord.MoveCollection2.Add(dirSource + tarInfotmp.FullName.Substring( dirTarget.Length)); } else { if (!Directory.Exists(dirTarget + souInfotmp.DirectoryName.Substring( dirSource.Length))) Directory.CreateDirectory(dirTarget + souInfotmp.DirectoryName.Substring( dirSource.Length)); modifyRecord.MoveCollection1.Add(tarInfotmp.FullName); modifyRecord.MoveCollection2.Add(dirTarget + souInfotmp.FullName.Substring( dirSource.Length)); } } else { if (souxxx) { modifyRecord.DeleteCollection.Add(tarInfotmp.FullName); } else { modifyRecord.DeleteCollection.Add(souInfotmp.FullName); } } #endregion } else { #region 左右文件只有一边存在 if (File.Exists(dirSource + contrastFiles[i, 0])) { souLock[(int) souhashtable[dirSource + contrastFiles[i, 0]]] = false; #region sou端存在 if ( contrastFiles[i, 1].Equals(getMD5(ref souMD5, dirSource + contrastFiles[i, 0], ref souhashtable))) { #region 存在的文件内容没变 bool xxx = true; for (int tarsearch = 0; tarsearch < targetFileInfos.Length; tarsearch++) { #region 去找那个重命名的文件 if (tarLock[tarsearch] && getMD5(ref tarMD5, targetFileInfos[tarsearch].FullName, ref tarhashtable) .Equals(contrastFiles[i, 1])) { tarLock[tarsearch] = false; // 找到了重命名的 xxx = false; if (!Directory.Exists(dirSource + targetFileInfos[tarsearch].DirectoryName.Substring( dirTarget.Length))) Directory.CreateDirectory(dirSource + targetFileInfos[tarsearch].DirectoryName.Substring( dirTarget.Length)); modifyRecord.MoveCollection1.Add(dirSource + contrastFiles[i, 0]); modifyRecord.MoveCollection2.Add(dirSource + targetFileInfos[tarsearch].FullName.Substring( dirTarget.Length)); break; } #endregion } if (xxx) { modifyRecord.DeleteCollection.Add(dirSource + contrastFiles[i, 0]); } #endregion } else { #region 存在的文件内容变化 bool xxx = true; for (int tarsearch = 0; tarsearch < targetFileInfos.Length; tarsearch++) { #region 去找那个重命名的文件 if (tarLock[tarsearch] && getMD5(ref tarMD5, targetFileInfos[tarsearch].FullName, ref tarhashtable) .Equals(contrastFiles[i, 1])) { tarLock[tarsearch] = false; // 找到了重命名的 xxx = false; if (!Directory.Exists(dirSource + targetFileInfos[tarsearch].DirectoryName.Substring( dirTarget.Length))) Directory.CreateDirectory(dirSource + targetFileInfos[tarsearch].DirectoryName.Substring( dirTarget.Length)); modifyRecord.MoveCollection1.Add(dirSource + contrastFiles[i, 0]); modifyRecord.MoveCollection2.Add(dirSource + targetFileInfos[tarsearch].FullName.Substring( dirTarget.Length)); modifyRecord.CopyCollection1.Add(dirSource + targetFileInfos[tarsearch].FullName.Substring( dirTarget.Length)); modifyRecord.CopyCollection2.Add(targetFileInfos[tarsearch].FullName); modifyRecord.DeleteCollection.Add(targetFileInfos[tarsearch].FullName); break; } #endregion } if (xxx) { modifyRecord.DeleteCollection.Add(dirSource + contrastFiles[i, 0]); } #endregion } #endregion } else { tarLock[(int) tarhashtable[dirTarget + contrastFiles[i, 0]]] = false; #region tar端存在 if ( contrastFiles[i, 1].Equals(getMD5(ref tarMD5, dirTarget + contrastFiles[i, 0], ref tarhashtable))) { #region 存在的文件内容没变 bool xxx = true; for (int sousearch = 0; sousearch < sourceFileInfos.Length; sousearch++) { #region 去找那个重命名的文件 if (souLock[sousearch] && getMD5(ref souMD5, sourceFileInfos[sousearch].FullName, ref souhashtable) .Equals(contrastFiles[i, 1])) { souLock[sousearch] = false; // 找到了重命名的 xxx = false; if (!Directory.Exists(dirTarget + sourceFileInfos[sousearch].DirectoryName.Substring( dirSource.Length))) Directory.CreateDirectory(dirTarget + sourceFileInfos[sousearch].DirectoryName.Substring( dirSource.Length)); modifyRecord.MoveCollection1.Add(dirTarget + contrastFiles[i, 0]); modifyRecord.MoveCollection2.Add(dirTarget + sourceFileInfos[sousearch].FullName.Substring( dirSource.Length)); break; } #endregion } if (xxx) { modifyRecord.DeleteCollection.Add(dirTarget + contrastFiles[i, 0]); } #endregion } else { #region 存在的文件内容变化 bool xxx = true; for (int sousearch = 0; sousearch < sourceFileInfos.Length; sousearch++) { #region 去找那个重命名的文件 if (souLock[sousearch] && getMD5(ref souMD5, sourceFileInfos[sousearch].FullName, ref souhashtable) .Equals(contrastFiles[i, 1])) { souLock[sousearch] = false; // 找到了重命名的 xxx = false; if (!Directory.Exists(dirTarget + sourceFileInfos[sousearch].DirectoryName.Substring( dirSource.Length))) Directory.CreateDirectory(dirTarget + sourceFileInfos[sousearch].DirectoryName.Substring( dirSource.Length)); modifyRecord.MoveCollection1.Add(dirTarget + contrastFiles[i, 0]); modifyRecord.MoveCollection2.Add(dirTarget + sourceFileInfos[sousearch].FullName.Substring( dirSource.Length)); modifyRecord.CopyCollection1.Add(dirTarget + sourceFileInfos[sousearch].FullName.Substring( dirSource.Length)); modifyRecord.CopyCollection2.Add(sourceFileInfos[sousearch].FullName); modifyRecord.DeleteCollection.Add(sourceFileInfos[sousearch].FullName); break; } #endregion } if (xxx) { modifyRecord.DeleteCollection.Add(dirTarget + contrastFiles[i, 0]); } #endregion } #endregion } #endregion } } // 在新的里面找相同 for (int i = 0; i < sourceFileInfos.Length; i++) { if (!souLock[i]) { continue; } for (int j = 0; j < targetFileInfos.Length; j++) { if (tarLock[j] && sourceFileInfos[i].FullName.Substring(dirSource.Length) .Equals(targetFileInfos[j].FullName.Substring(dirTarget.Length))) { souLock[i] = false; tarLock[j] = false; if (targetFileInfos[j].LastWriteTime.CompareTo(sourceFileInfos[i].LastWriteTime) > 0) { modifyRecord.CopyCollection1.Add(targetFileInfos[j].FullName); modifyRecord.CopyCollection2.Add(sourceFileInfos[i].FullName); modifyRecord.DeleteCollection.Add(sourceFileInfos[i].FullName); } else if (targetFileInfos[j].LastWriteTime.CompareTo(sourceFileInfos[i].LastWriteTime) < 0) { modifyRecord.CopyCollection1.Add(sourceFileInfos[i].FullName); modifyRecord.CopyCollection2.Add(targetFileInfos[j].FullName); modifyRecord.DeleteCollection.Add(targetFileInfos[j].FullName); } break; } } } // 双向复制 for (int i = 0; i < sourceFileInfos.Length; i++) { if (souLock[i]) { FileInfo souInfo = sourceFileInfos[i]; if (!Directory.Exists(dirTarget + souInfo.DirectoryName.Substring(dirSource.Length))) Directory.CreateDirectory(dirTarget + souInfo.DirectoryName.Substring(dirSource.Length)); modifyRecord.CopyCollection1.Add(souInfo.FullName); modifyRecord.CopyCollection2.Add(dirTarget + souInfo.FullName.Substring(dirSource.Length)); } } for (int j = 0; j < targetFileInfos.Length; j++) { if (tarLock[j]) { FileInfo tarInfo = targetFileInfos[j]; if (!Directory.Exists(dirSource + tarInfo.DirectoryName.Substring(dirTarget.Length))) Directory.CreateDirectory(dirSource + tarInfo.DirectoryName.Substring(dirTarget.Length)); modifyRecord.CopyCollection1.Add(tarInfo.FullName); modifyRecord.CopyCollection2.Add(dirSource + tarInfo.FullName.Substring(dirTarget.Length)); } } modifyRecord.source = dirSource; modifyRecord.target = dirTarget; return modifyRecord; }
/// <summary> /// 使用Echo方式分析文件夹 /// </summary> /// <param name="dirSource">源文件夹</param> /// <param name="dirTarget">目标文件夹</param> /// <returns>ModifyRecord</returns> private ModifyRecord Echo(string dirSource, string dirTarget) { var modify = new ModifyRecord(); var infoSource = new DirectoryInfo(dirSource); var infoTarget = new DirectoryInfo(dirTarget); FileInfo[] sourceFileInfos = null; FileInfo[] targetFileInfos = null; try { sourceFileInfos = infoSource.GetFiles("*", SearchOption.AllDirectories); targetFileInfos = infoTarget.GetFiles("*", SearchOption.AllDirectories); } catch (UnauthorizedAccessException e) { Debug.WriteLine("{0}", e.Message); } // TarDeals_bool数组中全为true,处理后设为false,遍历时找到true的删除 var TarDeals_bool = new bool[targetFileInfos.Length]; /// chongmingming数组中全为true,被确定成为不删除的文件时设为false,用于控制tar端的处理 /// 1----同源文件一模一样的文件 /// 2----是仅仅重命名的文件 var chongmingming = new bool[targetFileInfos.Length]; for (int i = 0; i < targetFileInfos.Length; i++) { TarDeals_bool[i] = true; chongmingming[i] = true; } for (int sou = 0; sou < sourceFileInfos.Length; sou++) { // 重命名标记 FileInfo chongmm = null; FileInfo directorychongmm = null; // a 同名标记 // b 同MD5标记 int a = 0; int b = 0; int x = 0; // 控制a的值,全部一样标签,只要找到一个fullname一致的,就一定不删除 int xx = -1; // 用于控制只会分配一个tar给sou for (int tar = 0; tar < targetFileInfos.Length; tar++) { if ( chongmingming[tar] && (targetFileInfos[tar].Name .Equals(sourceFileInfos[sou].Name)) && (MainWindow.GetMD5HashFromFile(targetFileInfos[tar].FullName) .Equals(MainWindow.GetMD5HashFromFile(sourceFileInfos[sou].FullName))) ) { if (getRelativePath(dirTarget, targetFileInfos[tar].FullName) .Equals(getRelativePath(dirSource, sourceFileInfos[sou].FullName))) { chongmingming[tar] = false; TarDeals_bool[tar] = false; x = 1; a = 1; if (xx >= 0) { chongmingming[xx] = true; TarDeals_bool[xx] = true; } break; } if (xx < 0) { chongmingming[tar] = false; TarDeals_bool[tar] = false; directorychongmm = new FileInfo(targetFileInfos[tar].FullName); a = 2; xx = tar; } } } if (x == 1) a = 1; for (int tar = 0; tar < targetFileInfos.Length; tar++) { if (MainWindow.GetMD5HashFromFile(targetFileInfos[tar].FullName). Equals(MainWindow.GetMD5HashFromFile(sourceFileInfos[sou].FullName)) && chongmingming[tar]) { // 重命名 chongmingming[tar] = false; b = 1; chongmm = new FileInfo(targetFileInfos[tar].FullName); if (a == 0) TarDeals_bool[tar] = false; break; } } if (b == 0) { if (0 == a) { modify.CopyCollection1.Add(sourceFileInfos[sou].FullName); modify.CopyCollection2.Add(getNewPath(dirSource, sourceFileInfos[sou].DirectoryName, dirTarget, sourceFileInfos[sou].Name)); } else if (1 == a) { } else if (2 == a) { modify.MoveCollection1.Add(directorychongmm.FullName); modify.MoveCollection2.Add(getNewPath(dirSource, sourceFileInfos[sou].DirectoryName, dirTarget, directorychongmm.Name)); } } else { if (0 == a) { modify.MoveCollection1.Add(chongmm.FullName); modify.MoveCollection2.Add(getNewPath(dirSource, sourceFileInfos[sou].DirectoryName, dirTarget, sourceFileInfos[sou].Name)); } else if (1 == a) { } else if (2 == a) { modify.MoveCollection1.Add(directorychongmm.FullName); modify.MoveCollection2.Add(getNewPath(dirSource, sourceFileInfos[sou].DirectoryName, dirTarget, directorychongmm.Name)); } } } for (int i = 0; i < targetFileInfos.Length; i++) { if (TarDeals_bool[i]) modify.DeleteCollection.Add(targetFileInfos[i].FullName); } // 清理文件夹 string[] sous = Directory.GetDirectories(dirSource, "*", SearchOption.AllDirectories); string[] tars = Directory.GetDirectories(dirTarget, "*", SearchOption.AllDirectories); foreach (string sou in sous) { if (!Directory.Exists(dirTarget + sou.Substring(dirSource.Length))) { string[] ll = Directory.GetFiles(sou); modify.createDirectories.Add(dirTarget + sou.Substring(dirSource.Length)); } } foreach (string tar in tars) { if (!Directory.Exists(dirSource + tar.Substring(dirTarget.Length))) { string[] ll = Directory.GetFiles(tar); modify.deleteDirectories.Add(tar); } } modify.source = dirSource; modify.target = dirTarget; return modify; }
/// <summary> /// 使用combine方式分析文件夹 /// </summary> /// <param name="dirSource">源文件夹</param> /// <param name="dirTarget">目标文件夹</param> /// <returns>ModifyRecord</returns> private ModifyRecord Combine(string dirSource, string dirTarget) { ModifyRecord modifyRecord = new ModifyRecord(); DirectoryInfo infoSource = new DirectoryInfo(dirSource); DirectoryInfo infoTarget = new DirectoryInfo(dirTarget); FileInfo[] sourceFileInfos = null; FileInfo[] targetFileInfos = null; try { sourceFileInfos = infoSource.GetFiles("*", SearchOption.AllDirectories); targetFileInfos = infoTarget.GetFiles("*", SearchOption.AllDirectories); } catch (UnauthorizedAccessException e) { Debug.WriteLine("{0}", e.Message); } // 从两端找到(rpath+文件名)相等的文件,对这些文件进行锁定 var tarLock = new bool[targetFileInfos.Length]; var souLock = new bool[sourceFileInfos.Length]; for (int i = 0; i < sourceFileInfos.Length; i++) { souLock[i] = true; } for (int j = 0; j < targetFileInfos.Length; j++) { tarLock[j] = true; } for (int i = 0; i < sourceFileInfos.Length; i++) { for (int j = 0; j < targetFileInfos.Length; j++) { if (sourceFileInfos[i].FullName.Substring(dirSource.Length) .Equals(targetFileInfos[j].FullName.Substring(dirTarget.Length))) { souLock[i] = false; tarLock[j] = false; break; } } } // sou端对应在tar的可以用来的剪切的副本,即内容相同 string[] saveCache = new string[sourceFileInfos.Length]; for (int i = 0; i < sourceFileInfos.Length; i++) saveCache[i] = ""; for (int i = 0; i < sourceFileInfos.Length; i++) { if (!souLock[i]) { continue; } for (int j = 0; j < targetFileInfos.Length; j++) { if (tarLock[j] && MainWindow.GetMD5HashFromFile(sourceFileInfos[i].FullName) .Equals(MainWindow.GetMD5HashFromFile(targetFileInfos[j].FullName))) { saveCache[i] = targetFileInfos[j].FullName; tarLock[j] = false; } } } for (int i = 0; i < sourceFileInfos.Length; i++) { FileInfo souInfo = sourceFileInfos[i]; if (!File.Exists(dirTarget + souInfo.FullName.Substring(dirSource.Length))) { if (!Directory.Exists(dirTarget + souInfo.DirectoryName.Substring(dirSource.Length))) Directory.CreateDirectory(dirTarget + souInfo.DirectoryName.Substring(dirSource.Length)); if (saveCache[i].Equals("")) { modifyRecord.CopyCollection1.Add(souInfo.FullName); modifyRecord.CopyCollection2.Add(dirTarget + souInfo.FullName.Substring(dirSource.Length)); } else { modifyRecord.MoveCollection1.Add(saveCache[i]); modifyRecord.MoveCollection2.Add(dirTarget + souInfo.FullName.Substring(dirSource.Length)); } } } modifyRecord.source = dirSource; modifyRecord.target = dirTarget; return modifyRecord; }