这有点棘手,希望我可以深入了解Directory.Move函数中构建的C#是如何工作的(或应该工作)。我编写了一个程序,它将一个比特定日期更早的文件夹名称列表放入DirectoryInfo列表中,并将其迭代到其他位置。
foreach (DirectoryInfo temp in toBeDeleted)
{
filecheck.WriteLine(temp.Name);
Directory.Move(temp.FullName, @"T:\Transactiondeletions\" + counter + "\\" + temp.Name);
}
其中temp.Fullname类似于T:\ UK \ DATA \ 386 \ trans \ 12345678.16
T:在这种情况下类似于10.11.12.13 \ Data2 $ 我有另一个映射驱动器,U:,它与10.11.12.13 \ Data3 $在同一个IP上,并且具有完全相同的目录结构。
踢球者是我的程序在U盘上工作得很好但在T盘上没有。我已经尝试将代码中的驱动器号作为IP的实际完整路径,它在U盘上仍能正常工作,但在T盘上却没有。
在我的程序试图移动文件夹时,在T驱动器上,它会命中“拒绝访问”。
然而,在以下情况下它可以正常工作:
有什么想法吗?即使我可以手动移动文件,我也无法弄清楚为什么它不能在这里工作,我已尝试手动运行.exe以及作为管理员和同事,但结果是相同。
我认为它可能与正在打开的流式处理器(文件检查)有关,但是我已经尝试移动这部分代码,直到我关闭了该编写器但它遇到了相同的错误所以我被排除在外'那种可能性。
非常感谢任何建议,如果有必要,我很乐意提供更多必要的信息。
答案 0 :(得分:1)
我仍然无法解决Directory.Move操作无法正常工作的问题。但是我已经能够通过进入目录并使用File.Move将所有文件移动到其他位置,然后使用Directory.Delete删除原始目录来解决此问题。出于某种原因,它的工作原理如下。但它会这样做!
答案 1 :(得分:0)
此异常可能有两个原因。首先-文件被不同的进程(例如Windows资源管理器等)锁定。这是合法的例外,您必须相应地对其进行处理。其次-文件是由相同的进程和相同的进程锁定的,在这里我是指文件的任何线程。我认为这是Microsoft的错误,引发与第一种情况相同的异常。如果您更深入地看,它可以进一步分支:同一进程可能在另一个线程中打开了另一个流等,或者可以由当前线程调用Move来保留。在第一个分支中,我仍然想要更详尽的异常,在第二个分支中,问题出在Windows内核中。长话短说:操作系统似乎没有足够的时间来释放IO锁,即使在先前的文件/文件夹操作之后是同一线程也是如此。
为了验证我的主张,请查看.NET源代码中的System.IO.Directory.InternalMove方法。在该方法的末尾,有一个对Win32Native.MoveFile的调用,该调用是该异常的来源。在这里,您有此注释//此检查最初是为Win9x进行的。该检查显示了Microsoft专业开发人员的状况,并且没有针对此问题的可行解决方案。
我对此有几种解决方法:1.不要使用Move,而要使用Copy + Delete源。 2.将Move调用包装到IO Utility方法中,该方法将包含do while循环遍历包含Move调用的try catch块。记住,我们只是在解决一个错误,我们认为同一线程(或同一进程)持有该锁,因此如果文件被另一个进程持有,我们需要在一定数量的Thread.Sleep(x)调用之后指定超时退出条件。 / p>