Vérifier l'existence d'un fichier ou non


Introduction

Le but est simple, utiliser l'appel système stat pour vérifier si un fichier existe sur le serveur.
Le programme doit demander à l'utilisateur d'entrer le chemin absolu d'un fichier, puis doit vérifier s'il existe et donner une réponse.


Ecrivez le programme checkfile.asm suivant

section .data
 prompt_msg db 'Entrez le chemin du fichier : ', 0
 prompt_len equ $ - prompt_msg
 file_exists_msg db 'Le fichier existe.', 10
 file_exists_len equ $ - file_exists_msg
 file_not_exists_msg db 'Le fichier n'existe pas.', 10
 file_not_exists_len equ $ - file_not_exists_msg
 buffer_size equ 4096 ; Taille du buffer pour lire le chemin du fichier

section .bss
 input_path resb buffer_size ; Buffer pour stocker le chemin du fichier
 statbuf resb 144 ; Espace réservé pour la structure stat

section .text
 global _start

_start:
 ; Affiche le message de prompt
 mov rax, 4 ; syscall number pour 'write'
 mov rdi, 1 ; stdout
 mov rsi, prompt_msg
 mov rdx, prompt_len ; Longueur du message de prompt
 syscall

 ; Lire le chemin du fichier de l'utilisateur
 mov rax, 3 ; syscall number pour 'read'
 mov rdi, 0 ; stdin
 lea rsi, [input_path]
 mov rdx, buffer_size ; Nombre maximal de caractères à lire
 syscall

 ; Calculer la longueur de l'entrée et supprimer le caractère de nouvelle ligne
 mov rdi, rax ; sauvegarder la longueur lue dans rdi
 dec rdi ; ajuster pour le caractère de retour chariot
 mov byte [rsi+rdi], 0 ; supprimer le caractère de nouvelle ligne

 ; Appel de 'stat' pour vérifier si le fichier existe
 mov rax, 188 ; syscall number pour 'stat'
 lea rdi, [input_path] ; Premier argument : pointeur vers le chemin du fichier
 lea rsi, [statbuf] ; Deuxième argument : pointeur vers la structure stat
 syscall

 ; Vérifier si stat a réussi
 cmp rax, 0
 jne file_not_found
 mov rax, 4 ; syscall number pour 'write'
 mov rdi, 1 ; stdout
 mov rsi, file_exists_msg
 mov rdx, file_exists_len ; Longueur du message fichier existe
 syscall
 jmp exit

file_not_found:
 mov rax, 4 ; syscall number pour 'write'
 mov rdi, 1 ; stdout
 mov rsi, file_not_exists_msg
 mov rdx, file_not_exists_len ; Longueur du message fichier non trouvé
 syscall

exit:
 mov rax, 1 ; syscall number pour 'exit'
 xor rdi, rdi ; Code de sortie 0
 syscall

Assembler

nasm -f elf64 checkfile.asm

Linker

ld checkfile.o -o checkfile

Lancer le programme

./checkfile


↑ Haut de page