2010-07-22 60 views

回答

1

你在这里。使用一点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); 
+0

这就是我在想的,但是担心FileStream会重新排列数据,并且两者会失去同步。我还担心使用互操作将需要比可用更高的权限。我会试一试。 – 2010-07-22 17:07:53

+0

这工作。谢谢!在最内层的using语句之后,我添加了以下代码以证明FileStream(fs)和TextReader(tr)仍然可以重用: //寻找开头并尝试再次读取 fs.Seek(0,SeekOrigin.Begin) ; Console.WriteLine(“*** Reading Again ***”); Console.WriteLine(tr.ReadToEnd()); 谢谢 – 2010-07-24 23:02:47

0

你不能。

为什么你首先打开它只读?你为什么不打开一个新的FileStream?只要FileShare设置正确,您甚至不必关闭旧的。

+0

它关于使用最少量的权限进行操作。有些用户不具有写入权限,而其他用户则可以。由于所有需要阅读,我可以在只读模式下打开。当需要写入的少数人尝试时,我可以检查CanWrite属性,然后仅升级该操作。打开另一个流将导致相同数据的两个视图,只有权限不同。这意味着我还必须维护这两个流,并在整个系统中添加逻辑,或者构建一个类以包含具有不同权限的两个流。 – 2010-07-22 16:07:08

+0

还有一点,操作系统支持这一点。这个限制纯粹是在.NET BCL中。请参阅ReOpenFile(http://msdn.microsoft.com/zh-cn/library/aa365497(VS.85).aspx)。 – 2010-07-22 16:12:06

+0

您可以从流类开发自己的类,它可以通过在内部维护多个流来在读和写模式之间切换。这样你就可以将这个细节抽象出来。 – codymanix 2010-07-23 10:49:35

相关问题