Contrôle date fichier [Résolu]

Signaler
Messages postés
29
Date d'inscription
lundi 3 mars 2008
Statut
Membre
Dernière intervention
26 mars 2008
-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
Bonjour,
Dans le cadre d'un stage, je suis en train de déveloper une application pour libérer de l'espace sur le serveur où sont stockés les fichiers des employés.Je vais vous la décrire:
-l'utilisateur choisi le dossier où sont sauvegardés ses fichiers
-l'application va copier tout le dossier sur le C:
-elle va supprimer du serveur tous les fichiers dont la dernière écriture remonte à 30 jours ou plus

J'ai réussi à faire la copie sur le C: mais je n'arrive pas à concevoir d'algoritme pour cela (et étant en BTS réseau bcp de subtilité de VB m'échappent).Voilà cmt je conçois ce code: il devra aller dans le dossier sélectionné par l'utilisateur(je suppose que ce dossier contient des sous-dossier et des fichiers), il devra faire la vérification des dates sur les fichiers puis supprimer ceux concernés.Ensuite il doit aller dans le premier sous-dossiers, et refaire le traitement d'abors sur les fichiers, et ensuite dans les éventuels sous-dossiers.Quand il a terminé il doit remonter juste avant le dernier dossier vérifié et refaire le traitement.Ce n'est peut-être pas trés clair, je termine mon explication avec un petit schéma:
________________________________________________________________________________________
dir1
      fic2
dir2
      fic3
dir3
      fic4
      dir4
            fic5
dir5
      fic6
fic1
________________________________________________________________________________________
L'appli va traiter fic1, puis rentrer ds dir1, traiter fic2,revenir à la racine,rentrer ds dir2, traiter fic3,revenir,rentrer ds dir3,traiter fic4, rentrer ds dir4 traiter fic5,revenir en arrière afin de rentrer dans dir5, de traiter fic6, puis fin.


J'èspère avoir été le plus clair possible ^^


Je vous remercie d'avance pour l'aide que vous voudrez bien m'accordez ça fait 2 jours que je bloque dessus et je commence à prendre du retard :S

14 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
recursivité...

Sub CleanFolder ( Dossier )
Pour chaque Fichier de Dossier
Si DateModif de Fichier > 30 jours
Alors
Supprime Fichier
FinSi
FinPour
Pour Chaque SousDossier de Dossier
CleanFolder SousDossier
Si SousDossier vide
Alors
Supprime SousDossier
FinSi
FinPour
End Sub
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
15 minutes de codage, et encore, j'ai tatonné car je ne code pas en .Net.

Imports System.IO

Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
My.Computer.FileSystem.CopyDirectory("C:\font", "C:\save", True)
CleanFolder(My.Computer.FileSystem.GetDirectoryInfo("C:\font"))
End Sub

Private Sub CleanFolder(ByRef voFolder As System.IO.DirectoryInfo)
For Each oFile As FileInfo In voFolder.GetFiles
If oFile.LastWriteTime.AddDays(5) < DateTime.Now Then
oFile.Delete()
End If
Next
For Each oFolder As DirectoryInfo In voFolder.GetDirectories
CleanFolder(oFolder)
Next
If voFolder.GetFiles.GetLength(0) 0 And voFolder.GetDirectories.GetLength(0) 0 Then
voFolder.Delete()
End If
End Sub
End Class
Messages postés
29
Date d'inscription
lundi 3 mars 2008
Statut
Membre
Dernière intervention
26 mars 2008

Bon j'ai écrit le code, mais je rencontre des problèmes(normal ^^).
Je joins le code, si quelqu'un avait le temps  de me dire cmt arranger les erreurs rencontrées, parce que j'y perds mon latin :S
-au niveau de CopieRepertoire()  ==>  SystemIO.IOException
-et plein d'autres erreurs sûrement

Imports

System.IO
Public

Class Form1

Dim root, dirsource
As
String
'dossier source

'affichage de la boîte de dialogue permettant le choix du répertoire source

