用于根据文件扩展名移动文件的 SSIS 脚本任务
SSIS Script Task for moving files based on their file extension
我在 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 脚本任务在用户代码中遇到异常:调用目标抛出异常。
谁能指出哪里出了问题?所有的变量名都是正确的。
您可能也对 Path.Combine 感兴趣,因为它会比您的盲字符串连接路由更优雅地处理构建路径。
Returns the names of files (including their paths) in the specified directory
所以 inputFile
已经是 C:\ssisdata\so_35605920\Foo.csv
的形式所以你的 FileMove 的初始参数只是 inputFile
因此,真正的挑战在于将文件夹路径从 inputFile 变量更改为目标路径(CSV、XML 或 XLSX)。懒惰的 hack 是调用 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 块在防御性编码中特别有用,因为将进行测试以确保文件夹存在,没有进程锁定文件等。
我在 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 脚本任务在用户代码中遇到异常:调用目标抛出异常。
谁能指出哪里出了问题?所有的变量名都是正确的。
您可能也对 Path.Combine 感兴趣,因为它会比您的盲字符串连接路由更优雅地处理构建路径。
Returns the names of files (including their paths) in the specified directory
所以 inputFile
已经是 C:\ssisdata\so_35605920\Foo.csv
的形式所以你的 FileMove 的初始参数只是 inputFile
因此,真正的挑战在于将文件夹路径从 inputFile 变量更改为目标路径(CSV、XML 或 XLSX)。懒惰的 hack 是调用 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 块在防御性编码中特别有用,因为将进行测试以确保文件夹存在,没有进程锁定文件等。