С# может читать из несуществующего файла?

У нас есть код C#, который считывает данные из текстового файла с помощью StreamReader. На одном компьютере мы можем прочитать данные из текстового файла даже после того, как он был удален или заменен другим текстовым файлом — вызов File.Exists сообщает, что файл существует, даже если его нет в проводнике Windows. Однако на другом компьютере такого поведения не происходит. Оба компьютера работают под управлением Vista Business и .NET 2.0.50727 SP2.

Мы попытались перезапустить машину без разрешения.

Есть ли у кого-нибудь понимание того, как это может быть возможно, и информация о возможных решениях?

Спасибо, Алан


person Alan Spark    schedule 01.09.2009    source источник
comment
Является ли один из ПК 64-битной машиной?   -  person Simon P Stevens    schedule 01.09.2009
comment
Является ли ваш путь к файлу корневым относительным (абсолютным путем)?   -  person kv-prajapati    schedule 01.09.2009
comment
Покажите нам код File.Exists, который вы используете   -  person kloucks    schedule 01.09.2009
comment
Ни один из компьютеров не является 64-битным, и путь является абсолютным.   -  person Alan Spark    schedule 01.09.2009


Ответы (3)


Может ли это быть проблемой виртуализации папок?

person Daniel Brückner    schedule 01.09.2009
comment
Это было бы мое первое предположение. - person ur.; 01.09.2009
comment
Спасибо за вашу помощь, виртуализация папок была причиной конфликта. - person Alan Spark; 01.09.2009
comment
Vista действительно забавная, я вообще не знал о виртуализации папок, но, прочитав статью по ссылке, я рассмеялся, что программист может потратить всю жизнь, пытаясь понять, что пошло не так !! - person Akash Kava; 01.09.2009

Из MSDN

Метод Exists не следует использовать для проверки пути, этот метод просто проверяет, существует ли файл, указанный в пути.
Имейте в виду, что другой процесс потенциально может что-то сделать с файлом в промежутке между вызовом метода Exists. и выполните другую операцию над файлом, например Удалить. Рекомендуемая практика программирования заключается в заключении метода Exists и операций, выполняемых с файлом, в блок try...catch, как показано в примере. Это помогает сузить поле для потенциальных конфликтов. Метод Exists может только гарантировать, что файл будет доступен, но не может этого гарантировать.

person SwDevMan81    schedule 01.09.2009

Файл открывается для чтения перед удалением? Если это так, неудивительно, что по-прежнему можно читать из открытого файла даже после того, как файловая система в противном случае отпустила его.

RE: File.Exists():

File.Exists по своей природе склонен к гонкам. Его не следует использовать как исключительный способ проверки существования файла перед выполнением какой-либо операции. Эта ошибка часто может привести к бреши безопасности в вашем программном обеспечении.

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

person Greg D    schedule 01.09.2009