Ejemplo n.º 1
0
        internal void SimpleCopyManager(string fileSrc, ref E_Decision previousDec, string destFile)
        {
            if (CancelToken.IsCancellationRequested)
            {
                throw new OperationCanceledException("Operation stopped");
            }

            if (!destFile.Contains(_WFolder))
            {
                throw new Exception($"[CreateFolders] Erreur la chaine '{destFile}' ne contient pas '{_WFolder}'");
            }


            // Création des dossiers
            string destFolder = Path.GetDirectoryName(destFile);

            if (!Directory.Exists(destFolder))
            {
                Directory.CreateDirectory(destFolder);
            }

            //string destFile = Path.Combine(destFolder, Path.GetFileName(fileSrc));

            E_Decision?conflictDec = previousDec;

            bool overwrite = false;

            if (File.Exists(destFile))
            {
                HeTrace.Write($"[CopyHandler] Destination file exists... ", this);
                if (conflictDec == E_Decision.None)
                {
                    conflictDec = PackMe_IHM.Ask4_FileConflict(fileSrc, destFile, E_DxConfB.OverWrite | E_DxConfB.Pass | E_DxConfB.Trash);

                    // Mémorisation pour les futurs conflits
                    switch (conflictDec)
                    {
                    case E_Decision.PassAll:
                    case E_Decision.OverWriteAll:
                    case E_Decision.TrashAll:
                        previousDec = conflictDec == null ? E_Decision.None : (E_Decision)conflictDec;
                        break;
                    }
                }

                HeTrace.EndLine(conflictDec.ToString(), this);
                switch (conflictDec)
                {
                case E_Decision.Pass:
                case E_Decision.PassAll:
                    SetStatus(this, new StateArg($"Pass: {fileSrc}", CancelFlag));
                    return;

                case E_Decision.OverWrite:
                case E_Decision.OverWriteAll:
                    SetStatus(this, new StateArg($"OverWrite: {destFile}", CancelFlag));
                    overwrite = true;
                    break;

                case E_Decision.Trash:
                case E_Decision.TrashAll:
                    SetStatus(this, new StateArg($"Trash: {destFile}", CancelFlag));
                    OpDFiles.Trash(destFile);
                    break;
                }
            }

            // --- Copie
            SetStatus(this, new StateArg($"Copy {fileSrc}", CancelFlag));
            SetProgress(this, new ProgressArg(0, 1, CancelFlag));
            FilesFunc.Copy(fileSrc, destFile, overwrite);
            SetProgress(this, new ProgressArg(1, 1, CancelFlag));

            // --- Vérification des sommes
            this.SetStatus(this, new StateArg($"Copy verification", CancelFlag));
            //this.SetMaximum(this, 100);

            //bool? res = _ObjectFiles.VerifByHash_Sync(fileSrc, destFile, () => MD5.Create());
            //var res = _ObjectFiles.DeepVerif(fileSrc, destFile, () => MD5.Create());

            this.SetStatus(this, new StateArg($"Check verif: {res}", CancelFlag));
            //this.UpdateProgress?.Invoke(100);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Function advanced
        /// </summary>
        /// <param name="dbPath">Chemin déjà stocké en db</param>
        /// <param name="destLocation">Emplacement de destination</param>
        /// <param name="mediatype">Type de media, fourni par le fichier xml
        ///   <remarks>(Manual, Music, Video...)</remarks>
        /// </param>
        /// <param name="Assignation">Définit à quelle variable on va assigner le chemin relatif calculé</param>
        private bool CopySpecific(string dbPath, string destLocation, string mediatype, Func <string, string> Assignation)
        {
            // Normal copy, if path exists
            if (File.Exists(dbPath))
            {
                Copy_Handler(dbPath, destLocation, mediatype);

                // L'assignation permet de transmettre le résultat d'une fonction à une variable
                Assignation(DxPaths.Windows.DxPath.ToRelative(Settings.Default.LBPath, dbPath));
            }
            else
            {
                // On récupère le dossier concerné par le média
                PlatformFolder plafFolder = null;
                foreach (PlatformFolder pFormfolder in _ZePlatform.PlatformFolders)
                {
                    if (pFormfolder.MediaType.Equals(mediatype))
                    {
                        plafFolder = pFormfolder;
                        break;
                    }
                }
                //MessageBox.Show(_ZeGame.Title +"  "+ zeOne.FolderPath);

                // 2020 - Formatage de la chaine pour éviter les erreurs
                string tosearch = _ZeGame.Title.Replace(':', '_').Replace('\'', '_');
                tosearch = tosearch.Replace("__", "_");

                // array of files with a part of the name
                string[] files = Directory.GetFiles(plafFolder.FolderPath, $"{tosearch}*.*", System.IO.SearchOption.AllDirectories);

                /*
                 * // case array is empty
                 * if (files.Length <= 0)
                 * {
                 *  MessageBox.Show($"Searching for {mediatype} returned 0 results", $"Searching for {mediatype}", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 *  return false;
                 * }*/


                #region processing on files founded

                MB_ListFiles mbL = new MB_ListFiles();
                mbL.Message = $"Select {mediatype} matching.\rNote: There is an automatic preselection ";

                // bypass
                string[] bypass = new string[] { "-", " -" };

                ushort numberF = 0;
                foreach (string fichier in files)
                {
                    string filename = Path.GetFileNameWithoutExtension(fichier);
                    // Test if total match
                    if (filename.Equals(tosearch))
                    {
                        // On ajoute à la liste des checkbox
                        mbL.AddItem(fichier, true);
                        numberF++;
                    }
                    //Test if match with bypass
                    else
                    {
                        // On test avec chaque bypass
                        foreach (var b in bypass)
                        {
                            if (filename.StartsWith(tosearch + b))
                            {
                                // On ajoute à la liste des checkbox
                                mbL.AddItem(fichier, true);
                                numberF++;
                                break;
                            }
                        }
                    }
                }

                //if(mbL.Menu.MenuItems.Count)
                #endregion

                // 2020
                // case array is empty or no corresponding file even with bypass
                //if (files.Length <= 0 || mbL.Menu == null)
                if (numberF <= 0)
                {
                    MessageBox.Show($"Searching for {mediatype} returned {numberF} results", $"Searching for {mediatype}", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return(false);
                }
                // 2020

                // Affichage de la boite de selection;
                List <string> dFiles = null;
                if (mbL.ShowDialog() == DialogResult.Yes)
                {
                    dFiles = mbL.CheckedFiles;
                }
                // old List<string> dFiles = OPFiles.Search_Files(tosearch, plafFolder.FolderPath, System.IO.SearchOption.TopDirectoryOnly, "-", " -");


                // En cas d'abandon ou de fichier non trouvé on renvoie false
                if (dFiles == null || dFiles.Count == 0)
                {
                    return(false);
                }

                #region
                // Traitement des fichiers pour la copie
                foreach (string fichier in dFiles)
                {
                    // 2020
                    // Analyses du fichier
                    //if()
                    // 2020

                    //Recherche de fichiers déjà présents
                    string destFile = Path.Combine(destLocation, Path.GetFileName(fichier));

                    // On fait un prétest pour limiter - Le but est d'évaluer si le fichier de destination existe déjà
                    if (File.Exists(destFile))
                    //if(fichier.Equals(fichier1))
                    {
                        /*
                         * On teste les fichiers pour voir s'ils sont les mêmes en plus d'avoir le même nom
                         * - Si c'est le cas on va passer, on va passer, puisque l'intégrite est vérifiée
                         * - S'ils sont différents, on va proposer de renommer, passer.
                         *
                         */

                        // 2020-10-16
                        //Normalement copy handler doit tout gérer
                        Copy_Handler(fichier, destLocation, mediatype);



                        /*
                         * OPFiles opF = new OPFiles()
                         * {
                         *
                         * };
                         * opF.IWriteLine += new RetourMessage(x => ITrace.WriteLine(x));
                         *
                         * // Vérification totale
                         * var res = opF.DeepVerif(fichier, destFile, () => MD5.Create());
                         *
                         */
                        //Demande s'il n'y a pas correspondance mais fichiers similaires.
                        //if(res == EFileResult.NoMatch)


                        // test similarity
                        //var res = OPFiles.DeepCompare(fichier, destFile, $"Copy_{mediatype}", () => MD5.Create(), Dcs_Buttons.All, x=> ITrace.WriteLine(x));
                    }
                    else
                    {
                        FilesFunc.Copy(fichier, destFile, false);
                    }
                    //var res = OPFiles.FileNameCompare(fichier, destLocation, $"Copy_{mediatype}", Dcs_Buttons.NoStop, x => ITrace.WriteLine(x));
                    //  CopyFile(fichier, destLocation, res);
                }
                Assignation(DxPaths.Windows.DxPath.ToRelative(Settings.Default.LBPath, dFiles[0]));
                return(true);

                #endregion
            }
            //
            //if (resCopy) return;

            //
            return(false);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Gère la copie en examinant la totale similitude des fichiers
        /// </summary>
        /// <param name="srcFile"></param>
        /// <param name="destLocation"></param>
        /// <param name="mediatype"></param>
        private bool Copy_Handler(string srcFile, string destLocation, string mediatype)
        {
            // 2020
            // Test de la similitude en profondeur
            //FilesFunc.Check4Crash();
            OPFiles neoOPF = new OPFiles()
            {
            };

            neoOPF.IWrite     += new RetourMessage((x) => ITrace.BeginLine(x));
            neoOPF.IWriteLine += new RetourMessage((x) => ITrace.WriteLine(x));

            // Booleen pour déterminer si l'on écrase ou pas
            bool overW = false;

            // Vérification en profondeur
            // Annulé EOPResult res = OPFiles.Copy_DeepVMode(dbPath, destLocation, $"Copy_{mediatype}", () => MD5.Create(), Dcs_Buttons.NoStop, x => ITrace.WriteLine(x));
            string      fileName = Path.GetFileName(srcFile);
            string      destFile = Path.Combine(destLocation, fileName);
            EFileResult verif    = neoOPF.DeepVerif(srcFile, destFile, () => MD5.Create());

            bool copyRes = false;                   // Stocke le résultat de la copie


            switch (verif)
            {
            case EFileResult.DifferentSize:
            case EFileResult.DifferentHash:


                // Check selon les résultats de ce qu'il faut faire


                // Demande à l'utilisateur
                // EDestDecision res = MB_Decision.Show($"Copy_Handler: {Lang.Dest_File_Exists}, { Lang.Replace_Question} ?", $"{Lang.Alert} - Copy_Handler", destination: destLocation, buttons: Dcs_Buttons.All);
                EDestDecision res = MB_Decision.Show($"Copy_Handler: {Lang.Dest_File_Exists}, { Lang.Replace_Question} ?", $"{Lang.Alert} - Copy_Handler", source: srcFile, destination: destFile, buttons: Dcs_Buttons.All);


                // On passe si l'utilisateur ne veut pas écraser ou renommer

                /*if (res == EDestDecision.Pass || res == EDestDecision.PassAll)
                 *  return;
                 */


                // On utilise une fonction de traitement sur le fichier de destination (renommer, envoyer à la poubelle)
                neoOPF.DestFileAction(res, destFile);


                // Selon le résultat de la boite on copie ou non le fichier
                bool?overwrite = Handle_Copy(srcFile, ref destFile, res);
                if (overwrite != null)
                {
                    copyRes = FilesFunc.Copy(srcFile, destFile, (bool)overwrite);
                }

                break;

            // Gère si la source a une taille 0 (entre autre)
            case EFileResult.Source_Error:
                break;

            case EFileResult.Destination_Error:
            case EFileResult.NoMatch:
                ITrace.WriteLine($"PackMe: Copy of '{fileName}'");
                copyRes = FilesFunc.Copy(srcFile, destFile, false);

                break;

            default:
                ITrace.WriteLine($"PackMe: Copy of '{fileName}' avoided");
                break;
            }


            return(copyRes);
            // 2020


            //2020 EOPResult res = OPFiles.FileNameCompare(dbPath, destLocation, $"Copy_{mediatype}", Dcs_Buttons.NoStop, x => ITrace.WriteLine(x));

            // assignation du chemin relatif à la variable


            // return CopyFile(dbPath, destLocation, res);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Copie les roms, regroupe les fichiers sur les images
        /// </summary>
        /// <param name="dbPath"></param>
        /// <param name="destLocation"></param>
        /// <returns></returns>
        private bool CopyRoms(string dbPath, string destLocation)
        {
            /*
             * On part du principe que le dossier rom DOIT être rempli
             */
            if (_zBackGame.ApplicationPath.Length <= 0)
            {
                return(false);
            }


            string extRom = Path.GetExtension(_zBackGame.ApplicationPath);

            // si aucune extension on ne pack pas le fichier
            if (extRom.Length <= 0)
            {
                return(false);
            }
            try
            {
                // résultat pour définir si on copie ou pas
                EOPResult res;

                // Traitement dans le cas d'un fichier cue
                if (extRom.Equals(".cue", StringComparison.OrdinalIgnoreCase))
                {
                    //Lecture du fichier cue
                    Cue_Scrapper cuecont = new Cue_Scrapper(_zBackGame.ApplicationPath);

                    //Folder containing files
                    string sourceFold = Path.GetDirectoryName(_zBackGame.ApplicationPath);

                    // Copie de tous les fichiers


                    // Fonctionne avec le nom du fichier
                    foreach (string fileName in cuecont.Files)
                    {
                        // Donne le lien complet vers le fichier
                        string source = Path.Combine(sourceFold, fileName);

                        /*18/10/2020
                         * // Hardlink
                         * // string destination = Path.Combine(destLocation, fileName);
                         *
                         *
                         * // 2020 Todo
                         * // Test if already copied
                         *
                         *
                         * res = OPFiles.FileNameCompare(source, destLocation, $"Copy_Rom", Dcs_Buttons.NoStop, x => ITrace.WriteLine(x));
                         *
                         * // Copy
                         * // 2020
                         * /*
                         * CopyFile(source, destLocation, res);
                         */

                        /*18 / 10 / 2020
                         * FilesFunc.Copy(source, Path.Combine(des, res);
                         */
                        // 18/10/2020


                        // 2020 remplacement
                        string destFile = Path.Combine(destLocation, fileName);

                        // On fait un prétest pour limiter - Le but est d'évaluer si le fichier de destination existe déjà
                        if (File.Exists(destFile))
                        //if(fichier.Equals(fichier1))
                        {
                            /*
                             *
                             *
                             *   /*
                             * On teste les fichiers pour voir s'ils sont les mêmes en plus d'avoir le même nom
                             * - Si c'est le cas on va passer, on va passer, puisque l'intégrite est vérifiée
                             * - S'ils sont différents, on va proposer de renommer, passer.
                             *
                             */

                            // 2020-10-16
                            //Normalement copy handler doit tout gérer

                            /*    Copy_Handler(fichier, destLocation, mediatype);
                             *
                             *
                             *
                             *  /*
                             *  OPFiles opF = new OPFiles()
                             *  {
                             *
                             *  };
                             *  opF.IWriteLine += new RetourMessage(x => ITrace.WriteLine(x));
                             *
                             *  // Vérification totale
                             *  var res = opF.DeepVerif(fichier, destFile, () => MD5.Create());
                             *
                             */
                            //Demande s'il n'y a pas correspondance mais fichiers similaires.
                            //if(res == EFileResult.NoMatch)


                            // test similarity
                            //var res = OPFiles.DeepCompare(fichier, destFile, $"Copy_{mediatype}", () => MD5.Create(), Dcs_Buttons.All, x=> ITrace.WriteLine(x));
                        }
                        else
                        {
                            FilesFunc.Copy(source, destFile, false);
                        }
                        //2020
                    }
                    //        return true;
                }

                // Traitement dans tous les cas (si c'est un cue on en a aussi besoin)

                /*else
                 * /*{*/
                //2020/18/10 res = OPFiles.FileNameCompare(dbPath, destLocation, $"Copy_Rom", Dcs_Buttons.NoStop, x => ITrace.WriteLine(x));
                _zBackGame.ApplicationPath = DxPaths.Windows.DxPath.ToRelative(Settings.Default.LBPath, dbPath);


                //TODO voir peut être si présence avant de copier ?
                // On copie le fichier donné dans la base
                // Copy handler ne peut fonctionner que si on lui file un fichier source et un ficher destination à analyser


                return(Copy_Handler(dbPath, destLocation, "Rom"));

                /*
                 * return CopyFile(dbPath, destLocation, res);
                 */


                //return true;
                // }
            }
            catch (Exception exc)
            {
                return(false);
            }
        }