Voici ce que je l'habitude d'utiliser. Si je le faisais encore aujourd'hui, je le ferais probablement un peu différemment, mais ça marche assez bien pour que je n'ai pas vraiment eu de raison de le regarder pendant des années (en fait, je suis sûr que la dernière fois Je l'ai fait quoi que ce soit à ce ajoutais « cmd » à la liste des extensions quand je l'ai porté de DOS à Win32 ...
// Which.c:
#include <io.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *extensions[] = { "com", "exe", "bat", "cmd", NULL };
int is_exe(char *ext) {
int i;
for (i = 0; extensions[i]; i++)
if (0 == stricmp(ext, extensions[i]))
return 1;
return 0;
}
int main(int argc, char **argv) {
char path[FILENAME_MAX];
char buffer[FILENAME_MAX];
char *path_var;
char *ext;
char *dir;
int i;
if (argc != 2) {
fprintf(stderr, "Usage: which <filename>\n");
return 1;
}
/* First try to find file name as-is.
*/
if (0 == access(argv[1], 0)) {
printf("\n%s", argv[1]);
return 0;
}
/* Okay, it wasn't found. See if it had an extension, and if not, try
* adding the usual ones...
*/
ext = strrchr(argv[1], '.');
if (0 == ext++ || !is_exe(ext)) {
for (i = 0; extensions[i]; i++) {
sprintf(buffer, "%s.%s", argv[1], extensions[i]);
if (0 == access(buffer, 0)) {
printf("\n%s", buffer);
return 0;
}
}
if (NULL == (path_var=getenv("PATH")))
return 1;
dir = strtok(path_var, ";");
do {
for (i = 0; extensions[i]; i++) {
sprintf(buffer, "%s\\%s.%s", dir, argv[1], extensions[i]);
if (0 == access(buffer, 0)) {
printf("\n%s", buffer);
return 0;
}
}
} while (NULL != (dir = strtok(NULL, ";")));
}
else {
if (NULL == (path_var=getenv("PATH")))
return 1;
dir = strtok(path_var, ";");
do {
sprintf(buffer, "%s\\%s", dir, argv[1]);
if (0 == access(buffer, 0)) {
printf("\n%s", buffer);
return 0;
}
} while (NULL != (dir = strtok(NULL, ";")));
}
return 1;
}
Trop long pour itérer? Créez un script/petit programme qui le répète pour vous. Juste séparer par ";" Il n'y a pas besoin de creuser dans les sous-dossiers. – OscarRyz
Remarque: 'JAVA_HOME' doit pointer sur JDK. L'exécution de programmes Java ne nécessite pas de JDK, mais un JRE suffit également. La grande majorité des utilisateurs finaux ont juste un JRE. – BalusC
@OscarRyz: c'est faisable, je suis juste curieux de savoir s'il y a un moyen direct de dire l'emplacement de java en exécutant une simple commande de cmd :) –