2015-04-07 10 views
26

Voglio scrivere un test unitario per verificare che due percorsi file siano equivalenti, ma non voglio assumere che la rappresentazione della stringa sia la stessa.Qual è il modo migliore per determinare che due percorsi di file si riferiscano allo stesso oggetto file?

Ad esempio, su Linux potrebbero esserci dei collegamenti simbolici nel percorso in un caso e non nell'altro. Su Windows, potrebbero essere presenti notazione di unità su uno (X:\foo) e notazione di rete sull'altro (//serverX/foo). E il più complicato, il file potrebbe essere stato scritto su Linux su una condivisione NFS (nella sintassi /path/to/file) e verificato su Windows usando la sintassi DOS (X:\to\file) dove X: è un supporto NFS a /path.

Alcune idee (che si trova qui su Stack   Overflow, ma non unificato):

  1. Su Linux, confrontare l'inode da stat
  2. Usa realpath (è questa piattaforma indipendente?)
  3. Su Windows , confronta le stringhe su GetFullPathName
  4. Su Windows, confronta i numeri di serie e l'indice dei file da GetFileInformationByHandle

Quale sarebbe la migliore soluzione multipiattaforma? Sto scrivendo questo in C++, ma posso ovviamente passare a C ovviamente.

+0

non è sicuro se si rivolge il vostro problema, ma hai preso uno sguardo al boost :: filesystem? http://www.boost.org/doc/libs/1_57_0/libs/filesystem/doc/index.htm – vsoftco

+0

@JossefHarush che non ti direbbe se stai guardando due diverse copie dello stesso file. –

risposta

19

È possibile controllare la libreria Boost.Filesystem. In particolare, v'è un metodo equivalent che sembra fare esattamente quello che stai cercando:

using namespace boost::filesystem; 

path p("/path/to/file/one"); 
path q("/sym_link/to/one"); 
assert(equivalent(p, q)); 
+6

Grazie, questo è quello che stavo cercando. Per riferimento, l'implementazione boost utilizza i confronti degli inode su Linux e il numero di serie/confronti dell'indice dei file su Windows. –

Problemi correlati