8
votes

Testez si un répertoire existe ou non

J'essaie de vérifier qu'un répertoire existe en utilisant Fortan90. Sur différents sites, j'ai trouvé: xxx

Cependant, demande renvoie false si le répertoire existe ou si j'exécute ce code deux fois, Je reçois un message d'erreur

ne peut pas faire dir, le fichier existe déjà

Si j'utilise: xxx

avec un test de fichier existant, demande retourne vrai .

Comment puis-je vérifier l'existence d'un répertoire? J'utilise Ubuntu 11.04 et le compilateur IFORT.


3 commentaires

En tant que contexte, vous pouvez également utiliser mkdir -p .


Ê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' 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/... .


7 Réponses :


5
votes

Les éléments suivants doivent fonctionner:

INQUIRE (DIRECTORY=dir, EXIST=ex [, DIRSPEC=dirspec] [, ERR=label] [, IOSTAT=i-var] )


9 commentaires

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 /. .


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) fonctionne pour ifort 13.0.0 20120731, tandis que Inquire (File = Trim (DIR) // '/.', Existe = DIR_E) ne le fait pas. Si vous savez que vous êtes seulement en utilisant IFORT (comme je le suis), pourquoi pas 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?



7
votes

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.

Le plus sûr serait de tester un fichier dans ledit répertoire.


1 commentaires

Si vous évitez la fonctionnalité de IFORT était quelque chose à éviter, nous voudrions également éviter gfortran S fichier 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.



3
votes

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. XXX


1 commentaires

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



2
votes

Voici un sous-programme que j'utilise souvent - il utilise le conditionnel que vous avez posé sur: xxx

selon lequel le compilateur que vous utilisez, vous devrez décider lequel de ces conditionnels est juste pour tu.

Malheureusement, je n'ai pas accès à nagfor et ne sais pas comment il traite les répertoires.


1 commentaires

Merci, celui-ci fonctionne pour moi (code d'exemples de gfortran)



0
votes

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


2 commentaires

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.



1
votes

Une autre solution non portable consiste à laisser la coque (bash, dans ce cas) faire le travail: xxx


2 commentaires

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 ?


J'ai compris la question / exemple de l'OP pour être qu'il souhaitait créer un répertoire. Vous avez raison, mkdir -p est presque équivalent à ce test explicite. Une différence est que si docs existe sous forme de fichier ordinaire, cette méthode ne jette pas un message d'erreur. Qui peut être ou ne pas être avantageux.



2
votes

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)


0 commentaires