递归地将一个文件夹中的文件路径映射到另一个文件夹

时间:2016-08-25 18:36:52

标签: php regex data-structures language-agnostic filesystems

我们说我有一个文件夹 (folder_1) ,结构如下:

/folder_1
  /dir_1
     - file_1_1.txt
     - file_1_2.txt
  /dir_2
     - file_2_1.txt
     /dir_2_1
       - file_2_1_1.txt
  - file_1.txt

现在,让我们说我有另一个文件夹 (folder_2) ,其结构如下:

/folder_2
  /dir_1
     - file_1_1.txt
     - default.txt
  /dir_2
     - file_2_1.txt
     - default.txt
  - default.txt

我需要将 folder_1 中的每个文件映射到 folder_2 中的文件,以便:

  1. /folder_1/dir_1/file_1_1.txt映射到/folder_2/dir_1/file_1_1.txt
  2. /folder_1/dir_1/file_1_1.txt映射到/folder_2/dir_1/default.txt
  3. /folder_1/dir_2/file_2_1.txt映射到/folder_2/dir_2/file_2_1.txt
  4. /folder_1/dir_2/dir_2_1/file_2_1_1.txt映射到/folder_2/dir_2/default.txt
  5. /folder_1/file_1.txt映射到/folder_2/default.txt
  6. 我不是最好的沟通者,所以希望上述模式对你们有意义。问题是语言无关,但PHP和/或Javascript的答案真的很棒。

    到目前为止,我能够在PHP中使用FileIterator,RecursiveDirectoryIterator和一堆自定义类来完成此操作,这些类提取然后逐个映射文件的路径。

    这让我想知道我是否错过了更简单的方法来完成这个简单的映射。也许使用正则表达式命名组或什么?

    **编辑:**

    是否可能对于 folder_1 中的每个文件(文件路径),我们使用正则表达式模式从 folder_2中的所有文件路径的地图中查找(减少)最佳匹配

    进一步修改:

    这是用于将 folder_1 中的数据文件映射到 folder_2 中的模板文件。如果对于 folder_1 中的文件,找不到 folder_2 中的完全匹配的文件路径(包括文件名),我们会查找default.txt。如果找不到default.txt,则我们向上移动一个目录并使用该父目录default.txt。这样,我们不断提升目录级别,直到找到第一个default.txt

1 个答案:

答案 0 :(得分:0)

首先,使用递归目录扫描程序扫描所有folder_2目录树。构建包含文件名的哈希表,不带folder_2前缀。所以你的哈希表将包含:

/dir_1
/dir_1/file_1_1.txt
/dir_1/default.txt
/dir_2/file_2_1.txt
/dir_2/default.txt
/default.txt

现在,开始扫描folder_1。获取文件后,从前面剥离folder_1,然后在哈希表中查找生成的字符串。如果它在那里,那么你有一个匹配。

如果文件不存在,请用" default.txt"替换最后一段,然后重试。因此,当您开始扫描folder_1时,您会得到:

/folder_1/dir_1/file_1_1.txt

您在哈希表中查找dir_1/file_1_1.txt并找到它。你有一场比赛。

接下来,您获得/folder_1/dir_1/file_1_2.txt。您在哈希表中查找/dir_1/file_1_2.txt并且找不到它。因此,您将file_1_2.txt替换为default.txt,并为您提供/dir_1/default.txt。你在哈希表中查找,找到它,并且你有一个匹配。

现在,如果/dir_1/default.txt不存在,那么您将再次调整文件名以删除最后一个目录。也就是说,您要删除/dir_1,并在哈希表中查找/default.txt

在伪代码中,它看起来像这样:

for each file in folder_1
    name = strip `/folder_1` from the name
    if name in hash table then
        match found
        continue (next file)
    end if
    replace file name (everything after the last '/') with "default.txt"
    do
        if name in hash table then
            match found
            continue (next file)
        end if
        remove the last slash, and everything between it and the previous slash.
        (so "/dir_1/default.txt" becomes "/default.txt")
    while name.length > 0

    // if you get here, no match was found
end for