【问题标题】:C# while copying a file, allow another process to exclusively lock the file?C# 在复制文件时,允许另一个进程以独占方式锁定文件?
【发布时间】:2012-06-23 11:24:19
【问题描述】:

我目前正在复制 oracle server 的存档文件,我正在阻止发生的情况是,当我复制文件服务器时,它会在尝试更新文件时出错。

一开始我试过

File.Copy(source, Destination, true);

但似乎这种方法正在锁定文件,服务器在日志中抛出错误:

OSD-04002: unable to open file
O/S-Error: (OS 32) The process cannot access the file because it is being used by another process.

我把方法改成

FileStream rStream = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

但是当我尝试使用带有 FileShare 的测试程序打开文件时。现在它也抛出一个错误,另一个进程正在锁定文件。

一旦另一个进程想要访问/写入文件,是否可以放手或释放文件?

【问题讨论】:

    标签: c# file copy readonly fileshare


    【解决方案1】:

    怎么样

    var stream = System.IO.File.Open(
                     source, System.IO.FileMode.Open, System.IO.FileAccess.Read
                 );
    

    这会锁定文件吗?

    最好的解决方案是使用 VSS 来防止锁定(你的服务器是一个 windows 盒子,对吗?)

    • 创建快照
    • 从快照复制文件
    • 删除快照

    您可以使用 .NET 自动执行此操作

    http://www.codeproject.com/Articles/22745/Volume-Shadow-Copies-from-NET

    【讨论】:

    • 是的,我尝试了您发布的代码,但它仍然锁定文件,将尝试 VSS(但它有点复杂)在想也许还有另一种解决方案。顺便说一句,我在创建和修改文件时使用 filewatcher,然后在更新后复制。
    • 另外,filewatcher 和复制程序也在不同的服务器上运行。来自 oracle 服务器的存档文件只是一个只读的映射驱动器。我可以在另一台服务器的地图驱动器上运行 vss 吗?我想我需要详细阅读。
    • 这可能是一个很好的起点technet.microsoft.com/en-us/library/ee923636.aspx 查看链接“共享文件夹的影子副本”,我没有进一步阅读,但这听起来很有希望。任何你可以使用 WMI,我想它也可以在远程服务器上工作:technet.microsoft.com/en-us/library/cc787108(v=ws.10).aspx
    • 非常感谢 SchlaWiener 的大力帮助,到目前为止 FileShare.ReadWrite 正在处理 oracle 存档文件。即使我的程序正在读取它(按字节复制),它也不会阻止在文件上写入,现在已经监控了几天,如果肯定出现问题,我会去 VSS 解决方案。我认为这很接近。
    猜你喜欢
    • 2021-03-19
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多