从文件系统中获取文件,可以在任何级别的深层子文件夹中找到它们

时间:2014-09-02 13:06:08

标签: marklogic

我正在使用ML 5并希望将文档从本地文件系统提取/加载到MarkLogic DB。我在xdm;:filesystem-directory()函数的帮助下创建了递归函数来检查文件夹深度。但是,我收到了XDMP-STACKOVERFLOW错误。我的文件系统文件夹有多个文件夹,多个子文件夹有多个深度。例如

├───vol_18
│   ├───iss_1
│   ├───iss_2
│   ├───iss_3
│   ├───iss_4
│   ├───iss_5
│   └───iss_6
├───vol_19
│   ├───iss_1
│   ├───iss_2
│   ├───iss_3
│   ├───iss_4
│   ├───iss_5
│   └───iss_6
├───vol_2
│   ├───iss_1
│   ├───iss_2
│   ├───iss_3
│   ├───iss_4
│   ├───iss_5
│   └───iss_6

还有其他更好的方法从本地文件系统递归获取文件吗?

我的代码是:

declare function IngestArchive($WhichFolder)
{
  let $FileToIngest := ""
  let $Collection := tokenize($WhichFolder, '\\')[last()]
  for $EachFolder in xdmp:filesystem-directory($WhichFolder)/dir:entry
  return
    if( $EachFolder[dir:type='directory'] )
    then
      let $Result := HasFolder($WhichFolder)
      return xdmp:set($FileToIngest, <File>{$Result/dir:pathname/string()}</File>)
    else
      xdmp:set($FileToIngest, <File>{$EachFolder/dir:pathname/string()}</File>)
};

declare function HasFolder($WhichFolder)
{
  for $EachFolder in xdmp:filesystem-directory($WhichFolder)/dir:entry[1]
  return
    if( $EachFolder[dir:type='directory'] )
    then
      HasFolder($WhichFolder)
    else
      <File>{$EachFolder/dir:pathname/string()}</File>
};

请提出您的建议。

1 个答案:

答案 0 :(得分:2)

看起来像一个无限循环。您的HasFolder函数调用自身,但使用原始参数。我想你想要这个:

HasFolder($WhichFolder)

替换为:

HasFolder($EachFolder)

HTH!