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"?
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...
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:
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.