0 0

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

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

问题补充:
chen_yongkai 写道
做完移动,再检查一下源目录的文件是否存在,如果有再做一步删除文件
那么这是不是bug呢,或者这只是个巧合。

问题补充:
chen_yongkai 写道
引用
那么这是不是bug呢,或者这只是个巧合。

可能是删除的时候,文件正好被进程占用,所以删除失败;
这个在并发访问是会发生,可以不算bug

哦,谢谢。还有个问题,C#的Move方法对同一磁盘的文件移动也是先copy再delete吗?不是直接rename?  在PC上直接对文件操作我记得是同一磁盘的不用copy再delete啊。 

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

哦,我的那两个参数文件名是不一样的,也就是说它会先复制了?  

问题补充:
chen_yongkai 写道
我的那两个参数文件名是不一样的,也就是说它会先复制了?

路径一样吗?如果父目录一样,这种情况应该也是重命名,也没深入研究过。如果根目录(分区)不一样,肯定就是复制了

一个是D:/company/,目标文件是D:/company/back/check/

问题补充:
chen_yongkai 写道
我的那两个参数文件名是不一样的,也就是说它会先复制了?

路径一样吗?如果父目录一样,这种情况应该也是重命名,也没深入研究过。如果根目录(分区)不一样,肯定就是复制了

对了,如果文件被占用而导致没有删除,怎么不会报错呢?奇怪  

问题补充:
chen_yongkai 写道
引用
一个是D:/company/,目标文件是D:/company/back/check/

是同一个分区的,大概只是重命名,不用复制。可以查看一下你的应用的进程的IO情况,如果IO的读写量很大,就说明有复制

这都N天前的问题了,log也没有,信息基本都没了,只知道个结果,就靠猜的。
2011年10月12日 13:34

6个答案 按时间排序 按投票排序

0 0

采纳的答案

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


异常 条件
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 的格式无效。


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

2011年10月13日 11:18
0 0

引用
一个是D:/company/,目标文件是D:/company/back/check/

是同一个分区的,大概只是重命名,不用复制。可以查看一下你的应用的进程的IO情况,如果IO的读写量很大,就说明有复制

2011年10月13日 11:14
0 0

我的那两个参数文件名是不一样的,也就是说它会先复制了?

路径一样吗?如果父目录一样,这种情况应该也是重命名,也没深入研究过。如果根目录(分区)不一样,肯定就是复制了

2011年10月13日 11:00
0 0

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

2011年10月13日 10:49
0 0

引用
那么这是不是bug呢,或者这只是个巧合。

可能是删除的时候,文件正好被进程占用,所以删除失败;
这个在并发访问是会发生,可以不算bug

2011年10月13日 10:28
0 0

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

2011年10月12日 15:20

