基于通配符搜索重命名文件的C#脚本任务

基于通配符搜索重命名文件的C#脚本任务,c#,ssis,C#,Ssis,我试图创建一个C#Script任务来重命名我每天收到的一对文件,这些文件的末尾有一个附加的16位时间戳。像这样的文件“Cartons_2018091014000000” 在C#方面,我的经验很低,所以请原谅我试图进行逻辑构造 这是我认为可行的,但我得到了一些非常非描述性的错误 public void Main() { String txtfile = null; String[] fileEntries = Directory.GetFil

我试图创建一个C#Script任务来重命名我每天收到的一对文件,这些文件的末尾有一个附加的16位时间戳。像这样的文件“Cartons_2018091014000000”

在C#方面,我的经验很低,所以请原谅我试图进行逻辑构造

这是我认为可行的,但我得到了一些非常非描述性的错误

        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;
    }
}