Il seguente programma fornisce diversi risultati quando eseguite da CodeBlocks e da cmd -:differente dell'uscita durante l'esecuzione da cmd e codeblocks
#include <iostream>
#include <string>
#define BOOST_FILESYSTEM_NO_DEPRECATED
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;
int main()
{
// A valid existing folder path on my system.
// This is actually the path containing the program's exe.
path source = "D:\\anmol\\coding\\c++\\boost\\boost1\\bin\\release";
cout << "output = " << equivalent(source, "D:") << " !!!\n";
return 0;
}
L'uscita dal CodeBlocks dopo l'esecuzione dall'interno della IDE -:
output = 0 !!!
l'uscita dal cmd eseguendo boost1
dopo aver cambiato la directory corrente alla cartella contenente il file eseguibile (il percorso source
menzionata nel codice) -:
output = 1 !!!
Secondo me, l'output fornito da CodeBlocks dovrebbe essere quello corretto.
Sto eseguendo questo programma su Windows 7 SP1 64-bit e CodeBlocks 13.12.
Sto usando TDM-GCC 4.9.2 (32-bit) e Boost 1.57 per creare questo programma.
L'output errato da cmd viene solo se eseguo il programma dopo aver modificato la directory corrente nella cartella contenente l'eseguibile.
Se tengo la directory corrente del cmd in un'altra cartella, viene visualizzato l'output corretto.
EDIT -:
Il problema originale che stavo cercando di risolvere è stato quello di verificare se un file/directory era un discendente di un'altra directory o meno.
Per realizzare questo, ho implementato il seguente codice -:
#include <iostream>
#include <string>
#define BOOST_FILESYSTEM_NO_DEPRECATED
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;
// Returns the difference in height in the filesystem tree, between the directory "parent" and the file/folder "descendant"
static int HeightDiff(const path parent, path descendant)
{
int diff = 0;
while (!equivalent(descendant, parent))
{
descendant = descendant.parent_path();
if (descendant.empty())
{
diff = -1; // "descendant" is not a descendant of "parent"
break;
}
diff++;
}
return diff;
}
// Returns true if the file/folder "descendant" is a descendant of the directory "parent"
static bool IsDescendant(const path parent, path descendant)
{
return HeightDiff(parent, descendant) >= 1;
}
int main(int argc, char** argv)
{
if (isDescendant(canonical(argv[1]), canonical(argv[2])))
{
cerr << "The destination path cannot be a descendant of the source path!! Please provide an alternate destination path !!" << endl;
}
}
Ora, se ho eseguito il codice con argv[1]="D:\anmol\coding\c++\boost\boost1\bin\release"
e argv[2]="D:\anmol\coding\c++\boost\boost1\bin"
, sarebbe tornare true
, quando avrebbe dovuto tornati false
invece. (Poiché, in questo caso, il parent
è in realtà il discendente di descendant
)
La ragione di questo è che durante il ciclo while HeightDiff()
, dopo alcune iterazioni, descendant
prenderebbe il valore D:
. Di conseguenza, equivalent()
restituirà true e interromperà il ciclo un passaggio prima che descendant
diventi una stringa vuota.
Non sapevo che D:
si riferisce alla directory corrente, e quindi ha posto questa domanda.
C'è un modo per modificare la funzione HeightDiff
in modo che fornisca l'uscita corretta?
La sostituzione della condizione equivalent()
con while(descendant != parent)
fornisce l'output corretto in tutti i casi?
In caso contrario, esiste un'altra soluzione?
sembra che CodeBlocks non imposti la directory corrente in cui si trova il binario. Prova ad usare la funzione win32 'GetCurrentDirectory', per controllare dove è impostata la directory corrente. – durkmurder
La directory corrente impostata da CodeBlocks è - 'D: \ anmol \ coding \ C++ \ boost \ boost1', probabilmente perché è la directory principale del progetto. Ad ogni modo, dal momento che sto entrando nel percorso completo all'interno del mio codice, perché dovrebbe importare quale sia la directory corrente? –
Quale problema stai cercando di risolvere con il tuo programma? La directory corrente è importante perché D: (senza una barra alla fine) si risolve nella directory corrente sull'unità D. Quindi equivalent() restituisce true se "source" contiene la directory corrente sull'unità D:. –