Как я открываю уже открытый файл с .net StreamReader?

Page Speed ​​рекомендует уменьшить разметку:

http://code.google.com/speed/page-speed/docs/payload.html#MinifyHTML

48
задан Jon Cage 22 May 2009 в 02:19
поделиться

3 ответа

Как говорит Джаред, вы не можете этого сделать, если другой объект, у которого открыт файл, не разрешает совместное чтение. Excel допускает совместное чтение даже для файлов, открытых для записи. Следовательно, вы должны открыть файловый поток с параметром FileShare.ReadWrite .

Параметр FileShare часто понимают неправильно. Он указывает, что могут делать другие открыватели файла. Это относится как к прошлым, так и к будущим новичкам. Думайте о FileShare не как о ретроактивном запрете на предыдущие средства открытия (например, Excel), а как на ограничение, которое не должно нарушаться при текущем открытии или любых будущих открытиях.

В случае текущей попытки открыть файл, FileShare. Read говорит: «Открывайте этот файл для меня успешно, только если какие-либо предыдущие открыватели открывали его только для чтения». Если вы укажете FileShare. При чтении файла, открытого для записи в Excel , ваше открытие завершится ошибкой, так как это нарушит ограничение, потому что в Excel он открыт для записи .

Поскольку в Excel есть файл открыт для записи, вы должны открыть файл с помощью FileShare.ReadWrite, если вы хотите, чтобы ваш открылся для успешного выполнения. Другой способ думать о параметре FileShare: он определяет «доступ к файлу другого человека».

Теперь предположим другой сценарий, при котором вы открываете файл, который в настоящее время не открывается ни одним другим приложением. FileShare.Read говорит, что «будущие открыватели могут открывать файл только с доступом на чтение».

Логически эта семантика имеет смысл - FileShare.Read означает, что вы не хотите читать файл, если другой парень уже его пишет, а вы этого не сделаете. Я не хочу, чтобы другой парень записал файл, если вы его уже читаете. FileShare.ReadWrite означает, что вы готовы читать файл, даже если его пишет другой человек, и у вас нет проблем с тем, чтобы позволить другому открывателю записать файл, пока вы его читаете.

Ни в коем случае это не допускает нескольких писателей. FileShare похож на базу данных IsolationLevel. Ваш желаемый параметр здесь зависит от требуемых гарантий «согласованности».

Пример:

using (Stream s = new FileStream(fullFilePath, 
                                 FileMode.Open,
                                 FileAccess.Read,
                                 FileShare.ReadWrite))
{
  ...
}

или,

using (Stream s = System.IO.File.Open(fullFilePath, 
                                      FileMode.Open, 
                                      FileAccess.Read, 
                                      FileShare.ReadWrite))
{
}

Дополнение:

Документация по System.IO.FileShare немного скудна. Если вы хотите получить точные факты, обратитесь к документации по функции Win32 CreateFile , которая лучше объясняет концепцию FileShare.

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

Ни в коем случае это не допускает нескольких писателей. FileShare похож на базу данных IsolationLevel. Ваш желаемый параметр здесь зависит от требуемых гарантий «согласованности».

Пример:

using (Stream s = new FileStream(fullFilePath, 
                                 FileMode.Open,
                                 FileAccess.Read,
                                 FileShare.ReadWrite))
{
  ...
}

или,

using (Stream s = System.IO.File.Open(fullFilePath, 
                                      FileMode.Open, 
                                      FileAccess.Read, 
                                      FileShare.ReadWrite))
{
}

Дополнение:

Документация по System.IO.FileShare немного скудна. Если вы хотите получить точные факты, обратитесь к документации по функции Win32 CreateFile , которая лучше объясняет концепцию FileShare.

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

Ни в коем случае это не допускает нескольких писателей. FileShare похож на базу данных IsolationLevel. Ваш желаемый параметр здесь зависит от требуемых гарантий «согласованности».

Пример:

using (Stream s = new FileStream(fullFilePath, 
                                 FileMode.Open,
                                 FileAccess.Read,
                                 FileShare.ReadWrite))
{
  ...
}

или,

using (Stream s = System.IO.File.Open(fullFilePath, 
                                      FileMode.Open, 
                                      FileAccess.Read, 
                                      FileShare.ReadWrite))
{
}

Дополнение:

Документация по System.IO.FileShare немного скудна. Если вы хотите получить точные факты, обратитесь к документации по функции Win32 CreateFile , которая лучше объясняет концепцию FileShare.

Пример:

using (Stream s = new FileStream(fullFilePath, 
                                 FileMode.Open,
                                 FileAccess.Read,
                                 FileShare.ReadWrite))
{
  ...
}

или,

using (Stream s = System.IO.File.Open(fullFilePath, 
                                      FileMode.Open, 
                                      FileAccess.Read, 
                                      FileShare.ReadWrite))
{
}

Дополнение:

Документация по System.IO.FileShare немного скудна. Если вы хотите получить точные факты, обратитесь к документации по функции Win32 CreateFile , которая лучше объясняет концепцию FileShare.

Пример:

using (Stream s = new FileStream(fullFilePath, 
                                 FileMode.Open,
                                 FileAccess.Read,
                                 FileShare.ReadWrite))
{
  ...
}

или,

using (Stream s = System.IO.File.Open(fullFilePath, 
                                      FileMode.Open, 
                                      FileAccess.Read, 
                                      FileShare.ReadWrite))
{
}

Дополнение:

Документация по System.IO.FileShare немного скудна. Если вы хотите получить точные факты, обратитесь к документации по функции Win32 CreateFile , которая лучше объясняет концепцию FileShare.

152
ответ дан 7 November 2019 в 12:04
поделиться

EDIT

I'm still not 100% sure why this is the answer, but you can fix this problem by passing FileShare.ReadWrite to the FileStream constructor.

using (CsvReader csv = new CsvReader(new StreamReader(new FileStream(fullFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)), false)
{
  ...
}

My curiosity has a hold of me at the moment and I'm trying to understand why this is the particular answer. If I figure it out later I'll update this with the information.

The best documentation actually appears to be in the CreateFile function. This is the function .Net will call under the hood in order to open up a file (create file is a bit of a misnomer). It has better documentation for how the sharing aspect of opening a file works. Another option is to just read Cheeso's answer

14
ответ дан 7 November 2019 в 12:04
поделиться

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

5
ответ дан 7 November 2019 в 12:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: