Откройте файл, игнорируя регистр в пути и имени файла - PullRequest
1 голос
/ 02 апреля 2019

Я могу преобразовать pathAndFilename в нижний регистр, но, похоже, мне нужен способ сказать OpenRead, что регистр не учитывается.

// pathAndFileName has been converted with .ToLower()
using (FileStream fileStream = File.OpenRead(pathAndFileName))
{
    Bitmap bitmap = new Bitmap(fileStream);
    Image image = (Image)bitmap;
}

1 Ответ

2 голосов
/ 02 апреля 2019

Если вы попытаетесь получить доступ к файлам на компьютере под управлением Linux или другой операционной системы, в которой имена файлов чувствительны к регистру, можно обойти (не проверять!) Использование имени файла, которое у вас есть, в качестве шаблона для отображения файлов в списке. каталог. Помните, что может быть несколько файлов с одним и тем же именем и только разными вариантами написания. Эта вспомогательная функция вызовет исключение в этом случае.

static void Main(string[] args)
{
    string pathAndFileName = ..your file name...;
    string resultFileName = GetActualCaseForFileName(pathAndFileName);

    using (FileStream fileStream = File.OpenRead(resultFileName))
    {
        Bitmap bitmap = new Bitmap(fileStream);
        Image image = (Image)bitmap;
    }    


    Console.WriteLine(resultFileName);
}

private static string GetActualCaseForFileName(string pathAndFileName)
{
    string directory = Path.GetDirectoryName(pathAndFileName);
    string pattern = Path.GetFileName(pathAndFileName);
    string resultFileName;

    // Enumerate all files in the directory, using the file name as a pattern
    // This will list all case variants of the filename even on file systems that
    // are case sensitive
    IEnumerable<string> foundFiles = Directory.EnumerateFiles(directory, pattern);

    if (foundFiles.Any())
    {
        if (foundFiles.Count() > 1)
        {
            // More than two files with the same name but different case spelling found
            throw new Exception("Ambiguous File reference for " + pathAndFileName);
        }
        else
        {
            resultFileName = foundFiles.First();
        }
    }
    else
    {
        throw new FileNotFoundException("File not found" + pathAndFileName, pathAndFileName);
    }

    return resultFileName;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...