D'ailleurs tiens je me demande comment je peux copier le fichier auquel correspond le fileinfo affiché dans ma textbox..
Une idée ?
D'ailleurs tiens je me demande comment je peux copier le fichier auquel correspond le fileinfo affiché dans ma textbox..
Une idée ?
@adn56, c'est comme ça que tu fait pour la progressbar sur des fichiers ?
Je vais expliquer pourquoi je ne trouve pas la progressbar réelle viable dans ce cas.
Etape 1
Pour récupérer le nombre de fichier, le code met 1840 ms chez moi, c'est comme ça que tu créer ton compteur ?
Etape 4
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 string[] lst = Directory.GetFiles(@"E:\", "*.*", SearchOption.AllDirectories); int CountFile = lst.Length;
Après tu fait progresser la bar à chaque itération dans la boucle for.
Ce code met 48 ms chez moi
Conclusion,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 for (int i = 0; i < lst.Count(); i++) lst[i] = new FileInfo(lst[i]).Name;
On gel l'application pendant 97,5% du traitement pour afficher une barre progressif pour les 2,5% restant.
Dans mon cas je ne suis pas sur qu'une progresse bar de 48 ms fasse patienter l'utilisateur, je ne sais même pas si il la verra, par contre 2s d'attente il va le ressentir.
non Eric tu ne fais pas QUE récupérer le nombre de fichier avec ta méthode (tu fais tout le boulot )
pour avoir QUE le nombre de fichier à lister
Code : Sélectionner tout - Visualiser dans une fenêtre à part DirectoryInfo.GetFiles().Length
Aprés je fais une fonction récursive et c'est dans cette fonction que j'incrémente de 1 ma progressbar à chaque fichier trouvé
https://msdn.microsoft.com/fr-fr/library/6yk7a1b0.aspx
@eric: Oui l'utilisateur rentre manuellement le nom du fichier qu'il souhaite et choisit celui qui l’intéresse dans la liste des suggestion de la textbox, ensuite avec l'appui sur un bouton je voudrais que ça copie / colle le fichier correspondant à la textbox vers le chemin rentré dans la textbox2.
@Adn: Desolé d'avance pour ma question mais, c'est quoi une fonction récursive et comment ça fonctionne ? ^^'
@adn56
Ton code ne donne pas le nombre de fichiers dans les sous répertoires, oui ça doit allé assez vite du coup.
Code : Sélectionner tout - Visualiser dans une fenêtre à part DirectoryInfo.GetFiles().Length
Ces 2 lignes mettent le même temps d'exécution ca me parait normal, j'ai louper quelques choses adn56 ?
PS : Dans la ligne de code DirectoryInfo.GetFiles().Length la méthode GetFiles (la plus consommatrice en temps) est exécuté de la même façon que dans DirectoryInfo.GetFiles()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int c = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Length; int d = new DirectoryInfo(path).GetFiles("*.*", SearchOption.AllDirectories).Length;
Voir test : http://www.codeproject.com/Articles/...ory-Enumerator
Salut les gars !
Petite question par rapport a la ligne System.IO.File.Copy..
Comment je peut utiliser l'option " searchoption.Alldirectories " ? j'ai bien cherché mais je n'y parvient po..
C'est pour pouvoir copier mes fichiers qui se trouvent dans mes sous-dossiers !
Nous avions parlé de localiser le fichier avant de le copier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part string FindPath = Directory.GetFiles(@"C:\MSOCache", "Office64WW.msi", SearchOption.AllDirectories).FirstOrDefault();
Ha oui d'accord ! alors du coup ton code la ( arrêtes moi si je me trompe ) localise le fichier "Office64WW.msi" dans "C:\MSOCache", c'est ca ?
Oui
Bon bin nickel ca fonctionne parfaitement !
Un gros merci a toi eric, un fois de plus tu me sauve la mise ! ^^
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 string FindPath = Directory.GetFiles(@"\\chemin_reseau\", textBox1_id.Text, SearchOption.AllDirectories).FirstOrDefault(); File.Copy(@"\" + FindPath, @"C:\test\" + textBox1_id.Text);
Bon par contre nouveau probleme...
Quand j'utilise ton code pour afficher le panel dans la propriété " Show " de ma form2, ca s'affiche bien mais pas comme je veux..
Ca fait:
1) Je click sur mon bouton pour lancer ma form2
2) J'attend a peu près 20 secondes le temps que ma form scan le répertoire réseau ainsi que tout les sous-répertoires.
3) Ma form s'affiche avec le panel " Veuillez patienter " et apres je peux en disposer..
Moi je voudrais que le panel s'affiche et me fasse patienter le temps que ma textbox scan le repertoire reseau, pas apres...
Une idée ? un thread peut etre ?
Je pensait que tu utiliserai la méthode du panel dans ta Form1 à l'ouverture de l'application ?
Par contre je n'ai pas bien comprit ce qui ne s’affiche pas comme tu veux.
Non non, la " copie assistée " n'est qu'un module de mon projet finale !
En fait depuis ma form1 avec l'appui sur un bouton je lance ma form2 ( le module copie assistée ) et c'est ce dernier qui ne se lance qu'une fois qu'il a finit de scanner le " chemin_reseau ".
L'idée c'est, vu que ma form2 met du temps a se lancer, d'afficher une form " intermédiaire " pour faire patienter l'utilisateur pendant le scan.
C'est clair la ? je me rends pas bien compte..
salut eric, j'ai du mal m'exprimer, pour la progressbar j'ai dit de faire une fonction récurcive (qui s'appelle elle même)
voila ce que j'avais fait y'a 5 ans en vb pour ce faire, il ne reste plus qu'a incrémenter la progress à chaque itération (et c'est surrement moins optimiser que le getfile du framework)
bonne lecture je pars en week-end
ce bout de code tourne toujours dans une de mes applications de sauvegarde auto sur mes nass, faudrait que je revois ça LOL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 Public Function NombreFichiers(ByVal dirInfo As System.IO.DirectoryInfo) As Integer ' vérification de la cohérence du chemin If Not dirInfo.Exists Then Return -1 : Exit Function Dim total As Integer = 0 For Each Fichier As System.IO.FileInfo In dirInfo.GetFiles() total += 1 Next For Each Dossier As System.IO.DirectoryInfo In dirInfo.GetDirectories() total += NombreFichiers(Dossier) 'récursif attention ! Next Return total End Function ' à faire pour progress bar Public Function TailleRepertoire(ByVal dirInfo As System.IO.DirectoryInfo) As Long ' vérification de la cohérence du chemin If Not dirInfo.Exists Then Return 0 : Exit Function Dim total As Long = 0 For Each Fichier As System.IO.FileInfo In dirInfo.GetFiles() total += Fichier.Length Next For Each Dossier As System.IO.DirectoryInfo In dirInfo.GetDirectories() total += TailleRepertoire(Dossier) 'récursif attention ! Next Return total End Function ' à faire pour progress bar
Je te propose une class que j'ai faite qui permet de faire patienter l'utilisateur.
Elle te servira surement plusieurs fois.
Elle s'utilise comme ça (par exemple) :
La class (je n'arrive pas à la mettre en pièce jointe d'ici), à sauvegarder dans un fichier 'SplashScreen.cs' par exemple et à ajouter au projet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SplashScreen.Splash SS = new SplashScreen.Splash(); private void Form1_Shown(object sender, EventArgs e) { this.Enabled = false; SS.Show(); string[] aa = Directory.GetFiles(@"F:\", "*.*", SearchOption.AllDirectories); SS.Close(); this.Enabled = true; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 using System.Windows.Forms; using System.Threading; namespace SplashScreen { public partial class Splash { private volatile bool NeedClose = false; Thread T; public void Show() { NeedClose = false; T = new Thread(new ParameterizedThreadStart(loop)); T.IsBackground = true; T.Start(this); } public void Close() { NeedClose = true; T.Join(); T = null; } private static void loop(object obj) { Splash @this = (Splash)obj; SplashScreenForm Splashform = new SplashScreenForm(); Splashform.Show(); while (!@this.NeedClose) { Splashform.Refresh(); Thread.Sleep(50); } Splashform.Dispose(); Splashform = null; } private partial class SplashScreenForm : Form { public SplashScreenForm() { InitializeComponent(); } private System.Windows.Forms.Label label1; private System.Windows.Forms.ProgressBar progressBar1; private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.progressBar1 = new System.Windows.Forms.ProgressBar(); this.SuspendLayout(); // // label1 // this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label1.ForeColor = System.Drawing.SystemColors.MenuHighlight; this.label1.Location = new System.Drawing.Point(12, 9); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(216, 38); this.label1.TabIndex = 0; this.label1.Text = "Veuillez patienter ..."; this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.label1.UseWaitCursor = true; // // progressBar1 // this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.progressBar1.Location = new System.Drawing.Point(12, 50); this.progressBar1.Name = "progressBar1"; this.progressBar1.Size = new System.Drawing.Size(216, 23); this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee; this.progressBar1.TabIndex = 2; this.progressBar1.UseWaitCursor = true; // // SplashScreenForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(240, 85); //this.ControlBox = false; this.Controls.Add(this.progressBar1); this.Controls.Add(this.label1); //this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "SplashScreenForm1"; this.ShowIcon = false; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; //this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; //this.Text = ""; this.UseWaitCursor = true; this.ResumeLayout(false); } // Désactive le bouton X et la possibilité de Alt + F4 private const int CP_NOCLOSE_BUTTON = 0x200; protected override CreateParams CreateParams { get { CreateParams myCp = base.CreateParams; myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON; return myCp; } } // Désactive la posibilité de déplacer la form protected override void WndProc(ref Message message) { const int WM_SYSCOMMAND = 0x0112; const int SC_MOVE = 0xF010; switch (message.Msg) { case WM_SYSCOMMAND: int command = message.WParam.ToInt32() & 0xfff0; if (command == SC_MOVE) return; break; } base.WndProc(ref message); } } } }
@adn56 :
Peut être.
Si le calcul de la ProgressBar est trop significatif par rapport au traitement elle n'a aucun intérêt.
Prendre 10s pour calculer/estimer une ProgressBar qui mettra 10s de traitement, n'est selon moi, pas rentable (dans notre cas nous effectuerions deux fois le même travail ).
Voici ma vision de notre cas pratique et problème :
Nous souhaitons afficher une ProgressBar pour voir l'avancement réel du listage des fichiers.
- Pour estimer la ProgressBar, on as besoin de connaitre le nombre de fichier total.
- Pour connaitre le nombre de fichier total nous avons besoin de connaitre la liste des fichiers.
Si nous pouvions connaitre le nombre de fichier en 1ms et que le listage prenait 10s, je serait d'accord.
J'ai bien comprit ton exemple VB récursif.
Prenons l'exemple de la fonction 'NombreFichiers' qui calcul le nombre de fichier dans un répertoire ainsi que ses sous répertoires (en se rappelant elle même sur les sous-dossiers).
La fin de la ProgressBar doit être égal au nombre total de fichier, donc une fois que tu as ce chiffre tu as déjà fini ton traitement.
Si tu pense avoir une idée/solution viable par rapport au problème posé, merci de nous la présenter de façon moins théorique.
Eric ta classe est juste parfaite ! le résultat est top, pile poil ce que je cherchais a faire ! =) gros merci !
Apres pour le problème de la progressebar dont vous discutez avec adn56, plutôt qu'une progressbar, pourquoi ne pas mettre un label qui énumère les fichiers traités au fur et a mesure que le scan avance ? un peu a la Photoshop vous voyez ?
Je me demande si du coup le problème reste le même ou pas..
Une progressBar marque (sans fin) ou les fichiers qui défile c'est pareil
Non du coup le problème ne serai pas le même.
Salut les mecs !
Bon alors voici mon code qui fonctionne impec tout bien comme je le veux et ce, grace a vous !
Un gros merci a eric pour sa classe qui permet de faire patienter l'utilisateur !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace SCI_ASSIST { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { this.Close(); } private void Form2_Load(object sender, EventArgs e) { } SplashScreen.Splash SS = new SplashScreen.Splash(); private void button1_Click(object sender, EventArgs e) { if (textBox1_id.Text == "") { MessageBox.Show("Veuillez saisir le nom du fichier desiré", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } if (textBox2_FRCdistant.Text == "") { MessageBox.Show("Veuillez saisir le chemin de destination desiré", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { this.Enabled = false; SS.Show(); string FindPath = Directory.GetFiles(@"\\chemin_reseau", textBox1_id.Text, SearchOption.AllDirectories).FirstOrDefault(); SS.Close(); this.Enabled = true; try { File.Copy(@"\" + FindPath, @"\\" + textBox2_FRCdistant.Text + @"\d$\" + textBox1_id.Text); notifyIcon1.BalloonTipText = ("Copie terminée avec succès !"); notifyIcon1.BalloonTipTitle = ("SCI_Assist"); notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; notifyIcon1.ShowBalloonTip(1000); } catch { MessageBox.Show("Impossible de copier le fichier ID vers l'endroit selectionné, il se peut que ce soit car le fichier existe deja dans la destination ou que le chemin de destination soit injoignable.", "", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } //SplashScreen.Splash SS = new SplashScreen.Splash(); private void Form2_Shown(object sender, EventArgs e) { this.Enabled = false; SS.Show(); textBox1_id.AutoCompleteCustomSource.Clear(); string[] lst = Directory.GetFiles(@"\\chemin_reseau", "*.*", SearchOption.AllDirectories); for (int i = 0; i < lst.Count(); i++) lst[i] = new FileInfo(lst[i]).Name; textBox1_id.AutoCompleteCustomSource.AddRange(lst.OrderBy(a => a).ToArray()); SS.Close(); this.Enabled = true; } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { } } }
penses à cliquer sur le bouton "résolu" pour clôturer ton post.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager