Такое поведение имеет смысл - файл (символьная 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();
}
}