9
votes

Recevoir le répertoire de la maison dans Mac OS X en utilisant le langage C

Comment puis-je obtenir le chemin du répertoire de base dans Mac OS X à l'aide de C langue dans xcode éditeur "


1 commentaires

La réponse acceptée en cours est invalide mais il existe une autre question similaire qui est toujours ouverte Stackoverflow.com/Questtions/3726113/...


3 Réponses :


6
votes
#include <stdlib.h>
#include <stdio.h>    

int main(void)
{
    const char *homeDir = getenv("HOME");

    if (homeDir)
        printf("Home directory is %s\n", homeDir);
    else
        printf("Couldn't figure it out.\n");

    return 0;
}

5 commentaires

$ home = effacé; ./app = répertoire personnel est effacé


Comme le dit Jweyrich, ce n'est pas fiable. Il n'y a aucune garantie que la maison est définie sur le répertoire de base ou qu'elle est définie du tout. Les processus de serveur suppriment souvent leur environnement pour des raisons de sécurité. Vous devez utiliser getPwuid () qui renvoie la structure de mot de passe comprenant le répertoire de base de la base de données utilisateur. développeur.apple.com/mac/ Bibliothèque / Documentation / Darwin / Référencier CE / ...


POSIX garantit qu'il est défini, voir ici: Accueil Le système doit initialiser cette variable au moment de la connexion pour être un chemin d'accès du répertoire de base de l'utilisateur . Notez que sur cette page, il est également indiqué "si les variables des deux sections suivantes sont présentes dans l'environnement lors de l'exécution d'une application ou d'une utilité, elles doivent recevoir la signification décrite ci-dessous.".


@Jeremyp: rien ne garantit qu'un répertoire de base valide est défini dans le fichier passwd (sur mon système, MySQL dispose d'un répertoire de base de / inexistant ). On pourrait soutenir que quiconque changeait délibérément que leur home voudrait que des applications continuent de le traiter comme si c'était leur répertoire personnel.


@DeMlax Posix ne garantit pas que la maison $ est définie, uniquement qu'elle est définie dans le shell de connexion d'un utilisateur, puis si l'utilisateur n'a pas salué avec elle. La question est donc de savoir si vous avez besoin du répertoire de base réel de l'utilisateur ou souhaitez-vous le répertoire de base que l'utilisateur vous dit est leur répertoire de base (j'accepte des cas d'utilisation légitime pour ce dernier ainsi que le premier).



9
votes

avec fsfinfolder: xxx pré>

avec cscopyusername: p> xxx pré>

avec NshomeDirectory: p>

char path[1024];
CFStringGetCString( (CFStringRef)NSHomeDirectory() , path , sizeof(path) , kCFStringEncodingUTF8 );


7 commentaires

Notez que Nshomedirectory est trompeur. Il renvoie en fait le répertoire d'applications, pas l'utilisateur actuel HomeDir.


@jweyrich qui ne s'applique qu'à l'iPhone. Sur les macos normales, c'est l'équivalent des autres. Aucun de ces travaux sur iPhone.


@Dawnonward aye! Désolé, je pensais que cela fonctionnait de la même manière. Merci de me corriger.


Notez que cscopyusername () est pas une solution pour trouver le dossier à domicile d'un utilisateur. Il ne trouvera pas le mien, par exemple, qui est à / réseau / utilisateurs / leeg.


Les exemples doivent indiquer quels fichiers sont requis.


Aucun de ceux-ci n'est c, non? N'a-t-il pas besoin que le fichier soit un fichier .m objectif-c?


@Vorttico ressemble à c pour moi.



13
votes

Ceci devrait fonctionner sous Linux, UNIX et OS X, pour Windows, vous devez effectuer une légère modification.

#include <stdlib.h>
#include <stdio.h>    
#include <pwd.h>
#include <unistd.h>

int main(void)
{
    const char *homeDir = getenv("HOME");

    if (!homeDir) {
        struct passwd* pwd = getpwuid(getuid());
        if (pwd)
           homeDir = pwd->pw_dir;
    }
    printf("Home directory is %s\n", homeDir);
    return 0;
}


0 commentaires