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.