如何正确匹配子目录中的文件名?

时间:2015-10-17 12:50:43

标签: haskell recursion name-matching

我目前正在浏览 Real World Haskell 这本书,本书中的一个练习要求读者使用**实现文件名匹配,这与{ {1}},但也会在文件系统中查找子目录。下面是我的代码片段和注释(目前有很多重复),你可以在下面找到有关代码的其他信息。我认为发布的代码足以解决问题,无需在此列出整个程序。

*

其他信息:

case splitFileName pat of ("", baseName) -> do -- just the file name passed curDir <- getCurrentDirectory if searchSubDirs baseName -- check if file name has `**` in it then do contents <- getDirectoryContents curDir subDirs <- filterM doesDirectoryExist contents let properSubDirs = filter (`notElem` [".", ".."]) subDirs subDirsNames <- forM properSubDirs $ \dir -> do namesMatching (curDir </> dir </> baseName) -- call the function recursively on subdirectories curDirNames <- listMatches curDir baseName -- list matches in the current directory return (curDirNames ++ (concat subDirsNames)) -- concatenate results into a single list else listMatches curDir baseName (dirName, baseName) -> do // full path passed if searchSubDirs baseName then do contents <- getDirectoryContents dirName subDirs <- filterM doesDirectoryExist contents let properSubDirs = filter (`notElem` [".", ".."]) subDirs subDirsNames <- forM properSubDirs $ \dir -> do namesMatching (dirName </> dir </> baseName) -- call the function recursively on subdirectories curDirNames <- listMatches dirName baseName -- list matches in the passed directory return (curDirNames ++ (concat subDirsNames)) -- concatenate results into a single list 是我正在寻找的模式(例如pat*.txt)。

C:\\A\[a-z].*是一个将文件路径拆分为目录路径和文件名的函数。如果我们在splitFileName中仅指定文件名,则元组的第一个元素将为空。

如果文件名中包含pat,则

searchSubDirs会返回True

**返回与目录中的模式匹配的文件名列表,用listMatches代替**

*是我发布的摘录函数的名称。

为什么不起作用?

当我只传递文件名时,程序仅在当前目录和第一级子目录中搜索它。当我传递完整路径时,它只在指定的目录中搜索。看起来案例namesMatching没有正确递归。我已经看了一段时间的代码了,我无法弄清楚问题出在哪里。

注意

如果需要更多信息,请在评论中告诉我,我会添加问题所需的一切。

1 个答案:

答案 0 :(得分:2)

这是一个问题:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!DOCTYPE html>

<body bgcolor="#646464">
  <div class="mainWrapper">
    <div id="Header">Header</div>
    <div id="ContentWrapper">
      <div id="Left_Nav">
        <h3>Navigation</h3>

        <ul class="list_vertical">
          <li>Home</li>
          <li>Link 0</li>
          <li>Link 1</li>
          <li>Link 2</li>
          <li>Link 3</li>
        </ul>
      </div>
      <div id="Content">Content</div>
    </div>
    <div id="Footer">
      <div class="table">Footer
        <ul class="list_horizontal">
          <li class="hor">Link 0</li>
          <li class="hor">Link 1</li>
          <li class="hor">Link 2</li>
          <li class="hor">Link 3</li>
        </ul>
      </div>
    </div>
  </div>
</body>

contents <- getDirectoryContents dirName subDirs <- filterM doesDirectoryExist contents 仅返回目录的叶名称,因此在调用{{getDirectoryContents之前,您必须先将dirName(以及/)添加到contents的元素中。 1}}。