我在一个目录中有多个文件夹,每个文件夹(根据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执行此任务。
答案 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);
}