J'essaie de vérifier qu'un répertoire existe en utilisant Fortan90. Sur différents sites, j'ai trouvé: Cependant, ne peut pas faire dir, le fichier existe déjà p>
blockQuote> Si j'utilise: p> avec un test de fichier existant, Comment puis-je vérifier l'existence d'un répertoire? J'utilise Ubuntu 11.04 et le compilateur IFORT. P> P> demande code> renvoie
false code> si le répertoire existe ou si j'exécute ce code deux fois, Je reçois un message d'erreur P>
demande code> retourne
vrai code>. P>
7 Réponses :
Les éléments suivants doivent fonctionner:
INQUIRE (DIRECTORY=dir, EXIST=ex [, DIRSPEC=dirspec] [, ERR=label] [, IOSTAT=i-var] )
Je ne recommanderais pas en fonction des extensions non standard. Il y avait trop de cas, où cela signifiait des difficultés avec un portage à un autre compilateur, qui peut être nécessaire de manière inattendue.
Bien sûr, j'accepte Vladimir, mais le problème est que, apparemment, la route gfortran ne fonctionne pas. Un rapide coup d'œil sur la norme F95 montre qu'il n'y a pas de comportement pour les répertoires dans la déclaration de renseignements. Si j'ai manqué quelque chose (ou si c'était des ajouts à une norme ultérieure), faites-le-moi savoir.
Mais sur les répertoires Linux ne sont que des fichiers avec un signe de répertoire sur. Peut-être que Ifort n'aime pas le trailing /. Code>.
Vrai. Serait bien si quelqu'un pouvait tester cela avec Ifort.
Fonctionne avec IFORT 12.0.2.137 Build 20110112. Testé juste hors de curiosité. Ne recommanderait pas d'utiliser.
Mes modifications ne semblent pas apparaître pour une raison quelconque. Vous devez corriger le mot-clé mal orthographié exister.
Merci de le pointer. Iro-Bot qu'est-ce que vous avez testé exactement? Le répertoire ou le spécificateur de fichier?
@ Azrael3000 J'ai testé l'argument de mots-clés de répertoire non standard. Je n'ai pas testé l'exemple fourni par l'OP.
Je peux vérifier que renseigner (répertoire = dir, existe = dir_f) code> fonctionne pour ifort 13.0.0 20120731, tandis que
Inquire (File = Trim (DIR) // '/.', Existe = DIR_E) code> ne le fait pas. Si vous savez que vous êtes seulement i> en utilisant IFORT (comme je le suis), pourquoi pas i> l'utiliser? En l'absence d'une solution véritablement portable et universelle, pourquoi ne pas utiliser la solution qui fonctionne pour le compilateur que vous utilisez? Est-ce que quelqu'un sait ce qui fonctionne pour nagfor?
La norme FORTRAN 95, 2003 et 2008 ne spécifie pas, comment demandez-vous de traiter les annuaires. De mon expérience sous Linux, Gfortran les traite en tant que fichiers, IFORT ne le fait pas. La déclaration d'annuaire est une caractéristique exclusive de l'IFORT et doit donc être évitée. P>
Le plus sûr serait de tester un fichier dans ledit répertoire. p>
Si vous évitez la fonctionnalité code> code> de IFORT code> était quelque chose à éviter, nous voudrions également éviter
gfortran code> S
fichier code> fonctionnalité, comme les deux sont non portables. Bien sûr, ce serait mieux encore si une future standard de Fortran avait des utilitaires système portables pour les choses telles que celles-ci.
La plupart du temps, on vérifie si le répertoire existe pour écrire quelque chose. Ce que je fais est juste de créer le répertoire. Si cela existe déjà, il n'y a pas de problème.
Cela peut travailler quelque part, mais certainement pas partout, sinon la question n'aurait aucun point MKDIR TMP MKDIR: impossible de créer le répertoire 'TMP': le fichier existe code>
Voici un sous-programme que j'utilise souvent - il utilise le conditionnel que vous avez posé sur: selon lequel le compilateur que vous utilisez, vous devrez décider lequel de ces conditionnels est juste pour tu. P> Malheureusement, je n'ai pas accès à nagfor code> et ne sais pas comment il traite les répertoires. p> p>
Merci, celui-ci fonctionne pour moi (code d'exemples de gfortran)
J'ai eu le même problème. Si vous souhaitez une manière indépendante du compilateur, vous pouvez essayer d'ouvrir un petit fichier dans le répertoire. L'instruction Open permet au code de passer à une ligne particulière (spécifiée par ERR =) si l'instruction Open échoue:
! Tests whether the directory exists subroutine checkdir(dir) implicit none character(len=*), intent(in) :: dir integer :: unitno ! Test whether the directory exists open(newunit=unitno,file=trim(dir)//'deleteme.txt',status='replace',err=1234) close (unitno) return ! If doesn't exist, end gracefully 1234 write(*,*) 'Data directory, '//trim(dir)//' does not exist or could not write there!' STOP end subroutine
Comment indiquez-vous la différence entre le répertoire non existant et ne pas pouvoir supprimer / créer le fichier?
Ce code ne le fait pas, d'où le code d'erreur indique n'existe pas ou ne pouvait pas écrire là-bas. Je ne sais pas d'une façon de dire la différence.
Une autre solution non portable consiste à laisser la coque (bash, dans ce cas) faire le travail:
Cela crée un répertoire. Comment obtenez-vous de cela si un répertoire existe-t-il si vous n'avez pas besoin d'être créé? Comment va-t-il mieux que simplement mkdir -p code>?
J'ai compris la question / exemple de l'OP pour être qu'il souhaitait créer un répertoire. Vous avez raison, mkdir -p code> est presque équivalent à ce test explicite. Une différence est que si
docs code> existe sous forme de fichier ordinaire, cette méthode ne jette pas un message d'erreur. Qui peut être ou ne pas être avantageux.
Vous pouvez utiliser des routines C pour tester les fichiers:
C côté C (OK avec IFORT et GFORTRAN sur Win32 et Linux 32/64) P>
.. use file use iso_c_binding ... integer(c_int) :: mode,exist,time ... call file_info("./docs"//char(0),mode,exist,time)
En tant que contexte, vous pouvez également utiliser
mkdir -p code>.
Êtes-vous sûr d'utiliser la demande de renseignements avant la deuxième tentative si? Cela fonctionne bien pour mes deux compilateurs (Oracle Solaris Studio, Gfortran). Vous pouvez également essayer
fichier = '. / Docs' code> uniquement, cela fonctionne pour moi aussi.
Voici un poste de Dr. Fortran de retour en 2006 que l'arrière-plan qui peut être intéressant: logiciel.intel.com/en-us/forums/... .