通过网络共享在文件上写入文件

Posted

技术标签:

【中文标题】通过网络共享在文件上写入文件【英文标题】:WriteFile on a file over a network share 【发布时间】:2011-07-22 18:30:36 【问题描述】:

我有一个读写大数据的程序。当写入本地驱动器上的文件时,读取和写入效果很好。当目标是网络共享时,当我运行同一程序的两个实例时,第一个启动的程序挂在 WriteFile 上。当我调试时,网络共享上的 WriteFile 被阻塞。

我使用 WaitForSingleObject(超时 60 秒)在 WriteFile 上实现了重叠 IO。现在,WriteFile 不再阻塞,但即使整个数据通过网络写入一次也不会阻塞。当我通过网络共享使用 WriteFile 时是否必须考虑重试?如何通过网络对文件正确使用 WriteFile?

更新:

我参考了下面的链接,用 WriteFile 实现了重叠 IO。

http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/a5e9514b-53e0-410c-a975-41a5ca91e4be

链接说我只使用了带有 GENERIC_WRITE 的 CreateFile 而没有 GENERIC_READ。但是,如果我还想从文件中读取呢?这是否意味着我根本无法为 WriteFile 实现异步 io。实际上,在使用 Overlapped IO 写入文件之前,我必须从同一个文件中读取标题。我该怎么做??

【问题讨论】:

【参考方案1】:

您使用重叠 IO 的方法是正确的。但是你一口气写了多少数据? WriteFile 要么成功要么失败,不需要实现重试。但是,您可以部分写入数据,而不是整体写入。

您提到您正在使用文件共享,这意味着您正在写入文件。为什么不使用 CopyFile 代替;还是将所有数据复制到文件中并通过网络发送?

【讨论】:

readfile 将数据异步读取到缓冲区,并将缓冲区传递给 writefile。这是针对速度优化的原始文件 IO。问题仅在于我尝试将数据写入网络共享时。在这种情况下重试有意义吗? 我想我得到了这个问题的答案。一个 MSDN 论坛链接说带有 GENERIC_READ|GENERIC_WRITE 标志的 CreateFile 将与 WriteFile 函数同步运行。但是如果我在 CreateFile 中只使用 GENERIC_WRITE,当网络连接断开时,WriteFile 将返回网络错误。将测试并确认相同。

以上是关于通过网络共享在文件上写入文件的主要内容,如果未能解决你的问题,请参考以下文章

PHP 无法将上传的文件移动(写入)到挂载的网络驱动器

File.Copy() 从网络共享到同一台机器上的另一个共享是不是通过网络复制文件?

在 C# Web 应用程序中从网络共享访问文件

网络文件共享服务

共享文件夹设置,在同一局域网内连接

NFS网络文件共享存储服务器