【发布时间】:2016-03-03 16:58:15
【问题描述】:
我有一个相当复杂的要求 - 我必须将一个非常明确命名的文件放到一个 FTP 位置,这里的技巧是我经常不得不将它放到一个新的位置并且每次都使用一个新的文件名(目录名和文件名都取决于年、月、日和时间)。显然,为此我选择使用动态发送端口,我已使用 MessageAssignment Shape 进行配置。
每天都会生成一个文件。我需要以这种形式将它放在远程位置: sample-servername-stage/default/file/ftp/PaymentReports/YYYY/MM_[MonthName]/PaymentReportYYYYMMDD_HHMISS
例如,对于 2016 年 3 月 2 日下午 6:45 发布的文件,我们会:
sample-servername-stage/default/file/ftp/PaymentReports/2016/03_March/PaymentReport20160302_184500
这是我在 MessageAssignment 形状中的代码:
FTPSendPort1(Microsoft.XLANGs.BaseTypes.Address) = "ftp://sample-servername-stage:721";
FTPSendPort1(Microsoft.XLANGs.BaseTypes.TransportType) = "FTP";
Output(FTP.CommandLogFileName) = "D:\\BiztalkLogs\\FTPLog\\DynamicFTPLog.txt";
Output(FTP.UserName) = "sampleUsername";
Output(FTP.Password) = "samplePassword";
Output(FTP.BeforePut) = "MKD " + Variable_1 + ";CWD " + Variable_1;
FTPSendport1 - 动态发送端口的名称。
输出 - 输出消息的名称。
Variable_1 - 我将存储要创建的目录名称的变量。
这是最大的问题:
我需要检查一个目录是否已经存在 - 年份,然后导航并检查月份是否已经存在。如果它们存在,我只需进入那里并删除文件。如果没有,我创建它并将文件放在那里。
我需要以上面显示的格式使用日期时间细节来命名文件。除了上面显示的代码之外,我还尝试了很多方法,包括设置
FILE.ReceivedFileName、FTP.ReceivedFileName属性等。似乎没有任何效果。这可能是因为我无法在任何地方使用宏%SourceFileName%。因此,它会不断将文件放入带有 GUID 名称的位置,而不是我设置的位置。它的行为就好像它完全跳过/忽略了我设置文件名的命令。
在这一点上我完全糊涂了。我不确定如何将检查条件(如果文件夹已经存在等)与 FTP 命令混合使用,尤其是不确定如何在编排中执行此操作。
【问题讨论】:
-
您是否尝试将 fileMask 属性设置为您想要的文件名?如果 MKD 已经存在,它真的会导致错误吗?
-
@Dijkgraaf 在为编排中的动态 FTP 发送端口指定参数时,没有设置 fileMask 属性的选项。至少,如果有,我不知道如何访问它。有一个名为 FTP.ReceivedFileName 的属性也不起作用。
-
我很确定您必须将目录创建与适配器分开。 FTP.ReceivedFileName 应该可以设置文件名,但如果它们不存在,则不会为您创建目录。如果可能,我会将其设置为目标服务器上的作业 - 每天晚上午夜(或 11:59)它会为当天创建新目录。
-
有什么方法可以让该 FTP 站点的所有者简化其结构?这真的很复杂,每当我遇到这样的事情时,即使在他们这边也没有任何好处,也就是说,这只是他们的方式,没有人知道的原因。
标签: dynamic ftp filenames biztalk biztalk-2010