Допустим, у меня есть папка (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 такой что:
/folder_1/dir_1/file_1_1.txt
карты для /folder_2/dir_1/file_1_1.txt
,/folder_1/dir_1/file_1_1.txt
карты для /folder_2/dir_1/default.txt
/folder_1/dir_2/file_2_1.txt
карты для /folder_2/dir_2/file_2_1.txt
/folder_1/dir_2/dir_2_1/file_2_1_1.txt
карты для /folder_2/dir_2/default.txt
/folder_1/file_1.txt
карты для /folder_2/default.txt
Я не лучший коммуникатор, так что, надеюсь, приведенная выше схема имеет смысл для вас, ребята. Вопрос на самом деле не зависит от языка, но ответ на 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
,
Во-первых, используйте ваш рекурсивный сканер каталогов для сканирования всех 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
Других решений пока нет …