File.Replace在共享驱动程序上不起作用?

时间:2019-11-27 03:42:12

标签: c#

当文件位于本地时,以下代码有效。

            <!DOCTYPE html>
            <html>
            <head>
            <script>
            function startTime() {
              var today = new Date();
              var h = today.getHours();
              var m = today.getMinutes();
              var s = today.getSeconds();
              m = checkTime(m);
              s = checkTime(s);
              document.getElementById('txt').innerHTML =
              h + ":" + m + ":" + s;
              var t = setTimeout(startTime, 500);  //<----  !!!
            }
            function checkTime(i) {
              if (i < 10) {i = "0" + i};  // add zero in front of numbers < 10
              return i;
            }
            </script>
            </head>

            <body onload="startTime()">

            <div id="txt"></div>

            </body>
            </html>

但是,如果文件位于共享驱动器上,则会出现“拒绝访问路径”的异常。

var tmp = @"c:\dir\tmp.txt";
var target = @"c:\dir\target.txt";
var backup = @"c:\dir\backup10.txt";
File.Replace(tmp, target, backup);

File.Replace文档没有提到共享目录吗?

1 个答案:

答案 0 :(得分:2)

这是否适用于网络共享取决于共享。但是,看看.NET调用的基础本机Win32 API ReplaceFile() function很有启发性。

需要特别注意的是正确处理调用中指定的每个文件所需的访问权限。例如:

  

lpReplacementFileName

     

将替换 lpReplacedFileName 文件的文件名。

     

...

     

该函数尝试使用 SYNCHRONIZE GENERIC_READ GENERIC_WRITE Delete 和< strong> WRITE_DAC 访问权限,以便它可以保留所有属性和ACL。如果失败,该函数将尝试使用 SYNCHRONIZE GENERIC_READ Delete WRITE_DAC 访问打开文件权利。没有指定共享模式。

这些权利中的任何一项都可能有问题,具体取决于份额。但是对于您而言,我认为您正在使用 WRITE_DAC 访问权限。

正如您在上面的评论中确认的那样,当您通过ignoreMetadataErrors: true时,呼叫成功。这意味着调用基础ReplaceFile()函数时,会传递 REPLACEFILE_IGNORE_MERGE_ERRORS 标志(请参见Microsoft源代码站点https://referencesource.microsoft.com/#mscorlib/system/io/file.cs,d4b8da02b41f19a4上的实际调用),从而导致涉及 WRITE_DAC 的错误将被忽略。

由于我们无权访问您的共享,因此无法确定。但是我想把钱花在甜甜圈上,因为在您的情况下,您没有共享上的WRITE_DAC访问权限,因此调用失败。

只要您不介意不复制ACL和其他文件属性,答案就是将ignoreMetadataErrors: true传递给该方法。

如果您确实不介意那些东西没有被复制,那么您应该对异常表示感谢,该异常会提醒您以下事实:您尝试执行的操作不受支持,并且您需要更正您的配置。共享,以便它可以按您希望的方式工作(请注意,如果共享托管在不支持Windows样式ACL的文件系统上,则可能无法使其正常工作。)