【问题标题】:C# Copy file or folderC#复制文件或文件夹
【发布时间】:2015-08-19 06:57:13
【问题描述】:

我正在尝试编写一个程序来保持多个文件夹同步。为此,我需要复制和删除文件和子文件夹。

对我来说,对象是文件还是文件夹并没有什么区别,我想创建所有必要的父文件夹并复制对象,必要时覆盖。我目前正在使用一个锯齿状的 FileSystemInfo 数组来保存我的文件/文件夹。

这样做的好处是可以避免重复代码来分别同步文件和文件夹。

但是,我不知道如何复制 FileSystemInfo。我正在寻找一种能够复制/删除/读取创建或修改时间的方法,该方法适用于文件和文件夹。

【问题讨论】:

  • 没有 .NET 或 Windows API 函数可以在给定文件名时复制文件,或者在给定文件夹名称时复制文件夹。也不应该有。文件和文件夹是根本不同的东西。如果你想在你的代码中同样对待它们,那么你必须编写逻辑来确定哪个是哪个,并进行适当的系统调用。
  • 为什么要复制robocopy?类似于Process.Start("robocopy", root + " /MIR") 的东西似乎是您最好的选择。
  • 吉姆——我担心可能是这样。我知道它们是不同的,但在这种情况下,我想以同样的方式对待它们,因为我希望有人能够创建或删除一个文件夹并同步该文件夹,无论它是否包含文件。
  • whoisj - 我从未听说过 robocopy。它是什么?另外,作为旁注,有人知道如何在您的评论中创建换行符吗?
  • Robocopy 是 Windows 自带的命令行工具。在命令行中执行Robocopy /?,或使用您最喜欢的搜索引擎。而且您不能在评论中添加换行符。如果您的评论如此详细,请编辑您的问题。

标签: c# file copy directory


【解决方案1】:

FileSystemInfo 没有 Copy 或 Delete 方法,但它是 DirectoryInfo 和 FileInfo 的基类。

因此,当您遍历 FileSystemInfo 对象时,您必须强制转换为正确的具体类并使用特定的复制/删除方法。

foreach( var fsi in fileSystemInfoObjects )
{
     if( fsi is DirectoryInfo )
     {
        var directory =  (DirectoryInfo)fsi;
        //do something
     }
     else if (fsi is FileInfo )
     {
        var file = (FileInfo)fsi;
        //do something
     }
}

【讨论】:

  • 我可以添加强制转换逻辑,但有没有办法让只有一个“做某事”部分?如果不是,那么这只是将 IF 语句放入循环中,这对复制我的整个同步循环并为文件和文件夹分别执行并没有太大作用。如果我必须单独执行,我可以,但如果有一种方法可以对文件和文件夹执行相同的操作,即使我需要进行一些转换,它也会更简洁。
  • 这取决于您必须做什么,因为方法在 DirectoryInfo 和 FileInfo 类中可能具有不同的签名。在您的情况下,我将采用不同的方法:由于 FileInfo 的 Copy 方法创建了所有子目录,因此我只能处理文件。从根目录枚举并复制。
  • 你能举个例子,说明如何使用 FileInfo Copy 方法创建子目录吗?我不得不使用 Directory.CreateDirectory 创建文件夹,然后使用 FileInfo.Copyto 进行复制。
【解决方案2】:

我使用 sam 的回答来帮助我解决我的问题。我所做的是将复制逻辑放在我的自定义类中,这样每当我在代码中使用它时就不需要复制逻辑。

public class myFSInfo
{
    public FileSystemInfo Dir;
    public string RelativePath;
    public string BaseDirectory;
    public myFSInfo(FileSystemInfo dir, string basedir)
    {
        Dir = dir;
        BaseDirectory = basedir;
        RelativePath = Dir.FullName.Substring(basedir.Length + (basedir.Last() == '\\' ? 1 : 2));
    }
    private myFSInfo() { }
    /// <summary>
    /// Copies a FileInfo or DirectoryInfo object to the specified path, creating folders and overwriting if necessary.
    /// </summary>
    /// <param name="path"></param>
    public void CopyTo(string path)
    {
        if (Dir is FileInfo)
        {
            var f = (FileInfo)Dir;
            Directory.CreateDirectory(path.Substring(0,path.LastIndexOf("\\")));
            f.CopyTo(path,true);
        }
        else if (Dir is DirectoryInfo) Directory.CreateDirectory(path);
    }
}

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2013-05-21
    • 1970-01-01
    • 2016-11-07
    • 2014-08-15
    相关资源
    最近更新 更多