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

x86 16-bits Assembleur Discussion :

Recherche d'un fichier sur le pc avec la fonction 4Eh de l'interruption 21h


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 46
    Points : 53
    Points
    53
    Par défaut Recherche d'un fichier sur le pc avec la fonction 4Eh de l'interruption 21h
    salut, je suis nouvelle sur ce forum et débutante en programmation assembleur 8086 et j'ai un problème:
    Pour chercher un fichier avec la fonction 4eH avec l'interruption 21H je sais qu'on doit passer dans DS : DX l'adresse de la chaîne de caractères qui contient le masque de recherche (par exemple le masque “*.txt”). Par défaut, les fichiers sont cherchés dans le dossier courant. Mais moi, je veux que la recherche s'effectue non seulement dans le dossier courant mais dans tous les dossiers du disque dur, ou au moins dans un dossier que je spécifie et non celui courant, je sais que pour faire cela je dois spécifier un autre chemin dans le masque... Mais je ne sais pas comment

    Veillez m'éclairer s'il vous plait
    Merci

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Pour chercher un fichier dans un répertoire donné, il faut soit utiliser le chemin complet comme nom de fichier, soit commencer par changer de répertoire à l'aide de la fonction 3Bh.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 46
    Points : 53
    Points
    53
    Par défaut
    bonjour Alcatîz,
    j'ai essayé d'utiliser le chemin complet comme nom de fichier en mettant "C:\ab*.txt",0 à la place de '*.txt',0 (par exemple) pour chercher tous les fichiers txt dans le dossier "ab" mais sans résultat :s

    avez vous une idée??

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Il faut insérer un backslash \ avant le nom du fichier :
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 46
    Points : 53
    Points
    53
    Par défaut
    en fait c'est ce que j'ai fait "C:\ab\*.txt",0 j'ai juste oublié de mettre le \ dans le message mais ça ne marche pas

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Ça fait longtemps que je n'ai plus programmé en D.O.S., mais je pense que ceci ne peut pas marcher. La fonction en question explore toutes les entrées du répertoire courant. C'est à toi de changer de répertoire si tu veux descendre plus profondément, tu dois d'abord changer toi-même de répertoire avec la fonction 3Bh de l'interruption 21h. Tu peux aussi utiliser la fonction 47h pour connaître le répertoire courant pour y revenir à la fin.

    Si tu veux faire une recherche en profondeur, c'est-à-dire explorer un répertoire et tous ses sous-répertoires, le plus simple est d'appeler sa fonction récursivement, c'est-à-dire faire un CALL sur le point d'entrée de ton programme à chaque fois que tu rencontres un sous-répertoire et agir comme si c'était l'utilisateur qui avait appelé le programme avec son nom.

    Ensuite, rechercher un fichier sur le disque entier, ça consiste simplement à faire une recherche en profondeur à partir de la racine du disque : C:\.

    Le seul ennui, c'est que les fonctions 4Eh et 4Fh ne sont pas ré-entrantes. Cela va donc t'obliger à enregistrer toi-même en mémoire tous les noms renvoyés par ces fonctions, puis les revoir un par un et rappeler le programme lorsque ces noms désignent un répertoire. Il faudra donc les mettre dans une pile. À ce détail près, en procédant de cette manière, tout le travail se fait tout seul.

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 46
    Points : 53
    Points
    53
    Par défaut
    Merci pour votre réponse, mais est-ce que le dernier paragraphe veut dire que je dois mettre dans la pile (avec des push) les nom de tous le repertoires? (pour chaque nom je met un push?), si oui, est ce que c'est necessaire? par ce que ce que je veux faire avec les fichiers trouvés, c'est les supprimer non pas les afficher

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Citation Envoyé par dark_meteor Voir le message
    Merci pour votre réponse, mais est-ce que le dernier paragraphe veut dire que je dois mettre dans la pile (avec des push) les nom de tous le repertoires? (pour chaque nom je met un push?)
    Oui, mais ce n'est pas simple à faire si tu ne l'as jamais fait. Si tu sais allouer de la mémoire en assembleur, alloue plutôt un segment dans lequel tu recopieras tous les noms de répertoires que la fonction te renverra.

    si oui, est ce que c'est necessaire? par ce que ce que je veux faire avec les fichiers trouvés, c'est les supprimer non pas les afficher
    Non, cela n'est nécessaire que si tu veux explorer automatiquement tous les sous-répertoires d'un emplacement donné. Si tu ne t'en tiens qu'à un seul niveau, tu n'as pas besoin de faire une opération récursive.

    À noter quand même qu'il s'agit bien d'une méthode pour explorer tous les répertoires. Ce que tu y fais quand tu t'y trouves (effacement de fichiers ou autres …) est complètement indépendant de la manière dont tu les parcours.

  9. #9
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Il faut faire un programme récursif

    a+ François

  10. #10
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    mais je pense que ceci ne peut pas marcher. La fonction en question explore toutes les entrées du répertoire courant. C'est à toi de changer de répertoire si tu veux descendre plus profondément, tu dois d'abord changer toi-même de répertoire avec la fonction 3Bh de l'interruption 21h. Tu peux aussi utiliser la fonction 47h pour connaître le répertoire courant pour y revenir à la fin.
    Sans vouloir te froisser, il est possible de passer un nom de chemin complet à la fonction 4Eh.
    Le problème vient peut-être de l'attribut passé comme paramètre de recherche.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  11. #11
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    La fonction 4Eh de l'interruption 21h permet de trouver un fichier dans un répertoire donné.
    Le nom du fichier peut contenir un chemin complet ( le nom d'un disque + le nom d'un répertoire ) ainsi que des jockers dans le nom du fichier.
    Par exemple, le nom de fichier "C:\ab\*.txt",0 est tout à fait correct et la recherche se fera exclusivement dans le répertoire C:\ab ( s'il existe ).
    La paire DS-DX doit pointer sur ce nom de fichier et le registre CX doit contenir les attributs souhaités.
    Typiquement, pour un fichier on prend CX = 27h afin d'obtenir tous les fichiers, y compris les fichiers cachés et les fichiers système.
    Pour un sous-répertoire, on prend CX = 37h.

    Si le programme ne marche pas, cela peut résulter de plusieurs choses :
    1) DS-DX ne pointe pas sur la bonne chaine.
    2) CX ne contient pas la bonne valeur.
    3) le répertoire n'existe pas.
    4) il n'y a pas de fichier répondant aux critères.
    5) le programme gère incorrectement le résultat de la fonction.
    ( en particulier il ne gère pas correctement la DTA )
    Comme le programme en question n'a pas été communiqué, il est impossible d'être plus précis.

    Pour chercher un fichier dans tout un répertoire, y compris donc dans les sous-répertoires, il faut faire une recherche récursive en deux étapes :
    recherche du fichier dans un répertoire donné + recherche de tous les sous-répertoires du répertoire en question.
    Un débutant en informatique peut avoir des difficultés pour comprendre la notion de récursivité.
    Même lorsque cette notion est acquise, un débutant en assembleur peut avoir des difficultés pour l'implémenter correctement.
    Surtout qu'ici, il faut sauvegarder la DTA sur la pile avant de lancer une recherche dans le sous-répertoire, puis restaurer la DTA au retour.

    Je suggère donc de commencer par résoudre le problème de la recherche d'un fichier dans un répertoire donné.
    ( avec affichage du nom du fichier trouvé, plutôt que son effacement ; ce n'est que lorsqu'on est sûr que le programme fait bien ce qu'il est censé faire qu'on lui demande une opération potentiellement dangereuse ...)
    Cette première étape permettra de comprendre la structure de la DTA.

    Ce n'est que lorsque toutes les notions intervenant à ce niveau seront maitrisées qu'il sera possible d'envisager une recherche récursive.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recherche d'un fichier sur le disque dur
    Par skillipo dans le forum Développement Web en Java
    Réponses: 5
    Dernier message: 14/01/2008, 20h03
  2. [CSV] Télécharger un fichier sur le serveur avec une URL
    Par bolandfranck dans le forum Langage
    Réponses: 2
    Dernier message: 23/06/2007, 13h33
  3. Ouvrir un fichier sur un réseau avec fopen
    Par dadou38 dans le forum Langage
    Réponses: 4
    Dernier message: 28/10/2006, 12h19
  4. [XML] Créer un fichier sur le serveur avec le contenu d'une requête POST
    Par kingmandrax dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 27/10/2006, 00h18
  5. Réponses: 15
    Dernier message: 01/09/2005, 10h07

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