Précédent   Forum du club des développeurs et IT Pro > Dotnet > Langages > C#
C# Forum d'entraide sur la programmation C#. Avant de poster -> FAQ C#, Articles C#, Sources C#
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/01/2013, 09h47   #1
harghan
Candidat au titre de Membre du Club
 
Homme
Etudiant
Inscription : janvier 2013
Messages : 50
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 50
Points : 12
Points : 12
Par défaut Deplacer Dossier D'un pc a un serveur via c#

Merci de lire mon Dernier message en bas du thread, Changement complet de sujet.
harghan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 10h39   #2
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 658
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 658
Points : 2 783
Points : 2 783
La balise [ CODE][ /CODE] existe

Le programme ne plante pas mais reste bloquer car il n'y a qu'un seul Thread et que tu lui demandes de se figer (Sleep d'un seconde)

Il faut jouer avec soit un timer, soit creer un autre thread
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 10h50   #3
MvK0610
Membre régulier
 
Homme Fabien
Développeur .NET
Inscription : juin 2012
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : juin 2012
Messages : 61
Points : 88
Points : 88
Salut,

Ton programme ne plante pas à proprement parlé.
C'est surtout que tu lances une boucle infinie sur le thread principal de ton application et qu'une fois lancé tu ne peux plus interagir sur l'interface.

A mon sens le mieux serait d'utiliser la classe background worker.

Tu trouveras un tutoriel sur l'utilisation de cette classe ici:
http://webman.developpez.com/article...ckroundworker/

Tu disposes également d'un exemple concret ici

Bonne chance.
MvK
__________________
Les questions ne sont pas obligées d'avoir du sens. Mais les réponses, si.
Terry Pratchett (Procrastination)
MvK0610 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 11h39   #4
vladvonjim
Candidat au titre de Membre du Club
 
Homme
Inscription : octobre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 45
Points : 14
Points : 14
Essaye un truc comme ça mais j'ai pas testé.
Et c'est la première fois que j'essaye d'aider kkun alors te fie pas trop a moi ;D
Code :
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
public int i;
public BackgroundWorker bgwboucle;
 
        public void bgwboucle_Dowork(object sender, DoWorkEventArgs e)
        { 
          int o = 0;
 
            do{
 
                o++;
                UIUpdaterDelegate delegate1 = delegate {
                nbcycle.Text = Convert.ToString(o);
                };
                nbcycle.Invoke(delegate1); // Label affiche nombre de  cycle effectué
                Thread.Sleep(1000); // Pause: 1Sec
            } while (this.i == 1);
        }
 
        private void launch_Click(object sender, EventArgs e)
        {
            this.i = 1;
            if(!this.bgwboucle.IsBusy)
            {
                 this.bgwboucle.RunWorkerAsync();
            }
        }
 
        private void stop_Click(object sender, EventArgs e)
        {
            this.i = 0;            
        }
 
this.bgwboucle.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwboucle_DoWork);
Citation:
Envoyé par harghan Voir le message
Bonjour, je suis actuellement en stage Informatique en industrie et je doit effectuer une Moulinette avec pause.


JE suis sous Visual studio 2005.


Donc je prend tout depuis le debut.

J'ai creer un projet application c# (avec interface graphique)

J'ai fait une interface graphique bouton Demarrer / arreter et un label qui affiche le nombre de cycle effectué.



Edit: j'en suis arriver a ceci:


Code :
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
public void boucle (int i)
        { 
          int o = 0;
 
            do{
 
                o = o + 1;
                nbcycle.Text = Convert.ToString(o); // Label affiche nombre de  cycle effectué
                System.Threading.Thread.Sleep(1000); // Pause: 1Sec
            } while (i == 1);
 
 
        }
 
        private void launch_Click(object sender, EventArgs e)
        {
            boucle(1);
 
 
 
        }
 
        private void stop_Click(object sender, EventArgs e)
        {
 
            boucle(0);
 
        }
Le programme plante lorsque j'appuie sur le bouton lancer
help
vladvonjim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 11h44   #5
neilbgr
Membre émérite
 
Avatar de neilbgr
 
