Implementazione del comando pwd in C/C++

Implementazione del comando pwd in C/C++

Il comando pwd (Present Working Directory) è uno dei comandi di base della linea bash utilizzati per ottenere il percorso della directory su cui stiamo attualmente lavorando! Il comando pwd stesso si abbrevia in "present working directory". Useremo il file header dirent.h per le strutture di directory e gli oggetti e implementeremo il nostro comando pwd in C/C++. Ciò comporterà la chiamata alla funzione getcwd(). Passiamo quindi alla configurazione iniziale:

Configurazione iniziale

Crea una directory chiamata "command" e al suo interno crea una directory chiamata "include", inoltre nella directory include/ posiziona il file di intestazione "direct.h".
Crea anche un file "pwd.cpp" in cui risiederà il nostro codice di implementazione principale.

Implementazione

Quindi l'idea di base è usare il getcwd funzione integrata nel unistd.h
Per prima cosa includeremo i file di intestazione:

-stdio.h :Usato per definire FILENAME_MAX e cout/cin funzioni.
--dirent.h :Usato per gestire gli oggetti di directory e i puntatori.
--unistd.h :Usato per importare varie variabili predefinite come _POSIX_VERSION , _POSIX2_VERSION ,ecc.

Ora dobbiamo anche definire o rinominare alcune funzioni come _getcwd e getcwd a GetCurrentDir .

Quindi, dopo aver incluso i file di intestazione, apparirà come,

#include <stdio.h>  /* defines FILENAME_MAX */
// #define WINDOWS  /* uncomment this line to use it for windows.*/ 
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif
#include<iostream>

Ora, dopo aver incluso i file di intestazione, implementeremo la funzione per ottenere la directory di lavoro corrente,

std::string GetCurrentWorkingDir(void){
    //Logic here
}

Definiremo un array di caratteri con FILENAME_MAX taglia,

    char buff[FILENAME_MAX];

Ora chiameremo la funzione GetCurrentDir() per ottenere il percorso della directory di lavoro corrente,

    GetCurrentDir( buff, FILENAME_MAX );

Successivamente, assegneremo il percorso a un'altra stringa in modo da restituirlo dalla funzione,

  std::string current_working_dir(buff);

Infine, restituiremo la stringa ottenuta,

    return current_working_dir;

Quindi l'implementazione finale della funzione sarebbe simile a,

std::string GetCurrentWorkingDir( void ) {
  char buff[FILENAME_MAX];
  GetCurrentDir( buff, FILENAME_MAX );
  std::string current_working_dir(buff);
  return current_working_dir;
}

Poiché dobbiamo chiamare questa funzione, lo faremo da main() funzione del codice,

    int main(){
        std::cout << GetCurrentWorkingDir() << std::endl;
        return 1;
    }

Codice funzionante finale

#include <stdio.h>  /* defines FILENAME_MAX */
// #define WINDOWS  /* uncomment this line to use it for windows.*/ 
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif
#include<iostream>
 
std::string GetCurrentWorkingDir( void ) {
  char buff[FILENAME_MAX];
  GetCurrentDir( buff, FILENAME_MAX );
  std::string current_working_dir(buff);
  return current_working_dir;
}
 
int main(){
  std::cout << GetCurrentWorkingDir() << std::endl;
  return 1;
}

Passaggi di esecuzione

Per eseguire il comando lo compileremo prima usando make comando in Linux, quindi eseguilo utilizzando ./pwd ,

Poiché il comando sta dando l'output del percorso /home/sahil/Desktop/command che è la directory corrente su cui stiamo lavorando, la nostra implementazione ha avuto successo.