0
votes

Comment créer un répertoire avec un nom inconnu en utilisant le langage C

En C, un répertoire est créé comme ceci:

mkdir("hello");

mais que faire si nous ne connaissons pas le nom de ce répertoire (ou s'il est indiqué par l'utilisateur)? Comment pouvons-nous le définir sur un ordinateur? (% s ne fonctionne pas)


6 commentaires

Lorsque vous dites "% s ne fonctionne pas", que voulez-vous dire exactement? Essayez-vous de transmettre une chaîne de formatage avec celle-ci directement à la fonction mkdir ?


Notez que POSIX mkdir () prend deux arguments - le nom du répertoire et un ensemble d'autorisations à lui attribuer, tel que modifié par le paramètre umask .


Votre mention de % s suggère que vous devriez peut-être utiliser snprintf () pour formater une chaîne contenant le nom du répertoire que vous souhaitez créer, puis vous le transmettez chaîne et le mode répertoire (par exemple 0755 ) à l'appel système mkdir () . Voir aussi Comment puis-je créer une arborescence de répertoires en C ++ - qui a une réponse qui est du code C qui peut également être compilé par C ++.


@JonathanLeffler la version Visual C de mkdir et le plus récent _mkdir ne prend qu'un seul argument, bien que MS prétende qu'il a quelque chose à voir avec Posix.


@WeatherVane - intéressant. Heureusement, j'ai soigneusement identifié "POSIX mkdir () ", qui nécessite deux paramètres. Étant donné que MS a une version qui ne nécessite pas ces deux paramètres, je dois classer ces informations pour référence future, et peut-être que le code serait OK si la plate-forme était Windows ou suffisamment étroitement liée. Et la relation avec POSIX est extrêmement ténue car MS nécessite l'en-tête qui ne fait pas partie de POSIX - l'en-tête POSIX pour la gestion des répertoires via opendir () et al est , et dans tous les cas mkdir () est déclaré dans .


Plutôt qu'un mot inconnu, utilisez un mot aléatoire


3 Réponses :


0
votes

mkdir reçoit en paramètre le nom du répertoire que vous souhaitez créer. Voici la doc . Ainsi, vous pouvez définir une variable pour contenir votre dossier d'entrée et la passer à la fonction

char path[30] = "path.to.dir";
mkdir(path, 0700);


7 commentaires

Il semble que cela ne couvre pas tout ce dont OP a besoin à propos de "% s ne fonctionne pas".


Notez que votre code ne sera pas (ne devrait pas) compiler - mkdir () prend deux arguments.


Ce que j'ai compris, c'est qu'il essayait d'utiliser mkdir comme nous utilisons printf et scanf, en remplaçant la valeur de% d par la valeur de la variable. Et j'ai aussi compris que sa question était liée à l'utilisation de variables dans un appel mkdir


J'ai fait ce code dans Windows VS. Il utilisait en effet une version obsolète de mkdir, vous avez donc raison. Je vais ajuster l'exemple


Notez le commentaire de Girouette - MS a une fonction mkdir () à un seul argument tandis que POSIX a le version à deux arguments. La plateforme n'était pas clairement identifiée - dans des circonstances différentes, nous pourrions avoir tous les deux raison.


@ MárioRoccoPettinati Je pense que la dépréciation est uniquement due à la convention de dénomination des fonctions de bibliothèque non standard, donc mkdir () est devenu _mkdir () .


Oui. Dans VS, le nom suggéré est maintenant _mkdir et il prend 1 paramètre. Dans POSIX, il en faut deux. Mais je suis d'accord avec vous tous sur le fait que nous avons besoin de plus de précisions dans la question



0
votes

Créez simplement une variable de chaîne, stockez la chaîne dans cette variable (qu'elle provienne d'une entrée utilisateur ou qu'elle soit codée en dur), puis passez la variable à mkdir .

int main() {
  char str[10];

  scanf("%9s", str);
  mkdir(str, 0700);

  return 0;
}

p >


3 commentaires

Cela entraînera presque certainement un dépassement de capacité de la mémoire tampon.


Ce n'est pas tant la taille, mais que la longueur d 'entrée est illimitée.


Notez le commentaire de Girouette - MS a une fonction mkdir () à un seul argument tandis que POSIX a le version à deux arguments. La plateforme n'était pas clairement identifiée - dans des circonstances différentes, nous pourrions avoir tous les deux raison.



0
votes

Je vous recommande d'utiliser snprintf afin de pouvoir prendre n'importe quel type d'entrée.

#include <stdio.h>

int main() {
    char name[50];
    int i = 5;
    snprintf(name, 50, "dir.%i", 5);
    mkdir(name, 0700);
}


1 commentaires

@daryalife Si cette réponse résout votre problème, veuillez l'accepter.