是否有一种方法可以将只读FileStream提升为Read-Write?我正在寻找类似于Win32 SDK函数ReOpenFile的功能。FileStream是否可以从只读升级到读写?
回答
你在这里。使用一点pInvoke Interop的善良(坏),但它会做到这一点。我已经撇弃并为访问和共享模式参数投入了一些魔术常量,因此可以随意封装它。
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设置正确,您甚至不必关闭旧的。
它关于使用最少量的权限进行操作。有些用户不具有写入权限,而其他用户则可以。由于所有需要阅读,我可以在只读模式下打开。当需要写入的少数人尝试时,我可以检查CanWrite属性,然后仅升级该操作。打开另一个流将导致相同数据的两个视图,只有权限不同。这意味着我还必须维护这两个流,并在整个系统中添加逻辑,或者构建一个类以包含具有不同权限的两个流。 – 2010-07-22 16:07:08
还有一点,操作系统支持这一点。这个限制纯粹是在.NET BCL中。请参阅ReOpenFile(http://msdn.microsoft.com/zh-cn/library/aa365497(VS.85).aspx)。 – 2010-07-22 16:12:06
您可以从流类开发自己的类,它可以通过在内部维护多个流来在读和写模式之间切换。这样你就可以将这个细节抽象出来。 – codymanix 2010-07-23 10:49:35
- 1. FileStream读/写
- 2. 可升级的读/写锁Win32
- 3. pthreads:读写器锁,将读锁升级到写锁
- 4. LockFileEx读取/写入升级/降级
- 5. 是否可以同时读写文件?
- 6. SSMA升级使表格只读吗?
- 7. 可以编程式化为只读/可读写吗?
- 8. 是否可以将vBulletin论坛从3.5升级到4.0版本?
- 9. GCM是否可以从Android 2.1升级到Android 4.0
- 10. 是否可以从KISSmetrics读取房产?
- 11. 是否可以从stdout读取?
- 12. 休眠升级后不能写只读对象
- 13. 是否可以将ComboBox ItemsSource绑定到只读字符串[]?
- 14. 是否可以使用JAVA从文件中读取/写入位?
- 15. 是否可以从Azure ServiceConfiguration文件读取IIS重写规则?
- 16. 从FileStream读取两次
- 17. 从aspx页面读取FileStream
- 18. SharedPreferences是否是只读的?
- 19. 我应该处理只读的FileStream
- 20. SQLiteException:不能只读从版本X数据库升级为Y
- 21. android.database.sqlite.SQLiteException:不能从0版本升级只读数据库1
- 22. 是否可以从VB6读取/写入用C#编写的类/结构?
- 23. 是否可以从URL读取到System.IO.Stream对象?
- 24. 是否有emacs只读cline?
- 25. 是否可以访问FILESTREAM共享?
- 26. 是否可以在FileStream中设置BufferSize?
- 27. 重写抽象只读属性以读取/写入属性
- 28. 是否可以将贴纸包升级到iMessage应用程序?
- 29. Android SQLiteAssetHelper无法将只读数据库从版本1升级到2:
- 30. SQLiteException:无法将只读数据库从版本1升级到2
这就是我在想的,但是担心FileStream会重新排列数据,并且两者会失去同步。我还担心使用互操作将需要比可用更高的权限。我会试一试。 – 2010-07-22 17:07:53
这工作。谢谢!在最内层的using语句之后,我添加了以下代码以证明FileStream(fs)和TextReader(tr)仍然可以重用: //寻找开头并尝试再次读取 fs.Seek(0,SeekOrigin.Begin) ; Console.WriteLine(“*** Reading Again ***”); Console.WriteLine(tr.ReadToEnd()); 谢谢 – 2010-07-24 23:02:47