none
关于文件同时读写问题 RRS feed

  • 问题

  • 大家好。最近本人希望实现类似下面这样的功能:

    通过网络将接收到的文件数据包经处理后写入本地文件,并当写到一定数据的时候,另一应用程序(如播放器)尝试打开还正在写的本地文件。这里出现的问题是,本人通过FileStream来完成数据的写入,且设置了FileShare为ReadWrite,但另一应用程序就是无法打开该文件(当然若该本地文件被正常Close后,即使文件不完整也是可以打开的)。请问有和办法解决共享读问题?

    另外,本人查阅了MSDN,关于FileShare.ReadWrite,提到“允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。”这里提到的“仍可能需要附加权限才能够访问该文件”的这个附加权限是如何做的?

    期待了解该问题的朋友的解答。谢谢!

    2010年9月19日 4:47

答案

  • 大家好。最近本人希望实现类似下面这样的功能:

    通过网络将接收到的文件数据包经处理后写入本地文件,并当写到一定数据的时候,另一应用程序(如播放器)尝试打开还正在写的本地文件。这里出现的问题是,本人通过FileStream来完成数据的写入,且设置了FileShare为ReadWrite,但另一应用程序就是无法打开该文件(当然若该本地文件被正常Close后,即使文件不完整也是可以打开的)。请问有和办法解决共享读问题?

    另外,本人查阅了MSDN,关于FileShare.ReadWrite,提到“允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。”这里提到的“仍可能需要附加权限才能够访问该文件”的这个附加权限是如何做的?

    期待了解该问题的朋友的解答。谢谢!


    我尝试过提供FileAccessRights为读取程序赋予权限,虽然文件打开了,但是却无法读取。

    FileStream fs = new FileStream("C:\\test.txt",
                    FileMode.Open,
                    System.Security.AccessControl.FileSystemRights.ReadPermissions,
                    FileShare.Read,1,FileOptions.None);

    经过MSDN一番查找,找到一个使用SafeFileHandle的例子,但我没尝试,不知是否可行,你可以试试看:

    ms-help://MS.MSDNQTR.v90.chs/fxref_mscorlib/html/0f21089b-e73b-2055-aae1-6217b12e53fb.htm

     

    另外,如果跨进程的这种数据共享,我觉得FileMapping更加适合你的场景,

    负责写入的调用CreateFileMapping API去创建文件映射,负责读取的使用OpenFileMapping 去打开并读取,

    使用FileMapping的方式是进程间通讯的传统做法,尤其适合你这种流式的数据而且量比较大的。

    • 已标记为答案 hxinf 2010年9月20日 5:08
    2010年9月20日 2:44

全部回复

  • 大家好。最近本人希望实现类似下面这样的功能:

    通过网络将接收到的文件数据包经处理后写入本地文件,并当写到一定数据的时候,另一应用程序(如播放器)尝试打开还正在写的本地文件。这里出现的问题是,本人通过FileStream来完成数据的写入,且设置了FileShare为ReadWrite,但另一应用程序就是无法打开该文件(当然若该本地文件被正常Close后,即使文件不完整也是可以打开的)。请问有和办法解决共享读问题?

    另外,本人查阅了MSDN,关于FileShare.ReadWrite,提到“允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。”这里提到的“仍可能需要附加权限才能够访问该文件”的这个附加权限是如何做的?

    期待了解该问题的朋友的解答。谢谢!


    我尝试过提供FileAccessRights为读取程序赋予权限,虽然文件打开了,但是却无法读取。

    FileStream fs = new FileStream("C:\\test.txt",
                    FileMode.Open,
                    System.Security.AccessControl.FileSystemRights.ReadPermissions,
                    FileShare.Read,1,FileOptions.None);

    经过MSDN一番查找,找到一个使用SafeFileHandle的例子,但我没尝试,不知是否可行,你可以试试看:

    ms-help://MS.MSDNQTR.v90.chs/fxref_mscorlib/html/0f21089b-e73b-2055-aae1-6217b12e53fb.htm

     

    另外,如果跨进程的这种数据共享,我觉得FileMapping更加适合你的场景,

    负责写入的调用CreateFileMapping API去创建文件映射,负责读取的使用OpenFileMapping 去打开并读取,

    使用FileMapping的方式是进程间通讯的传统做法,尤其适合你这种流式的数据而且量比较大的。

    • 已标记为答案 hxinf 2010年9月20日 5:08
    2010年9月20日 2:44
  • 你的建议非常好,我先去尝试一下你所提到的第一种解决方案,若不行的话就使用FileMapping。
    2010年9月20日 4:35
  • file mapping 在net 4•0已经原声支持
    入了ipad,最近用ipad上论坛
    2010年9月20日 5:00