Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于我正在浏览文件夹,Directory.Move是否会失败?_C#_Sql Server_Sqlclr - Fatal编程技术网

C# 由于我正在浏览文件夹,Directory.Move是否会失败?

C# 由于我正在浏览文件夹,Directory.Move是否会失败?,c#,sql-server,sqlclr,C#,Sql Server,Sqlclr,我在远程文件共享中有两个文件夹,我正在尝试将第一个文件夹移动到第二个文件夹中。为了做到这一点,我编写了一个CLR,它主要完成以下功能: if (Directory.Exists(destinationFolder)) { Directory.Delete(destinationFolder, true); } if (Directory.Exists(sourceFolder)) { Directory.Move(sourceFolder, destinationFolder)

我在远程文件共享中有两个文件夹,我正在尝试将第一个文件夹移动到第二个文件夹中。为了做到这一点,我编写了一个CLR,它主要完成以下功能:

if (Directory.Exists(destinationFolder))
{
    Directory.Delete(destinationFolder, true);
}

if (Directory.Exists(sourceFolder))
{
    Directory.Move(sourceFolder, destinationFolder);
}
这与预期一样有效,但在某些情况下,我会出现以下错误:

System.IO.IOException:当文件已存在时,无法创建该文件。 System.IO.IOException:at System.IO.\u Error.WinIOError(Int32 errorCode,String maybeFullPath)at System.IO.Directory.InternalMove(String sourceDirName,String destDirName,Boolean checkHost)

我无法缩小范围。它对我来说似乎是随机的,因为我无法复制它。我运行了这个代码块,超过50次,我不能得到与以前相同的错误(或者说实话,任何错误)。 -你看到代码有什么问题吗? -您是否有任何“猜测”可能导致此错误的原因

我唯一能想到的是,即使
Directory.Delete(destinationFolder,true)
return系统不会立即删除目录,因此当
directory.Move(sourceFolder,destinationFolder)时运行时,
destinationFolder
仍然存在

(2016年12月29日)这不是一个复制品。在那里,用户的代码中有一个“错误”,并创建(Directory.CreateDirectory(destinationdirectory);)目标文件夹。我没有创建目标文件夹,但是,如果存在,我将删除它。我查看了评论和答案,但没有一个能解决我的问题


(30/12/2016)我尝试了评论和答案中的所有建议,但仍然没有奇怪的事情发生。没有错误,也没有意外行为。

根据MSDN,在以下情况下,您将得到该异常:

  • 试图将目录移动到其他卷
  • 名称已存在
  • sourceDirName和destDirName参数引用相同的文件或目录
  • 另一个进程正在使用目录或其中的文件
你必须检查上面的一些案例,肯定会有解决方案

我能想到的唯一一件事就是即使
Directory.Delete(destinationFolder,true)
return系统不会立即删除目录,因此当
directory.Move(sourceFolder,destinationFolder)时运行时,
destinationFolder
仍然存在

我非常怀疑这是任何问题的原因。我认为这不是不可能的,特别是因为这是另一个系统(远程文件共享)上的一个文件夹,而不是本地的,但我仍然希望远程系统上进行的任何写后缓存对任何文件系统请求都是完全透明的,而不仅仅是其中的一些请求

考虑到问题中显示的代码,我认为更有可能的情况是,您在几乎完全相同的时间启动了两个线程,并遇到了一个争用条件,其中两个线程试图同时处理移动操作。通过对代码进行以下更改,您既可以检测到这种情况,也可以避免任何错误:

string\u LogFile=string.Concat(@“C:\TEMP\SQLCLR\ux”,Guid.NewGuid(),“.log”);
AppendAllText(_LogFile,@“正在为“+sourceFolder”启动操作+
@“-->”+destinationFolder);
if(Directory.Exists(destinationFolder))
{
文件.AppendAllText(_LogFile,@“Deleting:+destinationFolder);
Directory.Delete(destinationFolder,true);
}
if(Directory.Exists(sourceFolder))
{
如果(!Directory.Exists(destinationFolder))
{
AppendAllText(_LogFile,@“Moving:+sourceFolder);
Directory.Move(sourceFolder,destinationFolder);
}
其他的
{
AppendAllText(_日志文件,@“Oops.+destinationFolder+
@“已经存在了,真奇怪!”;
}
}
这将把操作记录到一个文本文件中。它将准确地指出正在采取哪些步骤。它还将在调用“move”之前检查目的地是否存在,这是当前未检查的内容

如果有两个相互竞争的线程,您将得到两个日志文件,因为它们是使用GUID命名的


如果,不知何故,这实际上是远程操作系统上的延迟删除问题,这将由单个日志文件指示,其中包含一行“删除…”,然后一行“移动…”。或者,如果“存在”复选框看到尚未删除的目标,那么您将看到一行“Oops”。

链接帖子中@Nino的可能重复项,用户的代码中有一个“错误”,并创建(
目录.CreateDirectory(destinationdirectory);
)目标文件夹。我不创建目标文件夹,但是,如果存在,我将删除它。这是相同的例外。“当文件已存在时,无法创建该文件。”。将代码放入try-catch块并调试它。当它落入catch块时,检查sourceFolder和destinationFolder变量。@Nino,我已经试过了,正如我所说,我无法重现这个。当我遇到断点时,文件夹已经被删除,代码继续执行,不会出现错误。如果您误解了我的意思,请在异常已经发生时,将断点放在catch块中。这是太少的代码,我无法给你写一个答案,我只是想帮你提一些建议。不确定的是,我认为有一个不同的消息“目录或其中的文件正被另一个进程使用。”。我在某处见过它,但我找不到它的来源。尽管如此,可能访问该文件夹的唯一进程(据我所知)是Windows资源管理器。然而,我试图重现这一点,我没有得到任何错误。删除/移动文件夹时,资源管理器窗口仅自行刷新。可能是防病毒问题?。使用process explorer查找它