PDA

View Full Version : [C++] Determinare Path Assoluto


suspence
01-10-2008, 15:01
Ciao a tutti, ho un "piccolissimo" problema con C++:muro: :mc:

Come faccio a determinare il path assoluto di un file di cui conosco solo il nome??

Grazieeeee

IceCoder
01-10-2008, 15:06
Ciao a tutti, ho un "piccolissimo" problema con C++:muro: :mc:

Come faccio a determinare il path assoluto di un file di cui conosco solo il nome??

Grazieeeee

solo il nome in che senso?

tu hai "c:\file.dat" oppure "file.dat"?

71104
01-10-2008, 15:38
semplicemente mettigli in testa il percorso completo della directory corrente, più lo slash se necessario:

#include <cstdlib>
#include <cstdio>
#include <cerrno>

#include <iostream>
#include <string>
using namespace std;

#include <direct.h>


class CBuffer
{
private:
char *pszData;
size_t cbSize;

public:
CBuffer()
{
cbSize = 0x100;
pszData = new char[cbSize];
}

~CBuffer()
{
delete[] pszData;
}

operator char* ()
{
return pszData;
}

operator const char* () const
{
return pszData;
}

size_t GetSize() const
{
return cbSize;
}

void Reallocate()
{
delete pszData;
cbSize *= 2;
pszData = new char[cbSize];
}

};


int main()
{
string strFileName = "lal.txt";

CBuffer bufPath;
while (!getcwd(bufPath, bufPath.GetSize()))
{
if (errno != ERANGE)
{
cout << "error " << errno << endl;
return 1;
}
bufPath.Reallocate();
}

string strCurrentDirectory = (const char*)bufPath;
char chLast = strCurrentDirectory[strCurrentDirectory.length() - 1];
if ((chLast != '\\') && (chLast != '/'))
{
strCurrentDirectory += '\\';
}

cout << "full path: " << strCurrentDirectory << strFileName << endl;
return 0;
}

IceCoder
01-10-2008, 15:45
oops ho letto male :D

DanieleC88
02-10-2008, 08:43
if ((chLast != '\\') && (chLast != '/'))
{
strCurrentDirectory += '\\';
}
Poco portabile così... io direi:
#ifdef __WIN32
# define TERMINATOR '\\'
#else
# define TERMINATOR '/'
#endif

/* ... */

if (chLast != TERMINATOR)
{
strCurrentDirectory += TERMINATOR;
}

/* ... */
:Prrr:

ciao ;)

P.S.: figo il nome "TERMINATOR", mi pare di vederci Arnold Schwarzenegger (Arnoldo Neronero). :D

suspence
02-10-2008, 09:41
Ancora un aiuto...

Come posso fare per elencare tutte le cartelle e le sottocartelle di una data directory?

Ad esempio ottenere, data la cartella c:\, :

C:\cartella1
C:\cartella2
C:\cartella1\cartella11
C:\cartella1\cartella12\cartella121
C:\cartella2\cartella21
.
.
.
e così via...

71104
02-10-2008, 12:19
Ancora un aiuto...

Come posso fare per elencare tutte le cartelle e le sottocartelle di una data directory?

Ad esempio ottenere, data la cartella c:\, :

C:\cartella1
C:\cartella2
C:\cartella1\cartella11
C:\cartella1\cartella12\cartella121
C:\cartella2\cartella21
.
.
.
e così via... questo è un problema: la maniera di farlo è platform-dependent, quindi devi dirci se lavori su Windows o su Linux. su Linux devi usare le dirent, su Windows FindFirstFile/FindNextFile/FindClose. qua c'è un esempio per Windows: http://msdn.microsoft.com/en-us/library/aa365200(VS.85).aspx

@Daniele: lo slash in avanti funziona anche su Windows; il contratto della getcwd di Microsoft non specifica che ti restituirà sempre e solo backslashes :Prrr:

71104
02-10-2008, 12:22
faccio notare che l'esempio che ho riportato nel link di MSDN è molto vecchio e non è scritto molto bene: se il codice del main venisse usato in una funzione diversa dal main si avrebbero dei leak.

inoltre l'esempio non è proprio quello che serve a te: dovresti anche trovare un modo per distinguere tra files e cartelle.
edit - puoi usare questa funzione qua:
http://msdn.microsoft.com/en-us/library/aa364952(VS.85).aspx

forse c'è un modo più facile.

DanieleC88
02-10-2008, 13:14
Dipende da sistema operativo, sui sistemi Unix io direi opendir() (http://linux.die.net/man/3/opendir)+readdir() (http://linux.die.net/man/3/readdir) o ftw() (http://linux.die.net/man/3/ftw):
#include <unistd.h>
#include <ftw.h>

int scan(const char *, const struct stat *, int);

int main()
{
if (ftw(".", scan, 42) != 0)
{
fprintf(" *** Errore!\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

int scan(const char *path, const struct stat *si, int flags)
{
if (flags & FTW_D)
{
printf("%s\n", path);
}
return 0;
}

Per Windows credo ti ci voglia FindFirstFile() (http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx)+FindNextFile() (http://msdn.microsoft.com/en-us/library/aa364428(VS.85).aspx).

ciao ;)

DanieleC88
02-10-2008, 13:28
D'oh, non m'ero accorto che avessi già risposto! :doh:

@Daniele: lo slash in avanti funziona anche su Windows; il contratto della getcwd di Microsoft non specifica che ti restituirà sempre e solo backslashes :Prrr:
Vabbe', però dovevo metterci un TERMINATOR! :D