C#的File.move方法会不会有移动失败的情况?

在项目中碰到一个这样的bug,C#的发送文件的一个项目,功能是给指定的一些服务器ftp发送文件,然后发送成功的就移动到备份文件夹中.我调用的是File.Move(file_path, dest_path)方法来移动文件,file_path是原来所在的路径,dest_path是新路径,都在D盘下面,现在的情况是:项目运行的时候有一个文件xxx.txt,ftp发送成功后,移动到备份文件夹中,结果备份文件夹里有了这个xxx.txt文件,但原来的路径file_path下也还有这个文件。请问这是不是个bug,要怎么解决 这个项目一天要发送几万个文件,将近一个月才出现这一例情况。

[quote]如果文件被占用而导致没有删除,怎么不会报错呢?[/quote]

异常 条件
IOException 目标文件已经存在。

ArgumentNullException sourceFileName 或 destFileName 为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。

ArgumentException sourceFileName 或 destFileName 是零长度字符串、只包含空白或者包含在 GetInvalidPathChars 中定义的无效字符。

UnauthorizedAccessException 调用方没有所要求的权限。

FileNotFoundException 未找到 sourceFileName。

PathTooLongException 指定的路径、文件名或者两者都超出了系统定义的最大长度。例如,在基于 Windows 的平台上,路径必须小于 248 个字符,文件名必须小于 260 个字符。

DirectoryNotFoundException sourceFileName 或 destFileName 中指定的路径无效(例如,它位于未映射的驱动器上)。

NotSupportedException sourceFileName 或 destFileName 的格式无效。

异常中不包括这种情况,文件可以读共享(复制文件是读源文件),不能写共享(删除或者移动源文件,都是要文件锁吧),大概就这意思了

做完移动,再检查一下源目录的文件是否存在,如果有再做一步删除文件

[quote]那么这是不是bug呢,或者这只是个巧合。 [/quote]
可能是删除的时候,文件正好被进程占用,所以删除失败;
这个在并发访问是会发生,可以不算bug

windows同一分区的移动没错是不用复制再删除;
File.Move方法的两个参数,原文件名与目标文件名可以不一样,所以是复制;
Move应该是调用系统指令,跟系统上操作的效果是一样的吧

[code="java"]我的那两个参数文件名是不一样的,也就是说它会先复制了?[/code]
路径一样吗?如果父目录一样,这种情况应该也是重命名,也没深入研究过。如果根目录(分区)不一样,肯定就是复制了

[quote]一个是D:/company/,目标文件是D:/company/back/check/ [/quote]
是同一个分区的,大概只是重命名,不用复制。可以查看一下你的应用的进程的IO情况,如果IO的读写量很大,就说明有复制