PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Copier uniquement les fichiers différents
Copier uniquement les fichiers différents
Iniciado por MB, 06,may. 2020 21:21 - 17 respuestas
Miembro registrado
62 mensajes
Publicado el 06,mayo 2020 - 21:21
bonjour,
j'utilise ces 3 petites lignes de code :

fCopieFichier("*.fic","Données Maintenance"+DateVersChaîne(DateSys(),"JJ-MM-AAAA"),frJauge)
fCopieFichier("*.mmo","Données Maintenance"+DateVersChaîne(DateSys(),"JJ-MM-AAAA"),frJauge)
fCopieFichier("*.ndx","Données Maintenance"+DateVersChaîne(DateSys(),"JJ-MM-AAAA"),frJauge)

elles sauvegardent simplement mes fichiers dans un répertoire Données Maintenance

j'aimerais effectuer un petit changement. Celui de remplacer la sauvegarde de tous les fichiers, par la sauvegarde uniquement des fichiers différents (donc ceux qui auraient été modifiés pour faire simple)

j'ai trouvé le terme de "hidentique" quelque part mais je n'arrive pas à l'exploiter ni trouver la solution.
si ca intéresse quelqu'un de m'aider merci.

--
M. B.
Miembro registrado
49 mensajes
Publicado el 07,mayo 2020 - 06:40
Bonjour moi pour tester si un fichier existe je fais

HRecherchePremier(Nom_Fichier,Cle,valeur_a_tester)
SI HTrouve = Vrai // doublon

SINON

FIN


je sais pas si c'est une bonne méthode mais elle fonctionne
Miembro registrado
4.362 mensajes
Publicado el 07,mayo 2020 - 08:49
Bonjour,
Regarde du côté de HVersion. Il suffit de comparer le N° de version actuel avec celui de la dernière utilisation de l'application.
Les MMO et NDX étant intimement liés aux FIC, si la version du FIC a changé (i.e. la table a été modifiée,) celle des MMO et NDX aussi.

Sinon, en HFSQL/CS, il suffit de configurer tes backups. En CLASSIC, tu peux ajouter tes conditions à ton logiciel de backup préféré. Il suffit d'ajouter

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
62 mensajes
Publicado el 07,mayo 2020 - 20:28
merci de ta réponse mais je voudrais copier uniquement les fichiers "modifiés" vers mon répertoire de sauvegarde et non pas savoir si les fichiers existent déjà.

--
M. B.
Miembro registrado
4.362 mensajes
Publicado el 07,mayo 2020 - 20:54
Si tu avais lu la doc de Version, tu aurais vu que si la valeur de version a changé, c'est que le fichier a été modifié.

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
4.362 mensajes
Publicado el 07,mayo 2020 - 20:55
https://doc.pcsoft.fr/fr-FR/?3044020&name=hversion_fonction

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
310 mensajes
Publicado el 08,mayo 2020 - 11:19
Bonjour,
Il faut s'entendre sur le terme MODIFIER : Certains parlent de modification de structure, d'autres de contenu.

Je pense que MB parle de contenu, auquel cas, on peut (par exemple) faire une comparaison physique de 2 fichiers avec fCompare() et ne copier que si un changement a été opéré depuis la dernière copie.

Bon dev
Publicado el 08,mayo 2020 - 12:09
Bonjour,

Très bonne remarque Samir !
Bon dev

Rastam
Miembro registrado
62 mensajes
Publicado el 08,mayo 2020 - 13:46
Voroltinquo,
Avant d'avancer que je n'ai pas lu la doc, commence d'abord par me poser la question.
Ensuite tu pourras parler de façon certaine, sans dire n'importe quoi.
J'ai lu la doc...
Mais mon niveau n'est certainement pas au niveau du tient en programmation Windev c'est certain.
Aussi, si je viens (rarement) sur ce forum, c'est pour essayer d'obtenir de l'aide et parfois une solution de la part de quelqu'un qui trouve du plaisir à aider.
Je te remercie toutefois d'avoir "participé" à résoudre mon problème.
...
Il y a peut être plus simple, mais, ça ne tourne pas obligatoirement pour tous...

--
M. B.
Miembro registrado
62 mensajes
Publicado el 08,mayo 2020 - 13:49
Samir,
c'est effectivement ce que je voulais dire.
c'était en effet le contenu et non pas la structure.
j'avais peut-être mal formulé ma question mais tu as vue juste.
je vais essayer dCompare et essayer de trouver la solution
merci de ton intervention et bonne journée.

