简体   繁体   English

在C#中有条件地将文件目录和子目录移动到另一个目录(仅移动最近5天创建的文件和目录)

[英]Move files directories and sub directories to another directory Conditionally (Move only Last 5 days created files and directories) in C#

My Source directory "D:\\Source" 我的源目录“ D:\\ Source”

Destination "D:\\Destination" 目的地“ D:\\目的地”

source directory contains some files and folders with different creation dates, i want to move all files and folders whose creation date less than last 5 days for example today is 28/11/2015 and i want to Move all files and folders from source before creating 23/11/205. 源目录包含了一些文件和文件夹不同的创建日期,我想移动的所有文件和文件夹,其创建日期比去年少5天,比如今天是28/11/2015,我想创建之前将来自源的所有文件和文件夹23/11/205。

i'm searching since 2 days but no success. 我从2天开始搜索,但没有成功。

here is my Attempt 这是我的尝试

    var sourcePath = "D:\\Source";
    var destinationPath = "D:\\Destination";

    var dInfo = new DirectoryInfo(sourcePath)
    var files = (from filew in dInfo.EnumerateFiles(sourcePath)
                                     orderby filew.CreationTime.Date < DateTime.Now.Date.AddDays(-5) ascending
                                     select filew.Name).Distinct();

var directories = (from filew in dInfo.EnumerateDirectories(sourcePath)
                                 orderby filew.CreationTime.Date < DateTime.Now.Date.AddDays(-5) ascending
                                 select filew.Name).Distinct();
     foreach (var dir in directories)
     {
        var dest = Path.Combine(destinationPath, Path.GetFileName(dir));
                        Directory.Move(dir, dest);
     }

     foreach (var file in files)
     {
        var dest = Path.Combine(destinationPath, Path.GetFileName(file));
                            File.Move(file, dest);
     }

ERROR : Second path fragment must not be a drive or UNC name. 错误:第二个路径片段不能是驱动器或UNC名称。

please help me 请帮我

You have to call EnumerateFiles and EnumerateDirectories without parameters: 您必须调用不带参数的EnumerateFilesEnumerateDirectories

dInfo.EnumerateFiles()
dInfo.EnumerateDirectories()

The information about sourcePath is already in the dInfo object. 有关sourcePath的信息已经在dInfo对象中。 The parameter would be used to apply a filter. 该参数将用于应用过滤器。

UPDATE: 更新:

And the EnumerateFiles() function just returns the file names without pathes. EnumerateFiles()函数仅返回不带路径的文件名。 So you should use something like that: 因此,您应该使用类似的方法:

foreach (var file in files)
{
    var src = Path.Combine(sourcePath, file);
    var dest = Path.Combine(destinationPath, file);
    File.Move(src, dest);
}

You would need to do it recursively as there can be sub directories within the directory, where the same rule would apply. 您将需要递归执行此操作,因为该目录中可能存在子目录,在该目录中将应用相同的规则。 Refer to code below. 请参阅下面的代码。

public static void MoveFilesAndFolders(string sourcePath, string destinationPath)
{
        var directories = Directory.GetDirectories(sourcePath);

        foreach (var directory in directories)
        {
            var subDirectory = new DirectoryInfo(directory);

            //Create sub directory in the destination folder if the business rules is satisfied
            if (DateTime.Today.Subtract(File.GetCreationTime(directory)).Days < 5)
            {
                var newDestinationDirectory = Directory.CreateDirectory(Path.Combine(destinationPath, subDirectory.Name));
                MoveFilesAndFolders(subDirectory.FullName, newDestinationDirectory.FullName);
            }
        }

        foreach (var file in Directory.GetFiles(sourcePath))
        {
            var fileName = Path.GetFileName(file);

            //Copy the file to destination folder if the business rule is satisfied
            if (!string.IsNullOrEmpty(fileName))
            {
                var newFilePath = Path.Combine(destinationPath, fileName);
                if (!File.Exists(newFilePath) && (DateTime.Today.Subtract(File.GetCreationTime(file)).Days < 5)))
                {
                    File.Move(file, newFilePath);
                }
            }
        }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM