2009-01-10 15 views

Respuesta

12

Se puede crear un archivo en la carpeta de archivos temporales (utilizando el nombre de archivo en minúsculas), a continuación, comprobar si existe el archivo (utilizando el nombre de archivo en mayúsculas), por ejemplo:

string file = Path.GetTempPath() + Guid.NewGuid().ToString().ToLower(); 
File.CreateText(file).Close(); 
bool isCaseInsensitive = File.Exists(file.ToUpper()); 
File.Delete(file); 
+2

Buena respuesta. Existe una posibilidad extremadamente pequeña de que el GUID creado no contenga 'abcdef'. ¡No es muy probable, pero podría suceder! –

+0

¿Qué tal una creación de una carpeta temporal, creando un nombre de archivo en minúscula conocido y luego probando con el nombre en mayúscula? –

+0

Buen comentario, Mitch (el primero). Puede agregar "a" al nombre del archivo para asegurarse de que contiene al menos una letra. – M4N

1

Intente crear un archivo temporal en todas las minúsculas y luego compruebe si existe utilizando mayúsculas.

+0

¿qué pasa con abc.xyz y aBc.xyz – masfenix

7

No existe tal función en .NET Class Library.

Puede, sin embargo, implementar su propia cuenta: intente crear un archivo con un nombre en minúscula y luego intente abrirlo con la versión de upparcase de su nombre. Probablemente es posible mejorar este método, pero entiendes la idea.

EDIT: En realidad, puede tomar el primer archivo en el directorio raíz y luego verificar si existen ambos filename.ToLower() y filename.ToUpper(). Desafortunadamente, es muy posible que existan tanto las variantes en mayúsculas como las minúsculas del mismo archivo, por lo que debe comparar las propiedades de FileInfo.Name de las variantes en minúscula y mayúscula para ver si realmente son iguales o no. Esto no requerirá escribir en el disco.

Obviamente, esto fallará si no hay archivos en absoluto en el volumen. En este caso, vuelva a la primera opción (consulte la respuesta de Martin para la implementación).

+0

Esto podría fallar, si el primer archivo existente, existe en dos variantes de bajos y mayúsculas en un sistema de archivos entre mayúsculas y minúsculas. – M4N

+0

Martin: cierto. Voy a modificar mi respuesta en consecuencia. –

+2

Esto no funcionará como fileInfo.Name y fileInfo.FullName retendrá el caso que se envió al constructor, ¡no obtendrá el caso del nombre de archivo real! – Peter

5

Tenga en cuenta que usted pueda tener sistemas de archivos múltiples con diferentes reglas de carcasa Por ejemplo, el sistema de archivos raíz puede distinguir entre mayúsculas y minúsculas, pero puede tener un sistema de archivos insensible a mayúsculas y minúsculas (por ejemplo, un dispositivo USB con un sistema de archivos FAT) montado en algún lugar. Entonces, si hace tales comprobaciones, asegúrese de hacerlas en el directorio al que va a acceder.

Además, ¿qué ocurre si el usuario copia los datos de, por ejemplo, sensible a mayúsculas y minúsculas a un sistema de archivos insensible a mayúsculas y minúsculas? Si tiene archivos que difieren solo por caso, uno de ellos sobrescribirá el otro, causando la pérdida de datos. Al copiar en la otra dirección, también podría tener problemas, por ejemplo, si el archivo A contiene una referencia al archivo "b", pero el archivo en realidad se llama "B". Esto funciona en el sistema de archivos original que no distingue entre mayúsculas y minúsculas, pero no en el sistema sensible a mayúsculas y minúsculas.

Por lo tanto, le sugiero que evite si el sistema de archivos distingue entre mayúsculas y minúsculas o no si puede. No genere nombres de archivo que difieran solo por caso, use los diálogos estándar del selector de archivos, prepárese para que el caso cambie, etc.

1

No es una función .NET, pero las funciones GetVolumeInformation y GetVolumeInformationByHandleW de la API de Windows Haz lo que quieras (véase el parámetro lpFileSystemFlags yje

+0

Disculpe, antigua respuesta, pero mis pruebas parecen indicar que NTFS distingue entre mayúsculas y minúsculas (FileSystemFlags resultante tiene FILE_CASE_SENSITIVE_SEARCH). Entonces, ¿estoy haciendo algo mal? –

0
/// <summary> 
/// Check whether the operating system is case-sensitive. 
/// For instance on Linux you can have two files/folders called 
//// "test" and "TEST", but on Windows the two can not coexist. 
/// This method does not extend to mounted filesystems, which might have different properties. 
/// </summary> 
/// <returns>true if the operating system is case-sensitive</returns> 
public static bool IsFileSystemCaseSensitive() 
{ 
    // Actually try. 
    string file = Path.GetTempPath() + Guid.NewGuid().ToString().ToLower() + "test"; 
    File.CreateText(file).Close(); 
    bool result = File.Exists(file.ToUpper()); 
    File.Delete(file); 

    return result; 
} 

sobre la base de la respuesta de M4N, con los siguientes cambios:.

  • nombres estáticos por lo que estamos seguros que contiene una carta y no sólo números
  • .
  • ¿Quizás más legible?
  • Envuelto en un método.
  • Documentación.

Una mejor estrategia sería tomar una ruta como argumento y crear el archivo en el mismo sistema de archivos, pero escribir allí podría tener consecuencias inesperadas.

0

invoco El tramposo:

Path.DirectorySeparatorChar == '\\' ? "I'm insensitive" : "I'm probably sensitive" 
Cuestiones relacionadas