--
M. B.
Publicado el 08,mayo 2020 - 22:02
Bonjour,
Voroltinquo a raison, inutile de vous emporter, surtout pour des personnes qui donne beaucoup de leur temps pour les débutants.
En fait hVersion ne signifie pas que le fichier a été modifié dans l'analyse. HVersion permet en effet de savoir si vous avez fait un insert, un update ou un delete sur le fichier. C'est la méthode la plus simple de faire ce que vous demandez. fCompare est surtout utilisé pour des fichiers autres que HyperFile ( Vous êtes certainement en Classic). Quand vous passerez en C/S vous verrez que la réponse de Voroltinquo est encore plus indiqué. De plus fCompare fait une comparaison Byte par Byte, question perfomance c'est limite.

La seule chose dans votre cas c'est que en utilisant HVersion, vous devez stocker quelques par dans votre BD ou dans un fichier txt la valeur de votre Hversion récupérée lors de la dernière sauvegarde de votre fichier.

nIdVersionDuFichier est un entier = HVersion(NomFichierHyperF) //A stocker avec la dernière sauvegarde

Avant la nouvelle sauvegarde vérifier que HVersion n'a pas changé. Si c'est le cas c'est qu'un enregistrement a été modifié.

Bon Dev
Miembro registrado
62 mensajes
Publicado el 09,mayo 2020 - 17:33
Bonjour BMarcellin,
je ne m'emporte pas :D
mais participer à un forum d'aide avec comme réponses des "t'as qu'à lire..." ou "c'est pourtant simple..." je ne trouve pas ça très aidant.
mais l'incident est clos.
merci de votre contribution à mon post.
votre proposition commune avec Voroltinquo pour HVersion est sûrement la bonne, mais trop compliquée pour moi.
avec la proposition de Samir et une petite recherche, j'ai saisi les quelques lignes ci dessous :

ResComparaison est un entier
ResComparaison = fCompare("VEHICULES.FIC", "Sauvegarde\VEHICULES.fic")
SELON ResComparaison
CAS 0 : FinProgramme()
CAS 1 : fCopieFichier("ASCENSEURS.FIC", "Sauvegarde\VEHICULES.fic")
CAS -1 : Info("Le premier fichier n'a pas été trouvé")
CAS -2 : Info("Le second fichier n'a pas été trouvé")
CAS -3 : Erreur(ErreurInfo(errMessage))
FIN
FinProgramme()

le résultat est exactement ce que je voulais.
seul problème maintenant c'est que j'ai dans mon application 50 fichiers et je ne trouve pas la solution pour réaliser l'équivalent de ces lignes de code qui ne concernent qu'un fichier pour la totalité de mes fichiers.
merci et bonne fin de journée

--
M. B.
Miembro registrado
4.362 mensajes
Publicado el 09,mayo 2020 - 18:21
Bonjour,
Regarde du côté de HListeFichier

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
4.362 mensajes
Publicado el 10,mayo 2020 - 10:01
En fait tout (ou presque) se passe au niveau de l'initialisation et de la fermeture du projet.
Dans l'initialisation on va récupérer les couples(NomFichier,Version) que l'on aura sauvegardé dans la fermeture du projet.
HListeFichier renvoie quelque chose qui peut (et va) être converti en tableau. Ce tableau sera modifié (au niveau de la version) au fur et a mesure des sauvegarde. Il y a sauvegarde, donc le fichier a été modifié donc sa version a changé.
On peut travailler sur un tableau "classique" de 2 chaines, (Nom,Version) à la limite dans notre cas, un tableau associatif serait mieux, nous aurions un tableau d'entier indexé sur le nom.
J'ai opté pour un tableau de structures, et comme la sauvegarde concerne cette structure, je suis passé à un tableau de classes.

Cette classe est quasiment minimaliste. 2 membres, un constructeur, 2 getters et un setter (propriétés en WLangage) et une méthode (la sauvegarde).

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
4.362 mensajes
Publicado el 10,mayo 2020 - 10:22
Comme on ne peux plus éditer, il y aura plusieurs post.
Classe CVersionFichier :
CVersionFichier est une Classe
PRIVÉ
m_sNomFichier est une chaîne
m_nVersioninitiale est entier
FIN

Procedure Constructeur(sFichier est chaîne="")
SI sFichier<>"" ALORS
m_sNomFichier=sFichier
m_nVersioninitiale=HVersion(sFichier)
FIN

//Getters
Procedure PUBLIQUE p_NomFichier() : chaîne

RENVOYER m_sNomFichier
Procedure PUBLIQUE p_VersionInitiale() : entier

RENVOYER m_nVersioninitiale

//Setter
Procedure PUBLIQUE p_VersionInitiale(nValeur est un entier)

m_nVersioninitiale=nValeur

//****************
//* Sauvegarde *
//****************

// Résumé : Effectue la sauvegarde d'un fichier dans un répertoire
// Syntaxe :
//Sauvegarder ( [<bTotale> est booléen])
//
// Paramètres :
// bTotale (booléen - valeur par défaut=0) : Vrai si le fichier doit être sauvegardé quelle que soit sa version
// Valeur de retour :
// Aucune
//
// Exemple :
// Indiquez ici un exemple d'utilisation.
//
Procedure Sauvegarder(bTotale est un booléen=Faux)
sCheminOrigine est une chaîne
sDestination est chaîne
//Variable créée pour lisibilité
nVersionActuelle est entier

