当文件位于本地时,以下代码有效。
<!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文档没有提到共享目录吗?
答案 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的文件系统上,则可能无法使其正常工作。)