Homme Neil
Développeur .NET
Inscription : août 2004
Messages : 627
Détails du profil
Informations personnelles :
Nom : Homme Neil
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2004
Messages : 627
Points : 828
Points : 828
Et le while ?
la variable i ne varie jamais... donc boucle infinie... pas la peine de sortir l'artillerie lourde avec le BackgroundWroker ! (En tous cas, pas de suite).
Suggestion :
au lieu de
À priori, effectivement l'utilisation d'un timer serait largement plus approprié !
__________________
"Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
"Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
"Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry
neilbgr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 11h54   #6
MvK0610
Membre régulier
 
Homme Fabien
Développeur .NET
Inscription : juin 2012
Messages : 61
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur .NET
Secteur : Transports

Informations forums :
Inscription : juin 2012
Messages : 61
Points : 88
Points : 88
Citation:
Et le while ?
la variable i ne varie jamais... donc boucle infinie... pas la peine de sortir l'artillerie lourde avec le BackgroundWroker !
Je penses que la boucle infini c'est le but recherché.
D'où l'utilisation d'un autre thread via BgW,ce qui me semble le plus propre. Après je peux me planter.

Si on reste dans le main thread impossible de mettre à jour le label avec le nombre d’occurrences de cycle, sauf si on utilise l'Application.doEvents() ce qui serait, à mon sens, fort peu subtil.

MvK
__________________
Les questions ne sont pas obligées d'avoir du sens. Mais les réponses, si.
Terry Pratchett (Procrastination)
MvK0610 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 12h07   #7
vladvonjim
Candidat au titre de Membre du Club
 
Homme
Inscription : octobre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 45
Points : 14
Points : 14
Citation:
Envoyé par neilbgr Voir le message
Et le while ?
la variable i ne varie jamais... donc boucle infinie... pas la peine de sortir l'artillerie lourde avec le BackgroundWroker ! (En tous cas, pas de suite).
Ben il a 2 boutons il dit. Un qui lance la boucle l'autre qui l'arrête
Le premier bouton fixe this.i a 1 et lance le backgroundworker qui tourne temps qu'on click pas sur le bouton stop qui passe this.i à 0
C'est sur on doit pouvoir faire mieux mais dans le principe ça devrais marcher non ?
vladvonjim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 12h10   #8
vladvonjim
Candidat au titre de Membre du Club
 
Homme
Inscription : octobre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 45
Points : 14
Points : 14
Citation:
Envoyé par MvK0610 Voir le message
Si on reste dans le main thread impossible de mettre à jour le label avec le nombre d’occurrences de cycle, sauf si on utilise l'Application.doEvents() ce qui serait, à mon sens, fort peu subtil.

MvK
d'ou le UIUpdaterDelegate non ? enfin moi sur mon programme j'utilise ça de partout ça met a jour les label en temps réel même si je suis sur une autre Tab
vladvonjim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 13h07   #9
moldavi
Membre Expert
 
Homme david
Responsable développement
Inscription : décembre 2003
Messages : 1 295
Détails du profil
Informations personnelles :
Nom : Homme david
Âge : 38
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Responsable développement
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2003
Messages : 1 295
Points : 2 115
Points : 2 115
Bonjour.

Un truc simple pour commencer et pour comprendre :

Code :
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
 
 
private bool bContinue;
 
public void boucle ()
        { 
          int o = 0;
 
            do{
 
                o = o + 1;
                nbcycle.Text = Convert.ToString(o); // Label affiche nombre de  cycle effectué
                System.Threading.Thread.Sleep(1000); // Pause: 1Sec
            } while (bContinue);
 
 
        }
 
        private void launch_Click(object sender, EventArgs e)
        {
            bContinue = true;
            boucle();
        }
 
        private void stop_Click(object sender, EventArgs e)
        {
 
            bContinue = false;
 
        }
PS : préférer les méthodes proposées précédemment.
__________________
Media Foundation video decoder mpeg1/mpeg2, MediaSource Kinect
http://sourceforge.net/projects/mfnode/

http://jeux.developpez.com/faq/directx/?page=dshow
moldavi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 16h14   #10
harghan
Candidat au titre de Membre du Club
 
Homme
Etudiant
Inscription : janvier 2013
Messages : 50
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 50
Points : 12
Points : 12
Bon ben, L'interface n'etant pas obligatoire (vu que c'est un petit logiciel qui tourne sans l'aide de personne)

je suis passer a une appli console.

J'ai donc reussi ma boucle avec le timer etc

Maintenant le probleme qui se presente c'est que j'ai eu l'idée d'utiliser Directory.Move pour Deplacer les Dossier

Sauf qu'avec cette commande, on ne peux transferer des dossiers d'un endroit a un autre du MEME disque dur.



Code: [Sélectionner]

Variables:
Code :
1
2
3
 
string Dossier1 = @"Z:\Soft_**\***_***\Desktop";
string Dest1 = @"C:\serv\";
dans le main:


Code :
1
2
 
   Directory.Move(Dossier1,Dest1);
Erreur affiché:

Le chemin d'accès source et celui de destination doivent avoir des racines identiques. Le déplacement n'est pas possible entre ces volumes.




Je me retrouve bloqué sur 'Comment deplacer les dossiers D'un PC a un serveur (via reseau). (Z = serveur // C = Local).

P.s (les etoiles sur les chemins, c'est juste de la censure.)



Une solution
harghan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 16h19   #11
harghan
Candidat au titre de Membre du Club
 
Homme
Etudiant
Inscription : janvier 2013
Messages : 50
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 50
Points : 12
Points : 12
Doublon, Message a supprimer
harghan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 16h22   #12
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 658
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 658
Points : 2 783
Points : 2 783
Directory.Copy(source,destination)
Directory.Delete(source)

Pourquoi faire simple quand on peut faire compliquer


dans un try catch ca peut etre utile
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 16h23   #13
harghan
Candidat au titre de Membre du Club
 
Homme
Etudiant
Inscription : janvier 2013
Messages : 50
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 50
Points : 12
Points : 12
Citation:
Envoyé par BenoitM Voir le message
Directory.Copy(source,destination)
Directory.Delete(source)

Pourquoi faire simple quand on peut faire compliquer


dans un try catch ca peut etre utile


Directory.Copy N'existe pas
ou du moins mon Visual Studio ne me le propose pas.


Edit: en regardant sur le net, il y aurait une alternative a Directory.Copy

Ce serait:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
private void XCopy(string dir1, string dir2)
        {
 
 
            string[] files = Directory.GetFiles(dir1);
 
            foreach (string f in files)
            {
                File.Copy(f, dir2 + f.Substring(dir1.Length), true);
            }
 
 
            string[] dirs = Directory.GetDirectories(dir1);
            foreach (string d in dirs)
            {
                XCopy(d, dir2 + d.Substring(dir1.Length));
            }

Sauf que quand je met cette fonction Dans ma class

Mon main ne reconnait pas Xcopy, je n'arrive pas a utiliser la fonction, pourquoi ?
harghan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 17h15   #14
synolog
Membre expérimenté
 
Avatar de synolog
 
Homme
Administrateur systèmes et réseaux
Inscription : septembre 2011
Messages : 532
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : septembre 2011
Messages : 532
Points : 590
Points : 590
incompréhensible ton Thread!!
Nouveau sujet = Nouveau thread
Problème d'accès, tu appels surement ta méthode depuis une méthode static.
Essai avec
Code :
private static void XCopy(...)
synolog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 17h36   #15
harghan
Candidat au titre de Membre du Club
 
Homme
Etudiant
Inscription : janvier 2013
Messages : 50
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 50
Points : 12
Points : 12
Citation:
Envoyé par FrameBreak Voir le message
incompréhensible ton Thread!!
Nouveau sujet = Nouveau thread
Problème d'accès, tu appels surement ta méthode depuis une méthode static.
Essai avec
Code :
private static void XCopy(...)


Je prend note pour mes prochains threads.

Merci beaucoup pour le static !!!



Voila nouveau message d'erreur.

Impossible de trouver une partie du chemin d'accès


Voici le code:


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
 
 public static void copidos(string dir1, string dir2)
        {
 
 
 
            string[] files = Directory.GetFiles(dir1);
            foreach (string f in files)
            {
                File.Copy(f, dir2 + f.Substring(dir1.Length), true);
            }
 
            string[] dirs = Directory.GetDirectories(dir1);
 
            foreach (string d in dirs)
            {
                copidos(d, dir2 + d.Substring(dir1.Length));
            }
 
 
        }
Variables:
Code :
1
2
3
4
5
6
7
8
9
10
 
 
 
  string Dossier1 = @"Z:\Soft_***\****_***\Desktop";
            string Dossier2 = @"Z:\Soft_*****_***\Documents";
            string Dossier3 = 
@"Z:\Soft_***\****_***\***_***_****_DISTRIBUTION";
 
 
 string Dest1 = @"C:\serv\";
et le code
Code :
1
2
3
4
5
 
 
                    copidos(Dossier1,Dest1);
                    copidos(Dossier2, Dest1);
                    copidos(Dossier3, Dest1);

l'endroit surligner est:

Code :
1
2
3
4
5
6
7
 
 
 
string[] files = Directory.GetFiles(dir1);
 
 
de la fonction


Une explication ?
harghan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 18h11   #16
synolog
Membre expérimenté
 
Avatar de synolog
 
Homme
Administrateur systèmes et réseaux
Inscription : septembre 2011
Messages : 532
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : septembre 2011
Messages : 532
Points : 590
Points : 590
Cela arrive quelque fois lors de l'accès aux lecteurs réseaux, si je ne me trompe pas c'est ton cas.
La seule solution est de recréer le lecteur réseau:
Code :
1
2
3
4
5
6
7
if(!Directory.Exists(@"Z:\")){
                Process delete = Process.Start("net.exe", @"use Z: /DELETE /YES");
                delete.WaitForExit();
 
                Process create = Process.Start("net.exe", @"use Z: \\SERVEUR\Path password /USER:username /PERSISTENT:YES");
                create.WaitForExit();
}
Cela devrait corriger ton problème d'accès réseau
synolog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 21h34   #17
moldavi
Membre Expert
 
Homme david
Responsable développement
Inscription : décembre 2003
Messages : 1 295
Détails du profil
Informations personnelles :
Nom : Homme david
Âge : 38
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Responsable développement
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2003
Messages : 1 295
Points : 2 115
Points : 2 115
Bonjour.

Citation:
Envoyé par harghan Voir le message
Merci de lire mon Dernier message en bas du thread, Changement complet de sujet.
Changement complet, ça veut dire nouveau thread.

Ce thread aurait dû être signalé :

Il faut remettre le message d'origine, sinon ce thread sera incompréhensible.
__________________
Media Foundation video decoder mpeg1/mpeg2, MediaSource Kinect
http://sourceforge.net/projects/mfnode/

http://jeux.developpez.com/faq/directx/?page=dshow
moldavi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 09h00   #18
harghan
Candidat au titre de Membre du Club
 
Homme
Etudiant
Inscription : janvier 2013
Messages : 50
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Etudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2013
Messages : 50
Points : 12
Points : 12
Citation:
Envoyé par FrameBreak Voir le message
Cela arrive quelque fois lors de l'accès aux lecteurs réseaux, si je ne me trompe pas c'est ton cas.
La seule solution est de recréer le lecteur réseau:
Code :
1
2
3
4
5
6
7
if(!Directory.Exists(@"Z:\")){
                Process delete = Process.Start("net.exe", @"use Z: /DELETE /YES");
                delete.WaitForExit();
 
                Process create = Process.Start("net.exe", @"use Z: \\SERVEUR\Path password /USER:username /PERSISTENT:YES");
                create.WaitForExit();
}
Cela devrait corriger ton problème d'accès réseau


Malheuresement cela ne viens pas de la, et je viens de remarquer un truc,


Le dossier 1 & 2 est effectivement bien copié, mais le dossier 3 non.


Le dossier 1 contient un .exe, le dossier 2 contient un .txt, et le dossier 3 contient un autre dossier

du coup le programme se stop a ce moment j'ai remarqué que cela bloque sur la ligne ou il y a le GETFILES.


Je pense que je doit faire une condition 'si c'est un dossier, ignorer cette etape' car en dessous il y un a GETDIRECTORY


une idée de comment je peux faire ca?




Edit: j'ai retiré mon Dossier 3 du transfert, et ce depuis tout va bien, allez savoir pourquoi.


RESOLU
harghan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h44.


 
 
 
 
Partenaires

Hébergement Web