c#, има проблем при поточно четене на регистрационния файл на msbuild, докато msbuild logger все още пише в него

Опитвам се да използвам StreamReader, за да прочета лог файла на MSBuild в реално време с помощта на FileSystemWatcher. Винаги ме подканва File Exception, когато MSBuild все още пише в него. Моят код може да е успял да покаже съдържанието на регистрационния файл на MSBuild на контролата ми RichTextBox само когато MSBuild завърши компилацията...

Има ли алтернатива за писане на код за четене на файл, който сега се използва от друг процес? Като например, notepad.exe чете файл по всяко време без притеснение...


person lannyboy    schedule 04.08.2011    source източник
comment
AFAIK това не е възможно, тъй като това е нарушение на споделянето.   -  person trampi    schedule 04.08.2011
comment
но notepad.exe прави магията.   -  person lannyboy    schedule 04.08.2011
comment
Как отваряте своя StreamReader? Указвате ли да го отворите в режим само за четене? msdn.microsoft.com/en-us/library/   -  person Jason Down    schedule 04.08.2011
comment
Добре, добре. И предполагам, че сте се опитали да го отворите с FileStream само за четене? StreamReader sr = нов StreamReader(нов FileStream(path, FileMode.Open, FileAccess.Read));   -  person trampi    schedule 04.08.2011
comment
@trampi, направих това, което каза преди... Все още се подканваше бла бла името на файла се използва от друг процес...   -  person lannyboy    schedule 04.08.2011
comment
Опитайте един от отговорите. Те използват още един аргумент, наречен FileShare - изглежда това, от което се нуждаете. Късмет!   -  person trampi    schedule 04.08.2011


Отговори (2)


Как създавате екземпляр на StreamReader?

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

Опитайте тази:

StreamReader streamReader = new StreamReader(File.Open("C:\\......", FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
person jdavies    schedule 04.08.2011

Можете да опитате да използвате едно от претоварванията на метода 'Open', за да посочите, че се опитвате само да четете. Като този:

FileStream fs = 
    File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
person Edwin de Koning    schedule 04.08.2011