2010-06-21 11 views
6

Voglio verificare se la mia stringa è valida per il percorso del file di Windows. Stavo cercando in giro e sembra che non ci sia un metodo affidabile per farlo. Ho anche controllato la libreria del filesystem, e non esiste nessuna funzione ovvia per fare questo controllo, forse qualcosa come is_valid_windows_nameIl nome del file di controllo è valido nome di windows

+0

È necessario verificare se il percorso fornito è valido o se è valido e se la struttura della directory è già impostata per il percorso o se esiste già un file? –

+0

Buon dolore. Questo non è un duplicato poiché l'altro è codificato in C# e la risposta accettata fornisce API C#, mentre questo è codificato in C++. –

+0

Che ne dici di provare a creare un file con quel nome su Windows e vedere se è un successo? (forse è possibile modificare il percorso un po 'per solo prova.) – cshu

risposta

1

Si potrebbe usare la funzione _splitpath() e analizzare l'output (in base ad esso, si potrebbe facilmente dire se il percorso è valido o no).

Vedere MSDN per ulteriori informazioni.

Si noti che questa funzione è specifica per Windows.

1

Non credo che ci sia un C++ standard per questo.

Si noti che l'API di Windows consente più nomi di file rispetto alla shell di Windows (i nomi di file che l'utente può utilizzare in windws explorer).

Si dovrebbe dare un'occhiata a Windows Shell API.

Un'altra possibilità è l'uso di tentativi ed errori, in questo modo sei veramente indipendente dal filesystem corrente.

Il modo più semplice è quello di non consentire

\/<> | ":? *

e si dovrebbe andare bene

+1

e' * 'e com, lpt, aux, con –

+0

aggiornato la mia risposta :) – codymanix

1

Sì, c'è una funzione di boost che fa quello che si vuole Date un'occhiata al boost :: filesystem :: windows_name (...)... Dovrai includere boost/filesystem/path.hpp e link alle librerie libboost_system e libboost_filesystem corrette (specifiche della versione e dell'architettura) poiché path non è una lib di sola intestazione.

+0

Boost potrebbe essere un po' troppo se questo fosse il suo unico uso, ma Boost fornisce molte funzionalità C++ di nuova generazione, che lo rendono utile per lo sviluppo generale del C++. Quando usi già Boost, questa è un'ottima opzione. – sage

0

È un peccato anche il La più recente libreria di file system C++ 17 non ha una funzione per verificare i nomi dei file.

Si ca n utilizzare lo specifico Shell Lightweight Utility function per Windows PathFileExists o Windows APIGetFileAttributes e controllare l'ultimo codice di errore specifico per ERROR_INVALID_NAME.

Penso che sia un tipo di uso improprio (perché in realtà dovrebbe esserci una funzione dedicata) ma serve allo scopo.

+0

Non va bene se il file non esiste ancora. Inoltre, la sicurezza potrebbe impedirne l'accesso fino a un livello elevato. – CodeLurker

+0

@CodeLurker Perché non esattamente?OP vuole solo verificare un nome/percorso del file windows valido. –

+0

OP non dice nulla su di esso già esistente. In caso contrario, quelli non saranno di aiuto. Inoltre, potrebbe essere il caso che vogliamo controllare, anche se non abbiamo (ancora) accesso ad esso. Si noti la soluzione che ho finalmente risolto qui: https://stackoverflow.com/questions/3038351/check-whether-a-string-is-a-valid-filename-with-qt/45282192#45282192 – CodeLurker

Problemi correlati