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

API, COM et SDKs Delphi Discussion :

RemoveDir : codes erreur


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut RemoveDir : codes erreur
    Bonjour a tous,

    J'effectue un RemoveDir sur un dossier préalablement vidé. Celui-ci me revoit le code erreur 5. Je voudrais donc savoir où trouver les correspondances pour ls codes erreurs...
    Précision, le dossier est supprimé lorsque je quitte mon application...

    Merci par avance,

    ZenZiTone.

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 663
    Points : 6 949
    Points
    6 949
    Par défaut
    Que donne la fonction SysErrorMessage avec ce code d'erreur ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (11.6 - 14.6)

  3. #3
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Il renvoit un Accès refusé... A vrais dire c'est ce que j'avais lorsque j'essayais de le supprimer via l'explorateur après avoir reçu l'erreur. Cela voudrais dire qu'il me fasse faire FindClose avant la suppression?! Dit comme ça, ça parrait normal remarque :X

    Je test ça, merci pour le SysErrorMessage, je conaissais pas

    [EDIT] Même lorsque le FindClose est fait préalablement, il y a un accès refusé...
    L'erreur vient du fait que le dossier est en cours de lecture non?

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Bonjour a tous,

    J'effectue un RemoveDir sur un dossier préalablement vidé.

    ZenZiTone.
    Est-il vidé par toi ou par un autre programme ?
    peux tu fournir ton code ?

  5. #5
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    C'est le programme qui le vide. Les fichiers ne sont pas réelement supprimés, mais déplacés dans un autre dossier.

    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
    procedure Thread_TraitementSimulation.Execute;
    var
        nomRepertoireEnCours:String;
    begin
      UpdateInfoTexte('Entrée dans le Thread');
      //SetCurrentDir('C:\');
     
      while wContinuer = true
        do begin
            if(FindFirst(wPath_DirSerieImpression+'\*_OK',faDirectory, searchResultDirSI)=0)
                then begin
                    UpdateInfoTexte('Dossier en ''*_OK'' trouvé ');
                    Synchronize(UpdateInfoDSI);
                    TraitementFichiers;
                    UpdateInfoTexte('Fichiers traités');
     
                    nomRepertoireEnCours := searchResultDirSI.Name;
                    FindClose(searchResultDirSI);
     
                    //Suppression du répertoire
                    SetCurrentDir(wPath_DirSerieImpression+'\');
                    if RemoveDir(nomRepertoireEnCours)
                        then UpdateInfoTexte('Dossier supprimé : '+nomRepertoireEnCours)
                        else ShowMessage('Dossier non supprimé : '+nomRepertoireEnCours+ ' error : '+sysErrorMessage(GetLastError));
     
                end else UpdateInfoTexte('Aucun dossier en attente');
            Sleep(2000);
     
        end;
     
    end;
    Voilà pour ma prtie Execute du thread. Ensuite, c'est dans traitementFichiers que le 'vidage' se fait:

    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
    procedure Thread_TraitementSimulation.TraitementFichiers;
    var
        wStop : Boolean;
    begin
        wStop := false;
        UpdateInfoTexte('Début traitement fichiers');
        while not wStop
            do begin
                if(FindFirst(wPath_DirSerieImpression+'\'+searchResultDirSI.Name+'\*.stca',faAnyFile,searchResult)=0)
                    then begin
                        UpdateInfoTexte('Fichier trouvé: '+searchResult.Name);
                        Synchronize(UpdateInfoDA);
                        //Déplacement du fichier dans Autofile
                        if(MoveFile(PChar(wPath_DirSerieImpression+'\'+searchResultDirSI.Name+'\'+searchResult.Name),
                                    PChar(wPath_DirAutofile+'\'+searchResult.Name)))
    		                then begin
                                UpdateInfoTexte('Fichier déplacé dans autofile. Execution de F4');
                                sleep(3000);
                                SetForegroundWindow(wHandleFenetre);
                                keybd_event(VK_F4,0,0,0);
                                Sleep(1000);
                                UpdateInfoTexte('F4 à été exécuté');
    			                while FindFirst(wPath_DirAutofile+'\*.stca',faAnyFile, searchResultDirA)=0
                                    do begin
                                        UpdateInfoTexte('Vérification si impression terminée');
                                        Sleep(1000);
                                        Synchronize(UpdateInfoDA);
                                        FindClose(searchResultDirA);
                                    end;
                                    FindClose(searchResultDirA);
                                UpdateInfoTexte('Impression terminée');
                            end else UpdateInfoTexte('Fichier non trouvé...');
                        FindClose(searchResultDirSI);
                    end
                    else wStop := true;
            end;
     
    end;

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Beaucoup de choses étranges

    Dans TraitementFichiers, tu lances un FindClose(searchResultDirSI). searchResultDirSI n'est plus alloué au moment du RemoveDir.
    Lorsque tu simules l'appui sur une touche pas keybd_event, tu dois aussi la relâcher (KEYEVENTF_KEYUP).
    while FindFirst(wPath_DirAutofile+'\*.stca',faAnyFile, searchResultDirA)=0. Il n'y a pas de suppression dans la boucle (je ne vois pas de "vidage"), tu vas toujours récupérer le même fichier. Pour une énumération correct, FindFirst suivi de FindNext.
    FindClose ne fait que libérer la mémoire allouée pour TSearchRec par FindFirst.

  7. #7
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Dans TraitementFichiers, tu lances un FindClose(searchResultDirSI). searchResultDirSI n'est plus alloué au moment du RemoveDir.
    J'ai procédé ainsi pour vérifier si searchResultDirSI ne bloquait pas l'accès au dossier au moment ou voulais le supprimer (je passe juste par une variable pour le nom du dossier à supprimer du coup).

    Lorsque tu simules l'appui sur une touche pas keybd_event, tu dois aussi la relâcher (KEYEVENTF_KEYUP).
    Ce qui veux dire que dans le code que je propose, ça simule un appuie continue sur F4?

    while FindFirst(wPath_DirAutofile+'\*.stca',faAnyFile, searchResultDirA)=0. Il n'y a pas de suppression dans la boucle (je ne vois pas de "vidage"), tu vas toujours récupérer le même fichier.
    Ca, c'est normal ! J'ai oublié de le préciser: une application externe vient faire la suppression..

    Pour expliquer le fonctionnement : mon programme a pour but de gérer l'automatisation d'impressions. Les impressions sont réalisées dans un logiciel tiers chargeant des fichiers imprimables dans un répertoire 'Autofile'. De mon coté, pour être sur que les impressions sont réalisées dans le bon ordre, j'y transfert les fichiers un par un. Lorsque le logiciel a traité un fichier dans 'Autofile', il le supprime. D'où l'absence de suppression dans la boucle While..

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Ce qui veux dire que dans le code que je propose, ça simule un appuie continue sur F4?
    La touche reste pressée mais il n'y a pas de répétition. Le deuxième keybd_event et suivants sont par contre considérés comme des répétitions puisqu'il n'y a pas eu de relâchement entre temps (WM_KEYDOWN sans WM_KEYUP)

    Citation Envoyé par ZenZiTone Voir le message
    pour être sur que les impressions sont réalisées dans le bon ordre, j'y transfert les fichiers un par un.
    Hasardeux par FindFirst, mais ça dépend comment et rempli/vidé le répertoire.

    ps: tu peux surveiller les modifications apportées sur un répertoire par SHChangeNotifyRegister histoire d'éviter ces boucles avec sleep

  9. #9
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    je n'aime pas beaucoup tes appels à FindFirst dans une boucle.
    Perso, lorsque j'ai des opérations à faire sur un certain nombre de fichiers, j'utilise un TStringList.

    1) un seul appel de FindFirst suivi de FindNext pour stocker tous les fichiers dans un StringList.
    2) puis, à partir de la liste, je déplace un par un les fichiers et je lance la commande d'impression.

    Je crois que cela rendrait ton code beaucoup plus léger.

    Thierry

Discussions similaires

  1. [Mail] récupérer les code erreurs de mail()
    Par Djakisback dans le forum Langage
    Réponses: 2
    Dernier message: 22/03/2006, 18h19
  2. [TSQLStoredProc] Comment connaitre le code erreur renvoye ?
    Par kase74 dans le forum Bases de données
    Réponses: 4
    Dernier message: 24/08/2005, 12h08
  3. Code erreur 131
    Par taket dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 29/06/2005, 16h43
  4. Codes erreur spécifiques
    Par jibe74 dans le forum Débuter
    Réponses: 3
    Dernier message: 10/12/2004, 12h19
  5. [Kylix] code erreur :-10 :(
    Par maamar dans le forum EDI
    Réponses: 2
    Dernier message: 21/09/2003, 02h15

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