IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Erreur copie fichier log vers serveur distant


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 143
    Points : 38
    Points
    38
    Par défaut Erreur copie fichier log vers serveur distant
    Bonjour,

    Je travaille actuellement sur une application (CompactFramework v3.5) installée sur un PDA Motorola afin de gérer un stock d'usine.
    Le PDA est connecté en Wifi au réseau de l'usine.

    Comme nous n'avons pas de licence Avalanche (outil permettant d'administrer les PDA Motorola entre autres, et de consulter leur contenu à distance), j'essaye d'implémenter une fonction qui permet de copier les traces (générées sur le PDA) vers un serveur distant (Windows Server 2012). Ce fichier de traces est copié fréquemment afin de pouvoir de consulter le dernier en date (pour assistance ou dépannage).
    Un fichier de traces est généré par jour, et je ne garde qu'une profondeur de 2 jours sur le PDA (le reste étant stocké sur le serveur).

    En temps normal, cela fonctionne très bien, mais le problème se pose après avoir perdu le signal Wifi.
    En effet, lorsque le signal Wifi est retrouvé, les copies de fichier ne se font plus (erreur IOException sur "CopyTo" alors que "Directory.Exists" trouve bien le dossier distant).
    J'ai l'impression qu'une connexion est restée active vers le serveur distant, mais je ne sais pas quoi faire pour la "tuer".
    J'ai essayé de modifier les droits d'accès sur le partage distant, et de modifier ma méthode en fonction des discussions vues sur Internet, mais rien n'y fait.

    Pourriez-vous m'aider ?

    Merci d'avance.

    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
     
    /// <summary>
    /// Permet de copier les logs du PDA sur le serveur.
    /// </summary>
    public void CopieLogServeur()
    {
        FileStream flux = null;
     
        try
        {
            // Récupération des chemins des répertoires local et distant.
            string repLogsLocal = MobileConfiguration.Settings["RepLogsLocal"];
            string repLogsServeur = MobileConfiguration.Settings["RepLogsServeur"];
            DirectoryInfo local = new DirectoryInfo(repLogsLocal);
            DirectoryInfo serveur = new DirectoryInfo(repLogsServeur);
     
            // Si les répertoires local et distant existent.
            // if (Directory.Exists(repLogsLocal) == true && Directory.Exists(repLogsServeur) == true)
            if (local.Exists == true && serveur.Exists == true)
            {
                // Liste les fichiers du dossier local.
                FileInfo[] listeFichiers = local.GetFiles().OrderByDescending(f => f.LastWriteTime).ToArray();
     
                // Pour chaque fichier listé, le copier sur le serveur distant.
                foreach (FileInfo fichier in listeFichiers)
                {
                    string fichierSource = Path.Combine(repLogsLocal, fichier.Name);
                    string fichierDestination = Path.Combine(repLogsServeur, fichier.Name);
                    FileInfo infoSource = new FileInfo(fichierSource);
                    FileInfo infoDestination = new FileInfo(fichierDestination);
     
                    // Si le fichier n'existe pas sur le serveur,
                    // Ou la date de modification entre le fichier en local et celui du serveur > 5 secondes,
                    // Alors le fichier est copié sur le serveur.
                    if (infoDestination.Exists == false || (infoDestination.Exists == true && ((infoSource.LastWriteTime - infoDestination.LastWriteTime).TotalSeconds > 5)))
                    {
                        using (flux = infoSource.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                        {
                            infoSource.CopyTo(fichierDestination, true);
                            infoDestination.Attributes = FileAttributes.Normal;
                            flux.Close();
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            MasterForm.Log.ErrorFormat("Erreur copie de log {0} : {1}", ex.GetType().ToString(), ex.Message);
        }
        finally
        {
            if (flux != null)
            {
                flux.Close();
            }
        }
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Bonjour,

    Etant expert en .NEt et compact framework, je te conseille plutôt d'opter pour une solution "plus" simple...

    Pour moi, tu peux choisir :

    - Envoi en utilisant du FTP (c'est assez facile à faire en compact framework)
    - Envoi via un Web Service que tu feras coté serveur
    - Utilisation de MQTT pour l'envoi des données.


    Avec ces technologies, tu n'auras pas la problématique que tu rencontres.

    Peut-être que le "bug" correspond à un fichier encore ouvert et donc, tu ne peux plus faire la copie, ou quelque chose comme ça (genre coté serveur, fichier utilisé, ou autre).
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 143
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Merci tout d'abord pour votre réponse.

    Auriez vous un exemple de code afin de mettre en place votre première solution (transfert par FTP)?

    Merci d'avance

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    bonjour

    un exemple de code... hum, google : "C# compact framework ftp" devrait te donner plein de résultats satisfaisant...

    https://ftp.codeplex.com/SourceContr...PTest/Form1.cs


    Genre OpenNetCF FTP sur codeplex
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 143
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Merci theMonz31 pour ta réponse.

    J'ai mis en place la solution que tu m'as indiqué.

    Cela fonctionne bien, mais j'aurais 2 questions :
    - le fichier texte qui est copié sur le serveur FTP ne comporte plus aucun saut de ligne une fois transféré. Il devient donc difficilement lisible. Y a-t-il une option à ajuster (j'ai mis un type de transfert ASCII, mais rien n'y change) ?
    - l'envoi du fichier vers le serveur FTP prend environ 2 secondes ce qui fait ralentir mon application à ce moment là. Comment je peux exécuter le transfert en arrière plan sans affecter l'utilisation de l'application ?

    Merci d'avance

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    bah normalement, ton fichier est écrit en UFT8 et tu as fait des sauts de lignes.

    Si il n'y a pas de sauts de ligne dans l'original, il n'y en aura pas dans la copie FTP

    Et pour le temps que celà prend ==> Tu fais ton transfert ftp dans un Thread et basta !!!
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 143
    Points : 38
    Points
    38
    Par défaut
    J'ai pu mettre en place le Thread, et ça fonctionne comme je le désirais.
    J'ai du adapter mon code pour gérer les pertes de Wifi.

    Par contre, j'ai toujours un problème avec le fichier transféré :
    - à la source (sur le PDA), le fichier est composé d'une ligne par trace avec un saut de ligne à chaque fois (il est bien en UTF-8).
    - le fichier transféré sur le serveur FTP ne comporte plus aucun saut de ligne. Tout est à la suite ; ce qui est illisible.

    Auriez-vous une solution ?

    Merci d'avance

  8. #8
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Salut

    Est-ce que par hasard ton serveur FTP serait sous Linux ?

    J'ai trouvé cette remarque sur quelqu'un qui avait ce genre de blague :

    The most likely reason is that the transfer mode is set to binary and the FTP server is a Unix or Linux system which only use LF as the line separator. Try setting the UseBinary property to false before transferring the file.
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 143
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Effectivement le serveur FTP est sous Linux.
    Par contre, impossible de trouver une méthode comparable à la solution proposée (UseBinary = false).

    Je vais faire des tests avec un serveur FTP sous Windows.
    Sinon lorsque j'ouvre mon fichier avec un autre éditeur texte que Notepad (WordPad, UltraEdit, Word, ...), j'ai bien les sauts de ligne.

  10. #10
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    tu as le paramètre MODE et le paramètre FTPTransfertType qui s'occupe de celà.

    Je n'ai jamais eu besoin de jouer avec ces deux paramètres, mais bon, peut-être faut-il, peux tu creuser de ce coté là sinon...
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  11. #11
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Citation Envoyé par wanou44 Voir le message
    Sinon lorsque j'ouvre mon fichier avec un autre éditeur texte que Notepad (WordPad, UltraEdit, Word, ...), j'ai bien les sauts de ligne.
    Salut,

    Je pense qu'il y a bien les sauts de ligne, mais sous Notepad, il faut activer l'option pour les montrer... Format > Retour automatique à la ligne.
    J’ai des questions à toutes vos réponses!

Discussions similaires

  1. Réponses: 20
    Dernier message: 09/06/2011, 10h11
  2. Copie d'un fichier sur un serveur distant
    Par ghir_ana dans le forum Langage
    Réponses: 1
    Dernier message: 25/04/2011, 11h48
  3. Erreur exécution fichier php sur serveur distant
    Par bipbipman2003 dans le forum Langage
    Réponses: 15
    Dernier message: 10/03/2011, 17h04
  4. Transfert de fichier Client vers Serveur via INDY erreur ?
    Par bzh56 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 20/03/2006, 10h34
  5. [Mysql] transfert données ajoutées vers serveur distant
    Par hanane28 dans le forum Administration
    Réponses: 3
    Dernier message: 20/11/2005, 19h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo