SSIS 脚本任务,用于根据文件扩展名移动文件

本文关键字:文件 扩展名 移动 用于 脚本 任务 SSIS | 更新日期: 2023-09-27 18:35:59

我在 SSIS 2012 的脚本任务中包含以下代码。

public void Main()
    {
        string inputDir = (string) Dts.Variables["User::InputDirectory"].Value;
        string CSVFolder = (string) Dts.Variables["User::CSVFolder"].Value;
        string XMLFolder = (string) Dts.Variables["User::XMLFolder"].Value;
        string XLSXFolder = (string) Dts.Variables["User::XLSXFolder"].Value;
        bool isXMLFolderEmpty = (bool) Dts.Variables["User::isXMLFolderEmpty"].Value;
        bool isCSVFolderEmpty = (bool)Dts.Variables["User::isCSVFolderEmpty"].Value;
        bool isXLSXFolderEmpty = (bool)Dts.Variables["User::isXLSXFolderEmpty"].Value;
        string[] fileNames = Directory.GetFiles(@inputDir);
        if (fileNames.Length > 0)
        {
            foreach (string inputFile in fileNames)
            {
                string FileExtension = Path.GetExtension(inputFile);
                if (FileExtension == ".csv")
                {
                    File.Move(inputDir + "''" + inputFile, CSVFolder + "''" + inputFile);
                    isCSVFolderEmpty = false;
                }
                else if (FileExtension == ".xlsx")
                {
                    File.Move(inputDir + "''" + inputFile, XLSXFolder + "''" + inputFile);
                    isXLSXFolderEmpty = false;
                }
                else if (FileExtension == ".xml")
                {
                    File.Move(inputDir + "''" + inputFile, XMLFolder + "''" + inputFile);
                    isXMLFolderEmpty = false;
                }
            }
        }
        Dts.TaskResult = (int)ScriptResults.Success;
    }

但是,当我执行脚本任务时,出现以下错误:DTS 脚本任务在用户代码中遇到异常:调用目标引发异常。

谁能指出出了什么问题? 所有变量名称都是正确的。

SSIS 脚本任务,用于根据文件扩展名移动文件

File.Move 不正确

您可能还对 Path.Combine 感兴趣,因为它将比盲字符串连接路由更优雅地处理构建路径。

目录.获取文件指示

返回指定目录中文件的名称(包括其路径)

所以inputFile已经是C:'ssisdata'so_35605920'Foo.csv的形式,所以你对FileMove的初始参数只是inputFile

因此,真正的挑战是将文件夹路径从inputFile变量更改为目标变量(CSV,XML或XLSX)。懒惰的黑客是调用 string.replace 方法指定输入目录并使用新目录。我可能会选择更优雅的东西,以防 UNC 或相对路径出现奇怪之处。

Path.GetFileName会给我文件和扩展名。因此,使用该 + Path.Combine 将为我们的 Move 操作生成正确的最终路径

Path.Combine(CSVFolder, Path.GetFileName(inputFile));

因此

File.Move(inputFile, Path.Combine(CSVFolder, Path.GetFileName(inputFile)));

Visual studio目前相当不满意,所以请原谅建议的代码缺乏准确性,但如果有拼写错误,你有对在线书籍的引用及其背后的逻辑。

此外,try/catch 块在防御性编码中非常有用,因为将进行测试以确保文件夹存在,没有锁定文件的进程等。