/// <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); }
/// <summary> /// Copie les images / Copy the images /// </summary> /// <remarks>To Add Mask see 'Where'</remarks> private void CopyImages() { //2020/10/28 déplacé var res = MB_SimpleAll.Show($"{Lang.ImagesP} ?", Lang.ImagesTitle, buttons: Dcs_Buttons2.OverWrite | Dcs_Buttons2.Pass); ITrace.WriteLine(prefix: false); ITrace.WriteLine(prefix: false); Queue <PackFile> lPackFile = new Queue <PackFile>(); // Get All images (To Add mask see at Where) Console.WriteLine($"[CopyImages] Search all images for '{_ZeGame.Title}'"); foreach (PlatformFolder plfmFolder in _ZePlatform.PlatformFolders) { //filtre switch (plfmFolder.MediaType) { case "Manual": case "Music": case "Theme Video": case "Video": continue; } // 2020 - on modify pour certains titres, la recherche string toSearch = _ZeGame.Title.Replace(':', '_').Replace('\'', '_'); toSearch = toSearch.Replace("__", "_"); // Liste du contenu des dossiers foreach (var fichier in Directory.EnumerateFiles(plfmFolder.FolderPath, "*.*", System.IO.SearchOption.AllDirectories) .Where(s => Path.GetFileName(s).StartsWith($"{toSearch}-") || Path.GetFileName(s).StartsWith($"{_ZeGame.Title}.{_ZeGame.ID}-"))) { Console.WriteLine($"\t\t[CopyImages] Found '{fichier}' in '{plfmFolder.FolderPath}'"); PackFile tmp = new PackFile(plfmFolder.MediaType, fichier); lPackFile.Enqueue(tmp); } } ITrace.WriteLine(prefix: false); EDestDecision res = EDestDecision.None; // Copy Process while (lPackFile.Count != 0) { var pkFile = lPackFile.Dequeue(); int pos = pkFile.LinkToThePath.IndexOf(pkFile.Categorie); string tail1 = Path.GetDirectoryName(pkFile.LinkToThePath).Substring(pos); // Dossier de destination string destFolder = Path.Combine(_Tree.Children[nameof(SubFolder.Images)].Path, tail1); // Fichier de destination string destFile = Path.Combine(destFolder, Path.GetFileName(pkFile.LinkToThePath)); // Création des dossiers Console.WriteLine(destFolder); if (!Directory.Exists(destFolder)) { //2020 CreateVFolders(_Tree.Children["Images"], tail1); CreateVFolders(_Tree.Children[nameof(SubFolder.Images)], tail1); } //2020 FoncSchem.MakeListFolder(_Tree.Children["Images"]); FoncSchem.MakeListFolder(_Tree.Children[nameof(SubFolder.Images)]); // copy // TODO // 21/10/2020 // CopyFile(pkFile.LinkToThePath, dest, res); bool?rezDec = false; // On déclenche en cas de conflit un handle copy + une demande avant if (File.Exists(destFile)) { // On va demander une fois que faire en cas de conflit. if (res == EDestDecision.None) { res = MB_SimpleAll.Show($"{Lang.ImagesP} ?", Lang.ImagesTitle, buttons: Dcs_Buttons2.OverWrite | Dcs_Buttons2.Pass); } // rezDec = Handle_Copy(pkFile.LinkToThePath, ref destFile, res); } if (rezDec == null) { continue; } File.Copy(pkFile.LinkToThePath, destFile, (bool)rezDec); //21/10/2020 } }
// Todo une fenêtre de copie ? // Todo créer une fonctoin de copie dans OpFile avec progression // Todo coller un trycatch /// <summary> /// Décide s'il doit y avoir copier ou non, s'il faut écraser ou non /// </summary> /// <param name="fichier"></param> /// <param name="dest"></param> /// <param name="result"></param> /// <returns></returns> private bool?Handle_Copy(string fichier, ref string dest, EDestDecision result) { bool overwrite; switch (result) { case EDestDecision.Stop: // TODO return(null); // Passer case EDestDecision.Pass: case EDestDecision.PassAll: Debug.WriteLine("Pass"); return(null); case EDestDecision.Trash: case EDestDecision.TrashAll: Debug.WriteLine("Trash"); return(false); // --- En cas de renommage case EDestDecision.Rename: // Le fichier cible devra être renommé. dest = FilesFunc.Choose_AName(dest, $"{_ZeGame.ExploitableFileName}-"); return(false); case EDestDecision.OverWrite: case EDestDecision.OverWriteAll: Debug.WriteLine("Overwrite"); return(true); default: Debug.WriteLine("Default"); return(false); /*2020 * * -------- plus la peine car automatiquement on vérifie si le fichier existe et non plus seulement * si la variable est nulle; * * case EOPResult.Source_Error: * ITrace.WriteLine("File missing"); * return false; * * */ } // 2020 enlevé Directory.SetCurrentDirectory(dest); /* string filename = Path.GetFileName(fichier); * string destLink = Path.Combine(dest, filename); */ // 2020 enlevé Directory.SetCurrentDirectory(_GamePath); return(true); }