Сломанный символьный файл создает исключение FileNotFoundException, но передает File.Exists - PullRequest
1 голос
/ 18 января 2020

У меня неработающая ссылка c ссылка:

lrwxr-xr-x    1 mugen  staff     10 Nov  5  2018 README.md -> README.md?

Чек File.Exists(filePath) возвращает true, но при вызове new FileStream(filePath, FileMode.Open) выбрасывает System.IO.FileNotFoundException.

Что лучшая стратегия, чтобы избежать попытки открыть этот файл?

1 Ответ

2 голосов
/ 18 января 2020

Такое поведение имеет смысл - файл (символьная c ссылка) существует, но вы не можете его прочитать, поскольку он указывает на несуществующий файл (неработающая символическая c ссылка).

Лично я не большой поклонник этих предварительных проверок. Во-первых, они являются грубыми по своей природе - даже если все проверки пройдены, что-то может произойти в файловой системе после этого и до того, как вы попробуете использовать файл (по общему признанию, это не проблема в локальной файловой системе, но я все еще думаю, что это плохая практика). Во-вторых, это дорого - все эти проверки выполняют, по крайней мере, некоторые операции ввода-вывода, а часто и избыточно (поскольку вы снова будете выполнять те же операции ввода-вывода при открытии файла).

Я бы просто попытался открыть файл и перехватить исключение:

FileStream fs = null;
try {
    fs = new FileStream(filePath, FileMode.Open);
    // Use fs
} catch (IOException e) {
    // Handle the exception in some elegant way
} finally {
    if (fs != null) {
        fs.Close();
    }
}
...