Private
Sub btParcourir_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles btParcourir.Click

'si l'utilisateur

If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK
Then

'dirsource prend comme valeur le chemin selectionné par l'utilisateurroot = FolderBrowserDialog1.SelectedPath

'le chemin est convertis en caractère pour être affiché dans txtBox1txtBox1.Text = root.ToString

Else

Me.Close()

End
If

End
Sub

'procédure sur bouton ANNULER

Private
Sub btAnnuler_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles btAnnuler.ClickMsgBox(

"Sauvegarde obligatoire une fois pas mois!!")

Me.Close()

End
Sub

Private
Sub CopieRepertoire(
ByVal RepertoireSource
As
String,
ByVal RepertoireDestination
As
String)

My.Computer.FileSystem.CopyDirectory(root,
"C:\Save")

End
Sub

Dim Fi
As FileInfo

Dim dif
As
Integer

Private
Sub calculLastWrite()dif = DateDiff(DateInterval.Day, Now, Fi.LastWriteTime)

End
Sub

Private
Sub traitementSD()

For
Each sousRepertoire
As
String
In Directory.GetDirectories(dirsource)TraitementFichier(dirsource)

Next

End
Sub

Private
Sub TraitementFichier(
ByVal dirsource)

For
Each fichier
As
String
In Directory.GetFiles(dirsource)calculLastWrite()

If dif >= 5
ThenFile.Delete(fichier)

End
IftraitementSD()

Next

End
Sub

Private
Sub btOk_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles btOk.ClickCopieRepertoire(dirsource,

"C:\Save")TraitementFichier(root)

MsgBox(

"Sauvegarde accomplie")

Me.Close()

End
Sub 

End

Class
Messages postés
29
Date d'inscription
lundi 3 mars 2008
Statut
Membre
Dernière intervention
26 mars 2008

si y a moyen sur un forum de joindre des fichiers dites moi cmt on fait(j'ai pas trouvé), si vous voulez je joins le dossier contenant mon pojet VB, cela surement plus clair pour voir les bug divers
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
plein de choses coincent...

LastWrite de quoi ? Fi fait reference à rien.
PrivateSub calculLastWrite()
dif = DateDiff(DateInterval.Day, Now, Fi.LastWriteTime)
EndSub

fais des fonctions, qui renvoient des valeurs, ne passe pas ainsi par des variables publiques, utilise des parametres
Messages postés
29
Date d'inscription
lundi 3 mars 2008
Statut
Membre
Dernière intervention
26 mars 2008

Euh j'ai trouvé ce code sur un tuto(pour la fonction calculLastWrite).Pour Fi je pensais mettre dans la variable Fi la date de dernière écriture du fichier traité...)
Fi est rattaché à FileInfo.
Donc je devrais faire quelque chose qui ressemble à ça?

PrivateSub calculLastWrite(ByVal Now,ByVal Fi.LastWriteTime):Résultat(je chercherais la syntaxe :-) ) 
   Retourner  DateDiff(DateInterval.Day, Now, Fi.LastWriteTime)
EndSub

Cela doit être monstrueux mais mes notions de dev sont vraiment basiques.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
je confirme la monstruosité de la chose ^^

System.IO.File.GetLastWriteTime(sFilePath)

te donnera l'info sur la date de modif du fichier sFilePath

donc faire ce genre de choses

If System.IO.File.GetLastWriteTime("C:\a.txt").AddDays(5) < DateTime.Now Then
'# Fichier a.txt plus vieux que cinq jours
End If
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
pour ton erreur sur CopyDirectory, voir la doc
http://msdn2.microsoft.com/fr-fr/library/2swy9y5e.aspx
Messages postés
29
Date d'inscription
lundi 3 mars 2008
Statut
Membre
Dernière intervention
26 mars 2008

