2015-07-06 14 views
5

Per determinare il percorso canonico di un file specificato dal percorso relativo o un percorso contenente \..\ nel mezzo, StackOverflow suggerisce di utilizzare GetFullPathName() here o GetLongPathName() here.Qual è la differenza tra GetLongPathName e GetFullPathName in WinAPI?

Qual è la differenza tra queste funzioni?

L'intento è quello di ottenere i percorsi che iniziano con la lettera di unità da percorsi relativi (come ..\someDir\someFile.txt e someOtherDir\someFile.txt) e per eliminare più \..\ dai percorsi (come C:\dirA\dirB\..\someFile.txt ->C:\dirA\someFile.txt).

+6

Hai provato a leggere i riferimenti per es. ['GetFullPathName'] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa364963%28v=vs.85%29.aspx) e [' GetLongPathName'] (https: // msdn .microsoft.com/en-us/library/windows/desktop/aa364980% 28v = vs.85% 29.aspx)? –

+1

@JoachimPileborg, si. Hai? Non è facile cogliere la differenza in modo affidabile leggendo i riferimenti. Ho pensato che sarebbe stato più facile spiegare per qualcuno che ha esperienza con entrambi. Il problema era con ad es. PathCanonicalize non quasi canonicalizing il percorso, tuttavia il suo nome dice così. Solo in Debug l'ho capito, quindi ho letto nuovamente il riferimento e ho capito dove è documentato lo strano comportamento di PathCanonicalize. –

+1

Ho trascorso alcuni minuti a quei riferimenti e la mia fiducia è caduta solo sul fatto che potrei autorevolmente spiegare la differenza. Non vedo l'ora di imparare la risposta. –

risposta

7

GetFullPathName risolve i nomi di file e relativi percorsi in percorsi assoluti, anteponendo la directory di lavoro corrente del processo chiamante.

GetLongPathName risolve solo nomi brevi (8,3) in nomi lunghi.

Nota che quest'ultimo richiede l'accesso al disco, quindi un percorso relativo verrà probabilmente risolto utilizzando anche la directory di lavoro corrente.

tl; dr:
chiamata GetFullPathName per risolvere un percorso relativo ad uno assoluto.
Chiamare GetLongPathName per risolvere un percorso assoluto che può contenere un nome breve (8,3) in un nome lungo.


Attenzione:

directory di lavoro attuale è una risorsa per-processo, e può ottenere cambiato per esempio dalla finestra di dialogo standard di apertura file. Vorrei usare questo solo per risolvere gli argomenti della riga di comando che potrebbero essere relativi alla CWD in cui è stato avviato il programma.

Un nome di percorso lungo non può esistere per ogni file con nome 8.3.

+0

Sembra che tu abbia ragione e il testo qui http://pdh11.blogspot.com/2009/05/pathcanonicalize-versus-what-it-says-on.html conferma che "Il piano è, usa GetFullPathName() Trasforma i percorsi relativi in ​​assoluto, quindi chiama ripetutamente QueryDosDevice() per separare le lettere di unità secondarie, quindi chiama GetLongPathName() per eliminare il caso 8.3-ness e canonicalise ". Quindi GetLongPathName() canonicalizza un percorso relativo solo se inizia con '.' o' ..'. –

+2

I documenti dicono * GetFullPathName non converte il nome file specificato, lpFileName. Se il nome file specificato esiste, è possibile utilizzare GetLongPathName o GetShortPathName per convertire rispettivamente in nomi di percorsi lunghi o brevi. * Ciò sembra contraddire il secondo paragrafo di questa risposta. –

+0

d'oh! rimosso informazioni errate, grazie @DavidHeffernan – peterchen

Problemi correlati