Есть ли способ продвинуть FileStream только для чтения для чтения-записи? Я ищу функциональность, аналогичную функции Win32 SDK ReOpenFile.Может ли FileStream продвигаться от чтения только до чтения-записи?
ответ
Здесь вы идете. Использует немного 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);
Вы не можете.
Почему вы открываете его только для чтения? Почему бы вам просто не открыть новый FileStream? Вам даже не нужно закрывать старый, при условии, что FileShare установлен правильно.
Его оперирование с минимальным количеством разрешений. Некоторые пользователи не будут иметь доступ на запись, а другие. Поскольку все нужно читать, я могу открыть в режиме только для чтения. Когда немногие, кому нужно написать try, я могу проверить свойство CanWrite, а затем эскалацию только для этой операции. Открытие другого потока приведет к двум представлениям на одни и те же данные, причем только разрешения будут разными. Это означает, что я также должен поддерживать два потока и добавлять логику для этого во всей системе или строить класс, содержащий два потока с разными разрешениями. –
Еще один момент, ОС поддерживает это. Это ограничение чисто в .NET BCL. См. ReOpenFile (http://msdn.microsoft.com/en-us/library/aa365497(VS.85).aspx). –
Вы можете создать свой собственный из класса stream, который может переключаться между режимом чтения и записи, поддерживая несколько потоков внутри. Таким образом, вы можете отвлечь эту деталь. – codymanix
- 1. Может ли перетаскивание Delphi «продвигаться» до стыковки?
- 2. Filestream только для чтения ПК
- 3. Должен ли я распоряжаться только для чтения FileStream
- 4. Получите FileStream от контроллера MVC до клиента
- 5. Как обрезать FileStream для чтения только определенных байтов?
- 6. Пропустить буфер только для чтения от C до Lua
- 7. Filestream добавляет ненужные символы во время чтения
- 8. Получить Filestream от ZipArchive
- 9. Может ли valgrind сообщать только о первопричине чтения uninit var?
- 10. Использовать filestream для чтения файла из ресурсов
- 11. с помощью FileStream для чтения файла, будет ли он блокироваться?
- 12. Может ли файл в cvs быть сделан только для чтения?
- 13. Разница между возвратом файла и FileStream от AWS до iOS
- 14. Python не будет продвигаться
- 15. MemoryStream не может быть расширен ... рефакторинг от FileStream до MemoryStream или аналогичный
- 16. Задержка обновления от непрочитанного до чтения
- 17. Может ли ListBox WPF быть «только для чтения»?
- 18. Может ли переменная быть сделана только для чтения в Node.js
- 19. Может ли кто-нибудь объяснить это исключение только для чтения?
- 20. Может ли protobuf-net обрабатывать свойства только для чтения?
- 21. Может ли z3py добавить новое утверждение от чтения модели?
- 22. Возможно ли получить доступ к акции FILESTREAM?
- 23. Может ли ds.record.getRecord ('...') читать только?
- 24. не может сделать папку только для чтения
- 25. Только что закончил обучение основам обратной инженерии. Как продвигаться дальше?
- 26. Почему этот FileStream возвращает только нули?
- 27. Природные Трансформации От чтения Bool К Может
- 28. Является ли FileStream очень медленным?
- 29. Будет ли char и short продвигаться до int перед тем, как быть пониженными в выражениях присваивания?
- 30. event.clientX только для чтения?
Это то, о чем я думал, но был обеспокоен тем, что FileStream будет перекомпоновать данные, и они не будут синхронизированы. Я также обеспокоен тем, что использование interop потребует более высокого разрешения, чем доступно. Я дам ему попробовать. –
Это сработало. Благодаря! Я добавил следующий код после того, как внутренний оператор using докажет, что FileStream (fs) и TextReader (tr) по-прежнему могут использоваться повторно: // Ищите начало и попробуйте снова прочитать fs.Seek (0, SeekOrigin.Begin) ; Console.WriteLine («*** Чтение снова ***»); Console.WriteLine (tr.ReadToEnd()); Спасибо –