Je reposte mon code(au passage si vous savez cmt on fait pour joindre des fichiers au message que j'évite d'alourdir le forum), je ne comprends pas j'ai toujours un problème à CopieRepertoire()==>IOException QD LE REPERTOIRE C:\Save est REMPLIE avec mes dossiers tests, est qd le dossier c:\Save est vide, j'ai un problème de boucle infini avec TraitementFichier().Je pensais que l'erreur venait de TraitementSD() placée avant le Next, mais même placée aprés le problème persiste...
Merci de votre aide 

Imports




System.IO


Public






Class
Form1


Dim
root, dirsource

As



String



'dossier source

'affichage de la boîte de dialogue permettant le choix du répertoire source

Private



Sub
btParcourir_Click(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles
btParcourir.Click


   'si l'utilisateur
   
If
FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK

Then

      'dirsource prend comme valeur le chemin selectionné par l'utilisateur

      root = FolderBrowserDialog1.SelectedPath


      'le chemin est convertis en caractère pour être affiché dans txtBox1

      txtBox1.Text = root.ToString


   Else

      Me
.Close()


   End



If

End



Sub


'procédure sur bouton ANNULER

Private



Sub
btAnnuler_Click(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles
    btAnnuler.Click
   MsgBox(

"Sauvegarde obligatoire une fois pas mois!!"
)


   Me
.Close()


End



Sub


Const
dirdest

As



String
=

"C:\Save"

Public



Sub
CopieRepertoire(

ByVal
dirsource

As



String
,

ByVal
dirdest

As



String
)


   My
.Computer.FileSystem.CopyDirectory(dirsource, dirdest)


End



Sub






Private



Sub
traitementSD()


   For



Each
sousRepertoire

As



String



In
Directory.GetDirectories(dirsource)
      TraitementFichier(dirsource)


   Next

End



Sub






Private



Sub
TraitementFichier(

ByVal
dirsource)


   For



Each
fichier

As



String



In
Directory.GetFiles(dirsource)


      If
System.IO.File.GetLastWriteTime(dirsource).AddDays(5) < DateTime.Now

Then

      File.Delete(fichier)


      End



If

   Next

   traitementSD()


End



Sub






Private



Sub
btOk_Click(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles
btOk.Click
dirsource = root
CopieRepertoire(dirsource, dirdest)
TraitementFichier(root)
MsgBox(

"Sauvegarde accomplie"
)


Me
.Close()


End



SubEnd





Class
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
tu devrais pas faire plutot :

Const dirdest As String = "C:\Save"

??

(on ne peux ajouter de fichier ici, faut copier/coller le code)
Messages postés
29
Date d'inscription
lundi 3 mars 2008
Statut
Membre
Dernière intervention
26 mars 2008

J'ai essayié mais cela ne fonctionne pas...Et tu aurais une idée pour la boucle infini
Je vais fouiller du côté des valeurs que prennent mes variable root et dirsource peut-être que c'est là... 
Messages postés
29
Date d'inscription
lundi 3 mars 2008
Statut
Membre
Dernière intervention
26 mars 2008

ça maaaaaarche!!!Tu resteras mon héros à tout jamais!!j'ai plus qu'à habiller le tout, mettre une barre de progression de tâche, un menu pour contacter l'admin en cas de problème, une explication du but de l'appli au démarrage de l'appli.....pas mal de truc en fait mais bon le plus gros est passé je pense!! ^^
Je vais en griller une à ta santé et encore merci
Messages postés
29
Date d'inscription
lundi 3 mars 2008
Statut
Membre
Dernière intervention
26 mars 2008

Hum même si c'est pas le bon forum , cela concerne tjrs l'appli sur laquelle tu m'as aidé.Je voulais savoir comment faire pour faire que mon appli se lance automatiquement tous les 30 jours?sans être obligé de rajouter une clé de registre sur chaque poste du réseau, sachant que l'appli devra être installé sur chaque poste, à moins que je trouve quelque chose pour la laisser sur un serveur, et faire qu'elle s'exécute sur chaque poste depuis le serveur?.?.?.?
Merci
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
tu dois pouvoir le faire par script automatique au lancement de la session Windows

Renfield
Admin CodeS-SourceS- MVP Visual Basic