我在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
}
答案 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;
}