Domanda

Sto guardando a gestire percorsi di file più lunghi nella mia applicazione Windows.

Attualmente, ho una casella di testo (box di modifica) in cui un utente può digitare un percorso del file assoluto.Ho quindi letto il percorso del file digitato, utilizzando GetWindowText, in una stringa dichiarata come: TCHAR FilePath[MAX_PATH];

Ovviamente, qui sto facendo affidamento sulla costante MAX_PATH che mi limita a 260 caratteri.Quindi, per gestire i nomi di file / percorsi più lunghi, potrei semplicemente estendere il mio array tach come questo: TCHAR FilePath[32767];.

o c'è un modo migliore?Potrei usare un array di lunghezza variabile?(TCHAR FilePath[]; è anche possibile in C ++? - Scusa sono abbastanza nuovo a questo).

Grazie ad avanzato!


.

Ecco l'intero snippet di codice di ciò che ho menzionato sopra:

TCHAR FilePath[MAX_PATH];
ZeroMemory(&FilePath, sizeof(FilePath));
GetWindowText(hWndFilePath, FilePath, MAX_PATH);
.

È stato utile?

Soluzione

Esistono un numero di limitazioni rispetto ai percorsi dei file su Windows. Per impostazione predefinita, i percorsi non possono essere più lunghi di 260 caratteri, che è ciò che la costante MAX_PATH è per.

Tuttavia, tu può accedere percorsi più lunghi - con determinate limitazioni - prefisso il percorso con "\\? \". Tuttavia, le limitazioni dell'utilizzo del prefisso "\\? \" Di solito superano il vantaggio:

    .
  1. Esistono un numero di API di Win32 che non fanno percorsi di supporto con questo prefisso (ad esempio, LoadLibrary fallirà sempre su un percorso più lungo di 260 caratteri)
  2. Le regole di canonlizzazione Win32 non hanno effetto quando si utilizza il prefisso "\\? \". Ad esempio, per impostazione predefinita, "/" nei percorsi viene convertito in "\", ".". e ".." vengono convertiti in riferimenti rispettivamente alle directory attuali e genitore e così via: nessuno di quello accade quando si utilizza il prefisso "\\? \".
  3. Solo perché puoi modificare il tuo programma per supportare percorsi più lunghi, altri programmi potrebbero non riuscire a aprire i file che hai creato. Questo sarà il caso se questi altri programmi non anche utilizzano il prefisso "\\? \".
  4. Per essere onesti, punto # 2 è il vero assassino: ti apri a tutti i tipi di problemi quando si utilizza il prefisso "\\? \" e in pratica devi riattivare le regole di canonicalizzazione Win32 se tu vada quella rotta.

    Pertanto, la mia raccomandazione è semplicemente attaccare con la limitazione di 260. Almeno fino a quando c'è un supporto piattaforma migliore per percorsi più lunghi.

Altri suggerimenti

Dipende dal tipo di programma che stai scrivendo.La mia strategia di solito è stata quella di limitare il percorso creazione a max_path in lunghezza, ma essere in grado di leggere esistenti dati da percorsi più lunghi (usando il prefisso "\\? \"menziona nella sua risposta).Ci sono delle eccezioni a questo, ad esempio, ad esempio, un programma di backup dovrebbe accettare percorsi lunghi e deve riprodurre esattamente ciò che è stato dato come input.

Mentre Dean è certamente corretto che Windows non canonicalizza percorsi più lunghi per te, ho non ha trovato che questo è molto importante come regola generale.Ciò generalmente significa scrivere il tuo codice per canonizzare il percorso - in genere significa avere l'utente inserire percorsi in un modo che semplicemente non generare tali cose in primo luogo.

No, perché se si ottiene un percorso più lungo, Windows non può accettarlo.Quindi, mentre tecnicamente, potresti contenere più caratteri che nel tuo buffer, non potresti mai usare il risultato del filePath.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top