ErreurPropage("Erreur de sauvegarde") //Permet la gestion des erreurs par la fonction d'appel

sCheminOrigine=fConstruitChemin(fRepDonnées,:p_NomFichier,"FIC")
sDestination=ChaîneConstruit("%1%2%3",ComplèteRep(fRepDonnées),"Sauvegarde",DateVersChaîne(DateDuJour,"JJ-MM-AAAA"))
nVersionActuelle=HVersion(:p_NomFichier)

SI (:p_VersionInitiale<>nVersionActuelle) OU bTotale ALORS
SI PAS fRepExiste(sDestination) ALORS
fRepCrée(sDestination)
FIN
fCopieFichier(sCheminOrigine,sDestination,frJauge)
:p_VersionInitiale=HVersion(:p_NomFichier)
//Les copies de MMO et NDX sont inutiles car on peut les récupérer via HRéindexe
FIN


***************************
* Initialisation du projet *
**************************
gtabListeVersion est tableau de CVersionFichier
gbufSauvegardeVersion est Buffer

gbufSauvegardeVersion=ChargeParamètre("Versions","") //Récupération des paramètres sauvegardés
InitialiserVersions()

CAS ERREUR:
Erreur("Une erreur est survenue dans l'initialisation",ErreurInfo(errMessage))


On va détailler :
Procedure InitialiserVersions()

SI gbufSauvegardeVersion="" ALORS//Aucun paramètre sauvegardés
RécupérerVersionCourante()
SauvegardeTotale()
SINON //Récupération des versions
Désérialise(gtabListeVersion, gbufSauvegardeVersion, psdBinaire)
FIN

On approfondit :
// Résumé : Associe une version à son fichier
// Syntaxe :
// RécupérerVersionCourante ()
//
// Paramètres :
// Aucun
// Valeur de retour :
// Aucune

Procedure RécupérerVersionCourante()
sListe est chaînes
sFichier est chaîne
clFIchierCourant est CVersionFichier

sListe=HListeFichier()
POUR TOUTE chaîne sFichier de sListe SEPAREE PAR RC
clFIchierCourant=allouer un CVersionFichier(sFichier) //Récupère la version via le constructeur
TableauAjouteLigne(gtabListeVersion,clFIchierCourant)
FIN


Procedure SauvegardeTotale()
clFichierEnCours est CVersionFichier

POUR TOUT clFichierEnCours de gtabListeVersion
clFichierEnCours:Sauvegarder(Vrai)
FIN


Enfin la fermeture du projet :
//Sauvegarde des versions
Sérialise(gtabListeVersion,gbufSauvegardeVersion,psdBinaire)
SauveParamètre("Version",gbufSauvegardeVersion)


Le plus gros est fait.

Ta sauvegarde différentielle maintenant c'est la petite sœur de la sauvegarde totale à un paramètre près :
Procedure BackupDifférentiel()
clFichierEnCours est CVersionFichier

POUR TOUT clFichierEnCours de gtabListeVersion
clFichierEnCours:Sauvegarder()
FIN


--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
62 mensajes
Publicado el 10,mayo 2020 - 17:57
Wahhhh...
Merci à toi Voroltinquo.
Je n'ai pas le temps ce soir de me pencher sur cette aide (qui à premier abord me fait peur :D) mais je me lancerais le we prochain à tête reposer.
Merci d'avoir pris du temps pour cette aide.
Passes une bonne fin de we.

--
M. B.
Miembro registrado
4.362 mensajes
Publicado el 10,mayo 2020 - 18:35
A la limite, il faut commencer par la fin.
On effectue la procédure de sauvegarde pour chaque paire (Fichier,version) des fichier de l'analyse.
Il faudra ensuite voir comment la sauvegarde est effectuée (ou pas) etc...
J'ai l'habitude d'atomiser donc le code semble lourd, mais il est finalement plus simple à lire, à tester et à debugger (au cas où)

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
62 mensajes
Publicado el 15,mayo 2020 - 15:39
Bonjour Voroltinquo,
demain je me lance dans tes explications... mais au cas ou je ne redonne pas de nouvelle suite à un échec et un isolement de ma part loin de la civilisation, je m'aperçois que dès le début j'aurais du mentionner le terme de "synchroniser".
C'est en effet, peut-être qu'en employant d'entrer ce terme j'aurais été plus clair.
"Synchronisation de mes fichiers de travail vers mon répertoire de sauvegarde"
Je pense que si j'avais employer le bon terme cela aurait été plus simple.
Bonne fin de journée.

--
M. B.