相关推荐

    C# 怎么移动文件

    `File.Move()`方法有两个参数: 1. `fileName`:这是源文件的完整路径,包括文件名和扩展名。你需要确保该文件存在,否则会抛出一个`FileNotFoundException`异常。 2. `desFileName`:这是目标文件的新位置,同样...

    C# File文件操作

    在C#编程语言中,File类是System.IO命名空间下的一个关键组件,它提供了大量用于读写、创建、移动和删除文件的静态方法。在这个"集合篇"中,我们将深入探讨C#中File类的各种操作,并通过源码分享来增强理解。 首先...

    Visual C# File类常用的文件操作方法

    ### Visual C# File类常用的文件操作方法 在.NET框架中,`System.IO`命名空间下的`File`类是一个非常重要的工具,它为开发者提供了多种静态方法来执行与文件相关的操作,如创建、复制、移动、删除文件等。下面将...

    C#_FILE操作

    - `File.Delete()`方法用于删除指定的文件,需要注意的是,如果文件被其他进程打开,删除可能会失败。 4. **文件复制和移动**: - `File.Copy()`方法用于复制文件,可以指定新的文件名和位置。 - `File.Move()`...

    C#文件基本操作.zip

    `File.Move`方法可以将文件从一个位置移动到另一个位置: ```csharp File.Move("原位置文件.txt", "新位置文件.txt"); ``` 6. **文件删除** 使用`File.Delete`删除文件: ```csharp if (File.Exists("待删除...

    c#文件操作方法大全

    6. **移动和重命名文件**:`File.Move`方法可以实现文件的移动或重命名。例如: ```csharp File.Move("原文件路径", "新文件路径"); ``` 7. **复制文件**:`File.Copy`方法可以用来复制文件。例如: ```csharp File...

    C#实现对指定类型文件的批量移动(源代码)

    通过遍历这些文件,对每个文件检查其扩展名,如果扩展名为".mp3",就使用File.Move方法将其移动到目标文件夹。在整个过程中,注意捕获可能出现的异常,以确保程序的健壮性。 为了实现更通用的功能,可以将上述代码...

    C#复制和移动文件程序

    对于移动文件,C#提供了`File.Move`方法,用法与`File.Copy`类似。移动文件后,源文件将被删除。 ```csharp string oldLocation = "C:\\OldFile.txt"; string newLocation = "C:\\NewFile.txt"; File.Move...

    c#文件的基本操作,打开,保存,删除,复制,移动

    使用`File.Delete`方法可以删除文件,但需要注意的是,如果文件被其他进程使用,删除可能会失败: ```csharp File.Delete("filePath.txt"); ``` 以上是C#中对文件进行基本操作的方法。在实际开发中,还需要考虑到...

    C#源代码-File类的操作.zip

    `File.Move`方法可以将文件从一个位置移动到另一个位置,相当于重命名文件并移动到新的目录。 6. **检查文件属性**: - `File.Exists`:检查文件是否存在。 - `File.GetAttributes`:获取文件的属性,如只读、...

    C#文件读写常用类介绍

    `File.Move()`方法用于将文件从一个位置移动到另一个位置。它同样接受两个参数:源文件名和目标文件名。例如: ```csharp File.Move(@"c:\temp\uploads\BackUp.txt", @"c:\BackUp.txt"); ``` 需要注意的是,这个...

    C#文件夹的移动

    2. 锁定:如果源文件夹或其中的文件被其他进程锁定,移动可能会失败。 3. 大文件和网络延迟:对于大型文件夹或网络驱动器上的文件夹,移动可能需要较长时间,并可能导致性能问题。 4. 异步操作:为了提高用户体验,...

    C# 文件处理技术

    Directory类的常用方法有: 1. CreateDirectory:创建新的目录。 2. Delete:删除目录,可选参数决定是否删除非空目录。 3. Move:移动目录。 4. GetFiles/GetDirectories:获取指定目录下的所有文件或子目录。 在...

    C#文件夹创建、移动、删除

    在C#中,可以使用`File.Create`方法创建一个新的文件,但是这种方式在某些情况下可能会出现问题,例如当尝试复制或移动文件时可能会出现“文件正在被另一个进程使用”的错误提示。为了避免这个问题,建议使用`...

    WindowsFile.rar

    - **移动文件**:`Move`方法可以将文件从一个位置移动到另一个位置,相当于重命名文件。 2. `File` 类高级操作: - **读写流**:`FileStream`类与`File`类结合,提供对文件的流式读写,适用于大数据处理。 - **...

    C#代码动态移动文本文件

    `File.Move()`方法会尝试移动文件,如果操作成功,控制台将输出“文本文件已成功移动.”;如果过程中出现异常,如权限问题或文件正在被使用,捕获的异常信息将在控制台显示。 在实际应用中,我们可能需要处理更多的...

    C# 对文件的创建,移动,复制,删除操作

    要移动文件,可以使用`File.Move`方法。它接受源文件的路径和目标文件的路径作为参数。移动文件会将源文件重命名为目标文件,并删除原文件。例如: ```csharp string sourcePath = @"C:\Temp\OldFile.txt"; string ...

    C#中常用的经典文件操作方法

    如果需要移动文件(即更改文件位置),可以使用`File.Move`方法: ```csharp string originalFile = Server.MapPath(".") + "\\myText.txt"; string newFile = Server.MapPath(".") + "\\myTextCopy.txt"; // 移动...

    C#文件操作方法归纳

    `File.Move`方法用于移动文件,它会将源文件重命名为目标文件的路径。 ```csharp string OrignFile, NewFile; OrignFile = Server.MapPath(".") + "\\myText.txt"; NewFile = Server.MapPath(".") + "\\...

    C#关于文件操作的代码.rar

    - `File.Copy()`和`File.Move()`方法用于复制和移动文件,`Directory.Move()`用于移动目录。 10. **文件路径处理**: - `Path`类提供了一系列静态方法,如`Path.Combine()`用于构建合法的文件或目录路径,`Path....

Global site tag (gtag.js) - Google Analytics