C#目录。移动访问被拒绝错误

C#目录。移动访问被拒绝错误,c#,permissions,directory,move,C#,Permissions,Directory,Move,这是一个有点棘手的问题,希望我能对C#内置Directory.Move函数如何工作(或者应该如何工作)有所了解。我编写了一个程序,它将超过特定日期的文件夹名称列表放入DirectoryInfo列表中,并对其进行迭代以将文件夹移到其他位置 foreach (DirectoryInfo temp in toBeDeleted) { filecheck.WriteLine(temp.Name);

这是一个有点棘手的问题,希望我能对C#内置Directory.Move函数如何工作(或者应该如何工作)有所了解。我编写了一个程序,它将超过特定日期的文件夹名称列表放入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,但结果是一样的

    我认为这可能与streamwriter仍然处于打开状态(filecheck)有关,但我已经尝试将这部分代码移动到关闭streamwriter之后,但它遇到了相同的错误,因此我“排除”了这种可能性


    如有任何建议,我将不胜感激。如有必要,我将乐意提供更多所需信息。

    我仍然没有目录的解决方案。移动操作不起作用。但是,我已经能够通过进入目录并使用File.Move将所有文件移到其他位置,然后使用directory.Delete删除原始目录来解决这个问题。出于某种原因,它是这样工作的。但它会的

    此异常可能有两个原因。第一个-文件被不同的进程锁定,如Windows资源管理器等。这是合法的例外,您必须相应地处理它。第二个文件被同一进程锁定,这里我指的是它的任何线程。在我看来,这是微软的一个bug,它抛出了与第一个案例相同的异常。如果您看得更深,它可以进一步分支:同一进程可能在不同的线程中打开另一个流等,或者它可以由当前调用Move的线程持有。在第一个分支中,我仍然需要更详细的异常,在第二个分支中,问题根源于Windows内核。长话短说:操作系统似乎没有足够的时间来释放IO锁,即使是在之前的文件/文件夹操作之后由同一线程持有的IO锁

    为了验证我的声明,请查看.NET源代码中的System.IO.Directory.InternalMove方法。在该方法的末尾,有一个对Win32Native.MoveFile的调用,它是该异常的源。您有这样的评论//此检查最初是针对Win9x进行的。。这表明微软的开发人员是多么专业,对于这个问题没有可行的解决方案


    对此,我几乎没有什么变通办法:1。不要使用移动,而是使用复制+删除源。2.将Move调用包装到IO实用程序方法中,该方法将包含do while循环包含Move调用的try-catch块。请记住,我们只是在解决一个bug,我们认为同一个线程(或同一个进程)持有锁,因此我们需要在一定数量的线程之后指定超时退出条件。Sleep(x)如果文件被另一个进程持有,则调用。

    手动移动时,运行代码的标识是否与您的相同?我不知道如何编辑我的原始问题,因此在此处添加注释。我认为这可能与streamwriter仍处于打开状态(filecheck)有关,但我已经尝试移动这部分代码,直到我关闭streamwriter,但它遇到相同的错误,因此我排除了这种可能性。您只需单击标记
    c#,权限,目录下的
    edit
    按钮,移动
    。谢谢Equalsk,完全错过了@德拉提凯:据我所知,是的。我使用自己的用户帐户运行代码,并且我自己的用户帐户通过安全grp对共享驱动器具有修改权限,文件移动和目录移动是非常相同的代码。两者都使用Windows内核函数
    MoveFile
    。文件夹中是否有图片会生成锁定的Thumbs.db文件?