如何将新创建的文件从多个目录复制到单个目录uiss sis或cmd?

时间:2019-05-10 10:29:15

标签: cmd ssis

我在一个目录中有多个文件夹,每个文件夹(根据Siteid的文件夹名称)都包含.orig文件。因此,我想将最新创建的“ .orig”文件从多个目录复制到一个目录中。 每周从ftp接收每个目录中的文件 文件名格式

:PSAN{SiteId}_20190312_TO_20190318_AT_201903191600.txt

我尝试使用Windows命令复制文件

for /R "source" %f in (*.orig) do copy %f "destination"

使用此命令,我可以将多个文件夹中的所有.orig文件复制到一个文件夹中,但它会提取所有文件。

我们可以在命令中进行修改以获取最新文件吗? 如何使用SSIS包或cmd执行此任务。

3 个答案:

答案 0 :(得分:1)

您可以使用脚本任务来实现,您可以简单地将文件夹存储在数组中,循环遍历这些文件夹以获取最新创建的文件并将其复制到目标目录(无需SSIS即可实现) :

using System.Linq;

string[] sourcefolders = new string[] { @"C:\New Folder1", @"C:\New Folder2" };
string destinationfolder = @"D:\Destination";

foreach (string srcFolder in sourcefolders)
{

    string latestfile = System.IO.Directory.GetFiles(srcFolder, "*.orig").OrderByDescending(x => System.IO.File.GetLastWriteTime(x)).FirstOrDefault();

    if (!String.IsNullOrWhiteSpace(latestfile))
    {

        System.IO.File.Copy(latestfile, System.IO.Path.Combine(destinationfolder, System.IO.Path.GetFileName(latestfile)));

    }


}

答案 1 :(得分:0)

创建两个名为InputFileNameWithPath和OutputFolderPath的包变量。前者将在包中动态设置。前者应硬编码到您的目标文件夹名称。

创建一个类型为File Enumerator的ForEachLoop枚举器。将路径设置为根文件夹,然后选中“遍历”子文件夹的复选框。您可能希望为FileMask添加一个表达式并将其设置为*.orig,这样仅移动.orig文件(假设目录中不希望移动其他文件),请指定完全限定的路径。到包变量InputFileName。

然后将系统文件任务添加到ForEachLoop枚举器中,并使其移动文件。从InputFileNameWithPath到OutputFolderPath。

答案 2 :(得分:0)

下面是一个示例C#脚本任务。这将SSIS变量用于源文件夹和目标文件夹,如果要存储它们,请确保将其添加到ReadOnlyVariables字段中。确保您也具有下面列出的参考。如下所述,如果存在同名文件,它将被覆盖以避免此类错误,但是我建议您确认这符合您的要求。 File.Copy的第三个参数对此进行控制,可以省略,因为它不是必需参数。

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


string sourceFolder = Dts.Variables["User::SourceDirectory"].Value.ToString();
string destinationFolder = Dts.Variables["User::DestinationDirectory"].Value.ToString();

Dictionary<string, string> files = new Dictionary<string, string>();
DirectoryInfo sourceDirectoryInfo = new DirectoryInfo(sourceFolder);

foreach (DirectoryInfo di in sourceDirectoryInfo.EnumerateDirectories())
{
    //get most recently created .orig file
    FileInfo fi = di.EnumerateFiles().Where(e => e.Extension == ".orig")
                        .OrderByDescending(f => f.CreationTime).First();
     //add the full file path (FullName) as the key
     //and the name only (Name) as the value
    files.Add(fi.FullName, fi.Name);
}

foreach (var v in files)
{
   //copy using key (full path) to destination folder 
   //by combining destination folder path with the file name
   //true- overwrite file if file by same name exists
    File.Copy(v.Key, destinationFolder + v.Value, true);
}