Ecco una soluzione di base e relativamente veloce, continuate a leggere qui sotto per qualche commento:
private static string GetCase(string path)
{
DirectoryInfo dir = new DirectoryInfo(path);
if (dir.Exists)
{
string[] folders = dir.FullName.Split(Path.DirectorySeparatorChar);
dir = dir.Root;
foreach (var f in folders.Skip(1))
{
dir = dir.GetDirectories(f).First();
}
return dir.FullName;
}
else
{
return path;
}
}
L'idea di base è che ottenere sottodirectory da un oggetto DirectoryInfo ti porterà il caso corretto, quindi abbiamo solo bisogno di dividere il nome della directory e passare dalla radice alla directory di destinazione, ottenendo il caso corretto ad ogni passaggio.
La mia risposta iniziale si è basata sull'ottenere l'involucro per ogni cartella sull'unità e ha funzionato, ma era lento. Ho trovato un leggero miglioramento che memorizzava i risultati, ma era ancora troppo lento per l'uso quotidiano. Puoi vedere la cronologia delle modifiche per questo commento se hai bisogno di fare questo per ogni cosa sul disco, e anche allora ci sono probabilmente dei modi per velocizzare quel codice. Era "ecco come potresti farlo" e non "ecco un ottimo modo per farlo".
Bertu, nella sua risposta, si avvicinò con l'idea di dividere il percorso nelle sue componenti e ottenere il pezzo per pezzo dell'involucro, che si traduce dal momento che non sei più il controllo tutto come in un enorme aumento velocità nella mia risposta originale Bertu ha anche generalizzato la sua soluzione per fare file e directory. Nei miei test, il codice postato sopra (che utilizza l'idea di Bertu di "dividere il percorso e farlo per pezzo" ma si avvicina iterativamente anziché ricorsivamente) viene eseguito in circa la metà del tempo del codice di Bertu. Non sono sicuro che ciò sia dovuto al fatto che il suo metodo gestisce anche i file, perché il suo uso della ricorsione introduce un sovraccarico aggiuntivo, o perché finisce per chiamare Path.GetFileName(path)
e Path.GetDirectoryName(path)
in ogni iterazione. A seconda delle tue esatte esigenze, una combinazione della sua risposta e mia probabilmente risolverà il tuo problema oltre che in C#.
In tale nota, dovrei ricordare che ci sono some limitations alla gestione dei nomi di file .Net, e dal momento che farlo in .Net richiede di creare molti oggetti DirectoryInfo, si potrebbe voler prendere in considerazione il codice non gestito se questo è il collo di bottiglia.
C'è nessuna funzione per fare questo, e cercando di normalizzare le stringhe come "HElloAgain" a "helloAgain" sarà un problema in quanto anche Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase ("HElloAgain") restituirà "Helloagain. –
@Agent, DirectoryInfo. GetDirectories() restituisce le cartelle nel caso del file system. – Kevin
accettate, wow non avevo idea che nuove risposte erano qui. Grazie a entrambi Iceman e Bertu per aiutare a risolvere questo. – Tom