【问题标题】:c# FileInfo class being used in SSIS Script Task Directory.GetFiles SearchOption.TopDirectoryOnly being ignoredc# FileInfo 类在 SSIS 脚本任务 Directory.GetFiles SearchOption.TopDirectoryOnly 被忽略
【发布时间】:2018-12-16 21:03:53
【问题描述】:

我正在使用以下脚本任务来枚举文件目录,然后提取文件列表并将它们加载到记录集目标中。我不想深入搜索我在搜索中指定的 @"E:\Data Warehouse\Imports\TIMECLOCK" 目录。 TIMECLOCK 中有一个名为 PROCESSED 的后续文件夹,它应该稍后将文件移动到该文件夹​​中。所以我只是想抓住上面文件夹中的那些,TIMECLOCK。因此,我在 Directory.GetFiles 函数中使用了 SearchOption.TopDirectoryOnly,但它正在向下钻取到 PROCESSED 文件夹,正如我的数据查看器所证明的那样(参见代码后的数据视图屏幕截图)。一开始我是用一个变量来传入搜索目录的,但是它做的是同样的事情,所以我明确地声明了搜索目录,它仍然不起作用。我不知道我做错了什么!

#region Namespaces
using System;
using System.Data;
using System.IO;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
#endregion


[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent{

public override void CreateNewOutputRows()
{
    string sourceDirectory = @"E:\Data Warehouse\Imports\TIMECLOCK";
    string searchFileName = "Business Units GL Segments_Sent Weekly*";
    string[] files = Directory.GetFiles(sourceDirectory, searchFileName, SearchOption.TopDirectoryOnly);

    FileInfo fileInfo = new FileInfo(sourceDirectory);

    foreach (string file in files)
    {
        String FileFullPath = Path.GetFullPath(file);
        fileInfo = new FileInfo(FileFullPath);
        OrderedFilesBuffer.AddRow();
        OrderedFilesBuffer.FileName = fileInfo.Name;
        OrderedFilesBuffer.FileDate = fileInfo.LastWriteTime;
        OrderedFilesBuffer.FilePath = fileInfo.FullName;
    }
  }
}

【问题讨论】:

  • 如果在要搜索的目录中添加尾部斜杠会发生什么?例如@"E:\Data Warehouse\Imports\TIMECLOCK\"
  • 您可以创建一个 DirectoryInfo() 以使用 EnumerateFiles(或 GetFiles)方法直接获取 FileInfo。这样您以后就不需要创建 FileInfo。有点性能优势,可以潜在地解决您忽略 TopDirectoriesOnly 的其他问题。
  • btw EnumerateFiles 可以具有一些性能优势,GetFiles() 必须先从文件系统中获取所有文件条目,EnumerateFiles 将在每次有机会从中获取记录时返回文件系统,因此您不必等待。
  • 我同意我不会期望这种行为。看起来这是由我不熟悉的 SSIS 使用的...是否缓存程序集?也许它使用的是旧版本,您需要重新启动某些东西才能让它接受您的更改? (您可以尝试将日期硬编码为固定值,以查看您的更改是否正在被 SSIS 使用,或者它是否正在使用缓存版本。)
  • 我无法重现问题,您提供的代码不是minimal reproducible example

标签: c# ssis fileinfo


【解决方案1】:

我将其标记为已回答,因为我仍然完全不确定为什么会发生这种情况,我最终决定通过将值写入 (2) 文件对象,然后合并并获取唯一的文件列表来尝试重现什么它们之间的处理,实际上只是一个简单的文件移动任务。我是为一个最初在 Pentaho 数据集成中以这种方式设计它并在 SSIS 中精确复制它的客户写的,当时它并不是真正必要的。我认为,由于我在同一个控制流中同时运行这两个提取,因此由于某种缓存问题并忽略了 TopDirectoryOnly,因此它们使用相同的文件路径。无论如何,我把它扔掉并重新做了整个事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多