Как скопировать новый созданный файл из нескольких каталогов в одну директорию uisng ssis или cmd? - PullRequest
3 голосов
/ 10 мая 2019

У меня есть несколько папок в одном каталоге, и каждая папка (имя папки согласно 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 ]

1 голос
/ 11 мая 2019

Вы можете использовать задачу «Сценарий», чтобы достичь этого, вы можете просто сохранить папки в массиве, перебрать эти папки, получить последний созданный файл и скопировать его в целевой каталог (вы можете достичь этого без 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)));

    }


}
0 голосов
/ 15 мая 2019

Пример C # Script Task для этого приведен ниже. При этом используются переменные служб 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);
}
0 голосов
/ 10 мая 2019

Создайте две переменные пакета с именами InputFileNameWithPath и OutputFolderPath.Бывший будет динамически установлен в пакете.Первый должен быть жестко задан в качестве имени папки назначения.

Создайте перечислитель ForEachLoop типа File Enumerator.Установите путь к корневой папке и установите флажок для перемещения подпапок.Возможно, вы захотите добавить выражение для FileMask и установить для него значение *.orig, чтобы перемещались только файлы .orig (при условии, что в каталоге есть другие файлы, которые вы не хотите перемещать). Назначьте полный путь к файлу.переменная пакета InputFileName.

Затем добавьте Системную файловую задачу в перечислитель ForEachLoop и попросите ее переместить файл.от InputFileNameWithPath к OutputFolderPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...