在 C# 中移动文件

Posted

技术标签:

【中文标题】在 C# 中移动文件【英文标题】:Move files in C# 【发布时间】:2012-11-17 07:14:40 【问题描述】:

我正在将一些图像(文件名是(1).PNG(2).PNG 等等)从一个目录移动到另一个目录。我正在使用以下代码:

for (int i = 1; i < n; i++)

    try
    
        from = "E:\\vid\\(" + i + ").PNG";
        to = "E:\\ConvertedFiles\\" + i + ".png";
        File.Move(from, to); // Try to move
        Console.WriteLine("Moved"); // Success
    
    catch (IOException ex)
    
        Console.WriteLine(ex); // Write error
    

但是,我收到以下错误:

System.IO.FileNotFoundException 类型的第一次机会异常发生在 mscorlib.dll 中

System.IO.FileNotFoundException: Could not find file 'E:\vid\(1).PNG'.

另外,我打算重命名文件,以便转换后的文件名为00001.png00002.png、...00101.png 等等。

【问题讨论】:

愚蠢的问题,但你确定“E:\vid(1).PNG”存在吗? Could not find file 'E:\vid(1).PNG' 但您的代码显示 E:\\vid\\(1).png - 所以这里某处缺少斜线,不是吗? 出了点问题:您的代码需要将文件命名为(_num_).png 并位于E:\vid 目录中。错误消息表明您试图在 `E:\` 目录中“查找”文件 vid(_num_).png。所以错误信息和代码不匹配。请确保您发布了匹配的实际代码和错误消息。 上面的代码有问题吗?您尝试移动的文件在文件夹E:\vid 内命名为(1).png,而不是E:\vid(1).png。哪个是正确的? 【参考方案1】:

异常意味着文件E:\vid(1).PNG 不存在。你的意思是E:\vid1.PNG

使用System.IO.Path 类来构建路径,它比连接字符串更好。您不必担心转义反斜杠。

【讨论】:

【参考方案2】:
i.ToString()

可能会帮助你。你路过

from = "E:\\vid\\(" + i + ").PNG";
to = "E:\\ConvertedFiles\\" + i + ".png";

I 作为整数,因此连接不起作用 而不是使用\\,而是像这样添加@

from = @"E:\vid\(" + i + ").PNG";

【讨论】:

ToString() 在与字符串连接时被隐式调用。如果这是问题所在,他的代码甚至无法编译。【参考方案3】:

我建议您使用'@' 以便以更易读的方式转义斜杠。也可以使用Path.Combine(...) 来连接路径,使用PadLeft 来将您的文件名作为您的具体信息。

for (int i = 1; i < n; i++)

    try
    
        from = System.IO.Path.Combine(@"E:\vid\","(" + i.ToString() + ").PNG");
        to = System.IO.Path.Combine(@"E:\ConvertedFiles\",i.ToString().PadLeft(6,'0') + ".png");

        File.Move(from, to); // Try to move
        Console.WriteLine("Moved"); // Success
    
    catch (IOException ex)
    
        Console.WriteLine(ex); // Write error
    

【讨论】:

【参考方案4】:

你为什么不使用这样的东西?

var folder = new DirectoryInfo(@"E:\vid\"));

if (folder.Exists)

    var files = folder.GetFiles(".png");
    files.toList().ForEach(f=>File.Move(from,to));

【讨论】:

【参考方案5】:

我刚刚在 Visual Studio 中运行了这个。它奏效了。

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ConsoleApplication2



    class Program
    
        static void Main()
        
            int n = 3;
            for (int i = 1; i < n; i++)
            
                string from = "C:\\vid\\(" + i + ").PNG";
                string to = "C:\\ConvertedFiles\\" + i + ".png";
                
                    try
                    
                        File.Move(from, to); // Try to move
                        Console.WriteLine("Moved"); // Success
                    
                    catch (System.IO.FileNotFoundException e)
                    
                        Console.WriteLine(e); // Write error
                    
                
            
        
    


也许当你将文件移动到 vid 目录开始测试时,windows 去掉了括号。 (1).png 变为 1.png...我从该现象中得到了一个文件未找到错误...否则,您的代码是可靠的。我的版本几乎相同。

【讨论】:

【参考方案6】:
var folder = new DirectoryInfo(sourcefolder);

if (folder.Exists)

    var files = folder.GetFiles("*.png");
    files.ToList().ForEach(f => File.Move(sourcefolder + f, newFolderName + f));

我相信这会有所帮助。

【讨论】:

以上是关于在 C# 中移动文件的主要内容,如果未能解决你的问题,请参考以下文章

移动当前可执行文件 c#

(65)C#里拷贝文件移动文件和删除文件

(65)C#里拷贝文件移动文件和删除文件

C# 中移动文件到指定位置

C#中移动文件时出现中文路径怎么解决

将文件从一个文件夹移动到另一个 C#