2010-07-22 4 views

ответ

1

Здесь вы идете. Использует немного pInvoke Interop goodness (badness), но он это сделает. Я скинул и добавил некоторые магические константы для параметров доступа и sharemode, поэтому не стесняйтесь их инкапсулировать.

private static void Main() 
{ 
    using (FileStream fs = new FileStream(@"..\..\Program.cs", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     using (TextReader tr = new StreamReader(fs)) 
     { 
      Console.WriteLine(tr.ReadToEnd()); 

      using (FileStream fs1 = new FileStream(ReOpenFile(fs.SafeFileHandle, 3, 3, 0), FileAccess.ReadWrite)) 
      { 
       fs1.Seek(0, SeekOrigin.End); 
       using (TextWriter tw = new StreamWriter(fs1)) 
       { 
        tw.WriteLine("/* this should be all right */"); 
       } 
      } 
     } 
    } 
} 

[DllImport("kernel32", SetLastError = true)] 
private static extern SafeFileHandle ReOpenFile(SafeFileHandle hOriginalFile, uint dwAccess, uint dwShareMode, uint dwFlags); 
+0

Это то, о чем я думал, но был обеспокоен тем, что FileStream будет перекомпоновать данные, и они не будут синхронизированы. Я также обеспокоен тем, что использование interop потребует более высокого разрешения, чем доступно. Я дам ему попробовать. –

+0

Это сработало. Благодаря! Я добавил следующий код после того, как внутренний оператор using докажет, что FileStream (fs) и TextReader (tr) по-прежнему могут использоваться повторно: // Ищите начало и попробуйте снова прочитать fs.Seek (0, SeekOrigin.Begin) ; Console.WriteLine («*** Чтение снова ***»); Console.WriteLine (tr.ReadToEnd()); Спасибо –

0

Вы не можете.

Почему вы открываете его только для чтения? Почему бы вам просто не открыть новый FileStream? Вам даже не нужно закрывать старый, при условии, что FileShare установлен правильно.

+0

Его оперирование с минимальным количеством разрешений. Некоторые пользователи не будут иметь доступ на запись, а другие. Поскольку все нужно читать, я могу открыть в режиме только для чтения. Когда немногие, кому нужно написать try, я могу проверить свойство CanWrite, а затем эскалацию только для этой операции. Открытие другого потока приведет к двум представлениям на одни и те же данные, причем только разрешения будут разными. Это означает, что я также должен поддерживать два потока и добавлять логику для этого во всей системе или строить класс, содержащий два потока с разными разрешениями. –

+0

Еще один момент, ОС поддерживает это. Это ограничение чисто в .NET BCL. См. ReOpenFile (http://msdn.microsoft.com/en-us/library/aa365497(VS.85).aspx). –

+0

Вы можете создать свой собственный из класса stream, который может переключаться между режимом чтения и записи, поддерживая несколько потоков внутри. Таким образом, вы можете отвлечь эту деталь. – codymanix

Смежные вопросы