Почему System.IO.File.Exists(строковый путь) возвращает false?
System.IO.File.Exists(string path)
возвращает всегда false, даже если файл существует по указанному пути. Каким может быть возможное решение?
Ответы
Ответ 1
Это может быть проблема разрешения. Из документа :
Метод Exists возвращает false, если возникает какая-либо ошибка при попытке определить, существует ли указанный файл. Это может происходить в ситуациях, которые вызывают исключения, такие как передача имени файла с недопустимыми символами или слишком много символов, сбой или отсутствующий диск или если у вызывающего устройства нет разрешения на чтение файла.
Один из способов увидеть, что происходит, - просто попытаться прочитать файл (например, с помощью File.OpenRead
). Я был бы удивлен, если это удастся - но если это не удается, исключение должно предоставить вам больше информации.
Ответ 2
Скрытие окончаний файлов в окнах иногда может вызвать путаницу: вы знаете, что ваш файл имеет имя file.txt, когда он фактически называется file.txt.txt, потому что последние 4 символа были скрыты ОС.
Ответ 3
Одна из возможностей, не упомянутая ни в одном из ответов, это "Перенаправление файловой системы" в Windows 8.1 и более поздних версиях.
Например, если ваша программа является 32-битным приложением и вы работаете в 64-битной Windows, то попытка доступа к% windir%\System32 будет перенаправлена на% windir%\SysWOW64. И если файл, к которому вы пытаетесь получить доступ, не существует в% windir%\SysWOW64, тогда System.IO.File.Exists (путь к строке) вернет значение False.
Ссылка на хорошую статью, объясняющую это поведение
Ответ 4
Как я обошел это, использовал Server.MapPath(fileName)
, поскольку он пытался найти файл где-то еще.
System.IO.File.Exists(Server.MapPath(string path))
Ответ 5
в моем случае возникает другая "тире" в имени файла.
var f1 = "4-37R.pdf";
var f2 = "4‐37R.pdf";
var r = f1==f2?"same":"diff";
Console.Write(r); //diff
получается
var c1 = '-';
var c2 = '‐';
Console.WriteLine((int)c1); //45
Console.WriteLine((int)c2); //8208
используйте тот же "-", чтобы устранить проблему.
Ответ 6
Это немного смутило меня, когда я отлаживал службу локально, я запускал File.Exists( "U:\dir1" ) в отношении местоположения сервера, отображаемого на моей рабочей станции, как (U:). Я заменил U:\dir1 на "\\ serverPath\dir1", а File.Exists вернули значение true.
Ответ 7
Я тоже ломал голову над этим, а потом понял, что использую File.Exists, когда должен был использовать Directory.Exists.
Ответ 8
Я тоже это испытывал. В моем случае я удалял файл и воссоздавал его. В процессе, который удалял файл, я забыл добавить в WaitForExit()
перед тем, как использовать File.Exists
позже в
Ответ 9
System.IO.File.Exists(string path) вернул мне false при попытке прочитать C:\OpenSSL\bin\file.txt
. Запуск приложения в режиме администратора не помог. (Я вошел в систему с учетной записью администратора, Windows 10) После того, как я переместил файл в C:\Users\MyUser\Desktop\file.txt
, File.Exists() вернул true.
Ответ 10
Та же проблема, когда я пытаюсь получить доступ к файлу из-под моего домена "/Content/Images/1.jpg", он возвращал false. Когда я попытался указать полный путь (D:/{.. path}/Content/Images/1.jpg, он вернул true. :)
Ответ 11
Используйте\\вместо @. Например:
@ "C:\file.txt" → "C:\\file.txt"