【发布时间】: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。