Exemplo n.º 1
0
        /// <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("完毕.");
        }
Exemplo n.º 2
0
        /// <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;
        }
Exemplo n.º 3
0
        /// <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;
        }
Exemplo n.º 4
0
        /// <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;
        }
Exemplo n.º 5
0
        /// <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;
        }