2009-11-18 4 views
13

Premesso che (almeno su NTFS) il file system su Windows è case insensitive, vorrei confrontare String fileA a String fileB come tale:.NET Come confrontare due stringhe che rappresentano i nomi dei file ignorando caso correttamente

fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase) 

La domanda diventa quindi quale cultura dovrei usare, la cultura corrente (ui?) Predefinita è sufficiente? Non riesco a trovare alcun metodo BCL per questo scopo.

+0

per tali scopi, i'd sempre suggeriscono CultureInfo.InvariantCulture –

risposta

19

Si dovrebbe usare StringComparison.OrdinalIgnoreCase, come dettagliato nella Best Practices for Using Strings in the .NET Framework (cercare "percorsi dei file" per trovare l'apposita sezione).

Se si utilizza una cultura per la corrispondenza delle stringhe, è possibile ottenere in una posizione in cui, ad esempio, i nomi "häl.gif" e "hal.gif" sono considerati una corrispondenza.

+2

Risponde alla domanda. Nessuna cultura dovrebbe essere usata. I confronti del nome file NTFS sono ordinali. –

+0

Ho provato a trovare una dichiarazione ufficiale su MSDN che supporta questo, ma non è stato possibile. Se qualcuno ne trova uno si prega di collegarsi ad esso. –

+1

Sembra supportato da http://msdn.microsoft.com/en-us/library/dd465121.aspx –

0

Si potrebbe utilizzare InvariantCulture (vedi http://msdn.microsoft.com/en-us/library/4c5zdc6a.aspx).

Nel tuo esempio:


FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase) 
+2

Do not - questo non sarà coerente con le regole NTFS. Utilizzare il confronto ordinale. –

1

Marcus,

Si potrebbe voler presso sguardo alla risposta per un'altra domanda StackOverflow, che è molto simile: Win32 File Name Comparison, che a sua volta cita http://www.siao2.com/2005/10/17/481600.aspx.

A seguito di un link in un'altra risposta alla stessa domanda e scavare ulteriormente, mi sono imbattuto nel seguente articolo di MSDN http://msdn.microsoft.com/en-us/library/ms973919.aspx. Vale la pena di una lettura in generale, ma quando si tratta di file di confronto nome si consiglia di utilizzare StringComparison.OrdinalIgnoreCase. Vedere la Tabella 1 nell'articolo, che contiene i percorsi dei file come uno dei tipi di dati gestiti o la seguente:

Quindi, quando si interpretano nomi di file, cookie o qualsiasi altra cosa in cui può apparire una combinazione di å, ordinale i confronti offrono ancora il comportamento più trasparente e adeguato.

speranze che questo aiuta, Boaz

1

Questo non è possibile fare in modo affidabile.

Sì, la conversione caso per il file system è case-insensitive.

Ma la tabella di conversione del caso è memorizzata sul file system stesso (per NTFS) e cambia tra le versioni (ad esempio la tabella di conversione del caso Vista è stata portata al livello Unicode 5, quindi Vista NTFS e XP NTFS hanno diverse regole di conversione dei casi).

E la cosa che conta è il sistema operativo che ha formattato il file system, non il sistema operativo corrente.

Quindi è possibile imbattersi in tutti i tipi di problemi con altri file system (Mac OS esegue una sorta di normalizzazione Unicode (non quella standard)), Linux non fa nulla, ma Samba (che implementa il protocollo di condivisione file di Windows) lo fa. E ha altri tavoli di Windows.

Che cosa succede se traccio una lettera a un disco di rete condiviso da Linux o Mac OS?

In generale non si dovrebbe mai provare a confrontare i nomi dei file. Se vuoi sapere se c'è, prova ad accedervi.

0

Ho provato questo.

Path.GetFullPath(path1).Equals(Path.GetFullPath(path2)) 
+1

Ancora meglio 'Path.GetFullPath (path1) .TrimEnd (Path.DirectorySeparatorChar) .Equals (Path.GetFullPath (path2) .TrimEnd (Path.DirectorySeparatorChar))' – SensorSmith