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

时间:2016-02-24 15:17:31

标签: c# ssis script-task

我在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脚本任务在用户代码中遇到异常:调用目标抛出了异常。

有人可以指出出了什么问题吗?所有变量名都是正确的。

1 个答案:

答案 0 :(得分:1)

File.Move is incorrect

您可能也对Path.Combine感兴趣,因为它会比盲字段连接路径更优雅地处理构建路径。

Directory.GetFile表示

  

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

所以inputFile已经采用C:\ssisdata\so_35605920\Foo.csv的形式,因此您对FileMove的初始参数只是inputFile

所以真正的挑战是将inputFile变量中的文件夹路径更改为目标路径(CSV,XML或XLSX)。懒惰的方法是调用string.replace方法来指定inputDir并使用新目录。如果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块在防御性编码中非常有用,因为将进行测试以确保文件夹存在,没有锁定文件的进程等。