C# може ли да чете от файл, който не съществува?

Имаме някакъв C# код, който чете данни от текстов файл с помощта на StreamReader. На един компютър можем да четем данни от текстовия файл дори след като е бил изтрит или заменен с различен текстов файл - извикването File.Exists съобщава, че файлът съществува дори когато не е в Windows Explorer. На друг компютър обаче това поведение не се случва. И двата компютъра работят с 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 не трябва да се използва за проверка на пътя, този метод просто проверява дали файлът, указан в path, съществува.
Имайте предвид, че друг процес може потенциално да направи нещо с файла между времето, когато извиквате метода Exists и извършете друга операция върху файла, като например Изтриване. Препоръчителна практика за програмиране е да обвиете метода Exists и операциите, които предприемате върху файла, в блок try...catch, както е показано в примера. Това помага да се стесни обхватът на потенциални конфликти. Методът Exists може само да помогне да се гарантира, че файлът ще бъде достъпен, но не може да го гарантира.

person SwDevMan81    schedule 01.09.2009

Отваря ли се файлът за четене, преди да бъде изтрит? Ако е така, не е неочаквано да можете да четете от отворения файл дори след като файловата система го е оставила.

RE: File.Exists():

File.Exists по своята същност е предразположен към състезателни условия. Не трябва да се използва като изключителен начин за проверка дали даден файл съществува или не, преди да се извърши някаква операция. Тази грешка често може да доведе до пропуск в сигурността във вашия софтуер.

По-скоро винаги обработвайте изключенията, които могат да бъдат хвърлени от вашите действителни файлови операции, които се отварят и т.н., и проверявайте въведените данни, след като бъдат отворени.

person Greg D    schedule 01.09.2009