基于通配符搜索重命名文件的C#脚本任务
我试图创建一个C#Script任务来重命名我每天收到的一对文件,这些文件的末尾有一个附加的16位时间戳。像这样的文件“Cartons_2018091014000000” 在C#方面,我的经验很低,所以请原谅我试图进行逻辑构造 这是我认为可行的,但我得到了一些非常非描述性的错误基于通配符搜索重命名文件的C#脚本任务,c#,ssis,C#,Ssis,我试图创建一个C#Script任务来重命名我每天收到的一对文件,这些文件的末尾有一个附加的16位时间戳。像这样的文件“Cartons_2018091014000000” 在C#方面,我的经验很低,所以请原谅我试图进行逻辑构造 这是我认为可行的,但我得到了一些非常非描述性的错误 public void Main() { String txtfile = null; String[] fileEntries = Directory.GetFil
public void Main()
{
String txtfile = null;
String[] fileEntries = Directory.GetFiles(@"\\test-file-server-name\Scripts\", "Cartons_*");
foreach (string filename in fileEntries)
{
if(filename.Contains("Cartons"))
{
txtfile = filename;
System.IO.File.Move(txtfile, "Cartons.csv");
}
}
// TODO: Add your code here
Dts.TaskResult = (int)ScriptResults.Success;
}
有什么想法或建议吗?或者是在SSIS中实现这一点的更好/更优雅的方法?我想我会使用ForLoop容器,但我认为它不起作用的原因是,由于时间戳的附加,文件名每小时都会更改。我会冒昧地猜测,在处理第二个文件时,您会得到一个
文件已经存在
异常,因为您正在将它们全部重命名为相同的名称
我建议您在代码中设置一个断点,然后重新运行包。这将允许您逐步通过它来确认这一点
如果这就是问题所在,那么您只需要为唯一的文件选择新名称
FWIW,您应该能够使用内置的文件系统任务实现相同的功能(移动和重命名文件),而不是自己编写脚本。这里有一个教程 看起来您已经拥有了它,但它可能正在将文件保存在exe文件的运行时路径中。(只需添加完整路径)
什么是“脚本任务”?
我对C语言的经验很低。
你知道如何用你最喜欢的语言来完成吗?您的逻辑似乎完全不正确。@NetMage这是SSIS中的一个小部件。您可能应该使用StartsWith
而不是Contains
,但是您的测试是不需要的-您知道fileEntries
的每个成员都将使用Cartons
,因为这是通配符的要求。告诉我们关于这对文件的更多信息-显示一些示例。脚本任务基本上是SSIS中的一个部分类容器,允许您执行C#驱动的任务。太好了,非常感谢这就是我要找的。真不敢相信我错过了全程,我在上面转了一个小时。非常感谢您的帮助。随时欢迎您的帮助。=)我也曾多次遇到过这个问题。顺便说一句,我想你也可以删除“if(filename.Contains(“Cartons”))”行。由于Getfiles已经需要“Cartons”,因此不需要该语句。此外,为了防止捕获任何其他文件,您可以将getfiles行更改为:“string[]fileEntries=Directory.getfiles(路径,“Cartons.*.csv”);甚至可以将此string[]fileEntries=Directory.getfiles(路径,“Cartons.*.20.csv”)”。这样其他文件就不会被意外抓取。。。谢谢你的回复,我确实读过这篇文章(真的),这个解决方案实际上是我们得到一组静态文件名时使用的旧方法。我们的变化是文件名现在每小时都在移动,我们不能设置变量和指向通配符的文件连接。只有ForEach容器可以接受文件掩码。我真的很感谢你的反馈,这是一篇很棒的文章。
using System.IO;
class Program
{
static public void Main()
{
string Path = @"\\test-file-server-name\Scripts\";
string[] fileEntries = Directory.GetFiles(Path, "Cartons_*");
foreach (string filename in fileEntries)
{
if (filename.Contains("Cartons"))
{
File.Move(filename, Path + "Cartons.csv");
}
}
// TODO: Add your code here
//Dts.TaskResult = (int)ScriptResults.Success;
}
}