Попробуйте эти 2 простые варианты, которые не должны использовать PInvoke и вернуть обнуляемого Boolean. Я не эксперт по теме, поэтому я знаю, что это самый эффективный код, но он работает для меня.
Просто пройдите по пути, и если результат равен null (HasValue = false), совпадение не найдено, если результат является ложным, существует точное совпадение, в противном случае, если true, существует совпадение с разным случаем.
Методы GetFiles, GetDirectories и GetDrives возвращают точный случай, сохраненный в вашей файловой системе, поэтому вы можете использовать метод сравнения с учетом регистра.
NB: для случая, когда путь является точным приводом (например, @ "C: \") Я должен использовать несколько иной подход.
using System.IO;
class MyFolderFileHelper {
public static bool? FileExistsWithDifferentCase(string fileName)
{
bool? result = null;
if (File.Exists(fileName))
{
result = false;
string directory = Path.GetDirectoryName(fileName);
string fileTitle = Path.GetFileName(fileName);
string[] files = Directory.GetFiles(directory, fileTitle);
if (String.Compare(files[0], fileName, false) != 0)
result = true;
}
return result;
}
public static bool? DirectoryExistsWithDifferentCase(string directoryName)
{
bool? result = null;
if (Directory.Exists(directoryName))
{
result = false;
directoryName = directoryName.TrimEnd(Path.DirectorySeparatorChar);
int lastPathSeparatorIndex = directoryName.LastIndexOf(Path.DirectorySeparatorChar);
if (lastPathSeparatorIndex >= 0)
{
string baseDirectory = directoryName.Substring(lastPathSeparatorIndex + 1);
string parentDirectory = directoryName.Substring(0, lastPathSeparatorIndex);
string[] directories = Directory.GetDirectories(parentDirectory, baseDirectory);
if (String.Compare(directories[0], directoryName, false) != 0)
result = true;
}
else
{
//if directory is a drive
directoryName += Path.DirectorySeparatorChar.ToString();
DriveInfo[] drives = DriveInfo.GetDrives();
foreach(DriveInfo driveInfo in drives)
{
if (String.Compare(driveInfo.Name, directoryName, true) == 0)
{
if (String.Compare(driveInfo.Name, directoryName, false) != 0)
result = true;
break;
}
}
}
}
return result;
}
}
MSDN четко отметил это: «Параметр пути не чувствителен к регистру.», См. Http://msdn.microsoft.com/en-us/library/system.io.directory.exists.aspx – David
Я знаю, вот почему я спрашиваю ... – theknut