SSIS脚本任务移动所有不起作用的文件

时间:2018-12-10 16:07:44

标签: c# sql-server ssis

我在SSIS中使用脚本任务(C#)将所有.txt文件从一个文件夹移动到另一个文件夹。但是,当我执行此操作时,没有任何反应。脚本任务实际上报告成功,但是文本文件不会移动。我在所有路径中使用变量-它们都以2个反斜杠开始,以1个反斜杠结束。

我要做的就是将所有文本文件从源目标移动到目标文件夹。

我想念什么?

buildscript {
    repositories {
        google()
        //jcenter()
        jcenter {url 'https://dl.bintray.com/android/android-tools'}
        jcenter {url 'https://firebase.bintray.com/gradle'}
        mavenCentral ()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath 'com.google.gms:google-services:4.2.0'
        classpath 'com.google.firebase:firebase-plugins:1.1.5'
    }
}

allprojects {
    repositories {
        google()
        //jcenter()
        jcenter {url 'https://dl.bintray.com/android/android-tools'}
        jcenter {url 'https://firebase.bintray.com/gradle'}
        mavenCentral ()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

2 个答案:

答案 0 :(得分:5)

就像我在评论中提到的那样,似乎不需要使用脚本任务来执行此操作;更好的选择是Foreach循环容器和文件系统任务。

首先创建Foreach循环容器,打开编辑器并转到“收集窗格”。将枚举器更改为Foreach文件枚举器。我假设您在目录中使用变量,所以对于表达式单击...,然后为属性选择目录,为表达式选择变量。

由于您特别想处理txt文件,请将文件更改为*.txt。用于“检索文件名”的选项取决于您确定目的地的方式。我假设您的目录目标还有另一个变量,所以选择Name and extention

转到“变量映射”窗格,然后选择文件名变量,或创建一个新的变量。将索引保留为0。这将存储您要移动的文件的名称和扩展名。

在您的程序包中创建一个名为OriginalFilePath的新变量或易于识别的变量。将值设置为string,然后将范围更改为Foreach循环容器。现在打开变量的表达式窗格,并将表达式设置为类似以下内容:

@[User::SourceDirectoryVariable] + "\\" + @[User::FileNameVariable]

显然,将变量名更改为所需的名称。现在,使用目标目录变量而不是源(@[User::DestinationDirectoryVariable] + "\\" + @[User::FileNameVariable])创建第二个变量(相同设置)。

现在,在控制流中,在Foreach循环容器中创建一个文件系统任务。将操作更改为移动文件。然后根据需要填写窗格的其余部分(IsSourceVariable为True,然后选择变量)。对目的地执行相同的操作,然后应该出发。

有任何问题,请对错误进行注释

答案 1 :(得分:0)

您应该避免使用string +运算符手动串联文件路径。这留下了很多错误的余地。使用System.IO.Path.Combine()。这样可以确保所有前导斜杠和试用斜杠的格式正确。

也不需要使用所有这些其他变量来手动重建文件路径。只要输入变量目录正确,这样的事情就可以正常工作:

public void Main()
    {
        DirectoryInfo di = new DirectoryInfo(Dts.Variables["IN_Folder"].Value.ToString());
        string destinationFolder = Dts.Variables["User::IN_Folder_Processing"].Value.ToString();
        FileInfo[] fi = di.GetFiles("*.txt");

        foreach (FileInfo f in fi)
        {
            FileInfo destinationFile = new FileInfo(Path.Combine(destinationFolder, f.Name));
            if (destinationFile.Exists)
                destinationFile.Delete();
            f.MoveTo(destinationFile.FullName);
        }

        Dts.TaskResult = (int)ScriptResults.Success;
    }