Skip to content

Commit c02a105

Browse files
committed
优化文件夹递归查找和排序逻辑
- 添加文件夹时默认递归查找所有子文件夹中的图片 - 按子文件夹顺序排序(第1话→第2话→第3话...) - 文件列表显示顺序与翻译顺序保持一致 - 自动忽略manga_translator_work工作目录
1 parent 7cd779b commit c02a105

3 files changed

Lines changed: 72 additions & 24 deletions

File tree

desktop_qt_ui/services/file_service.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -207,34 +207,45 @@ def _natural_sort_key(self, path: str):
207207

208208
return parts
209209

210-
def get_image_files_from_folder(self, folder_path: str, recursive: bool = False) -> List[str]:
211-
"""从文件夹获取所有图片文件,忽略manga_translator_work目录"""
210+
def get_image_files_from_folder(self, folder_path: str, recursive: bool = True) -> List[str]:
211+
"""从文件夹获取所有图片文件(默认递归查找所有子文件夹),忽略manga_translator_work目录"""
212212
image_files = []
213213

214214
try:
215215
if not os.path.exists(folder_path) or not os.path.isdir(folder_path):
216216
return image_files
217217

218218
if recursive:
219-
# 递归搜索,忽略manga_translator_work目录
219+
# 递归搜索,按子文件夹分组排序
220+
# 先收集所有子文件夹
221+
subfolders = []
220222
for root, dirs, files in os.walk(folder_path):
221223
# 移除manga_translator_work目录,避免遍历
222224
if 'manga_translator_work' in dirs:
223225
dirs.remove('manga_translator_work')
224-
226+
227+
# 对dirs进行自然排序,确保os.walk按正确顺序遍历
228+
dirs.sort(key=self._natural_sort_key)
229+
230+
# 收集当前目录的图片文件
231+
current_files = []
225232
for file in files:
226233
file_path = os.path.join(root, file)
227234
if self.validate_image_file(file_path):
228-
image_files.append(file_path)
235+
current_files.append(file_path)
236+
237+
# 对当前目录的文件进行自然排序
238+
current_files.sort(key=self._natural_sort_key)
239+
image_files.extend(current_files)
229240
else:
230241
# 只搜索当前目录,忽略manga_translator_work目录
231242
for file in os.listdir(folder_path):
232243
file_path = os.path.join(folder_path, file)
233244
if os.path.isfile(file_path) and self.validate_image_file(file_path):
234245
image_files.append(file_path)
235-
236-
# 使用自然排序(支持数字排序)
237-
image_files.sort(key=self._natural_sort_key)
246+
247+
# 使用自然排序(支持数字排序)
248+
image_files.sort(key=self._natural_sort_key)
238249

239250
except Exception as e:
240251
self.logger.error(f"获取文件夹图片失败 {folder_path}: {e}")

desktop_qt_ui/widgets/file_list_view.py

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -297,16 +297,32 @@ def add_files(self, file_paths: List[str]):
297297
norm_path = os.path.normpath(path)
298298

299299
if os.path.isdir(norm_path):
300-
# 如果传入的是文件夹路径,扫描其中的图片
300+
# 如果传入的是文件夹路径,递归扫描其中的所有图片(包括子文件夹)
301301
try:
302302
image_extensions = {'.png', '.jpg', '.jpeg', '.bmp', '.webp'}
303-
files = [
304-
os.path.join(norm_path, f)
305-
for f in os.listdir(norm_path)
306-
if os.path.splitext(f)[1].lower() in image_extensions
307-
]
303+
files = []
304+
305+
# 递归遍历文件夹及其子文件夹,按子文件夹顺序排序
306+
for root, dirs, filenames in os.walk(norm_path):
307+
# 忽略 manga_translator_work 目录
308+
if 'manga_translator_work' in dirs:
309+
dirs.remove('manga_translator_work')
310+
311+
# 对子文件夹进行自然排序,确保按正确顺序遍历
312+
dirs.sort(key=natural_sort_key)
313+
314+
# 收集当前目录的图片并排序
315+
current_files = []
316+
for f in filenames:
317+
if os.path.splitext(f)[1].lower() in image_extensions:
318+
current_files.append(os.path.join(root, f))
319+
320+
# 对当前目录的文件进行自然排序后添加
321+
current_files.sort(key=natural_sort_key)
322+
files.extend(current_files)
323+
308324
if files:
309-
folder_groups[norm_path] = sorted(files, key=natural_sort_key)
325+
folder_groups[norm_path] = files
310326
except Exception as e:
311327
print(f"Error loading files from folder {norm_path}: {e}")
312328
else:
@@ -364,16 +380,31 @@ def _add_folder(self, folder_path: str):
364380
# 保存文件夹节点
365381
self.folder_nodes[folder_path] = folder_item
366382

367-
# 添加文件夹中的文件
383+
# 递归添加文件夹中的所有文件(包括子文件夹),按子文件夹顺序排序
368384
try:
369385
image_extensions = {'.png', '.jpg', '.jpeg', '.bmp', '.webp'}
370-
files = [
371-
os.path.join(folder_path, f)
372-
for f in os.listdir(folder_path)
373-
if os.path.splitext(f)[1].lower() in image_extensions
374-
]
386+
files = []
375387

376-
for file_path in sorted(files, key=natural_sort_key):
388+
# 递归遍历文件夹及其子文件夹,按子文件夹顺序排序
389+
for root, dirs, filenames in os.walk(folder_path):
390+
# 忽略 manga_translator_work 目录
391+
if 'manga_translator_work' in dirs:
392+
dirs.remove('manga_translator_work')
393+
394+
# 对子文件夹进行自然排序,确保按正确顺序遍历
395+
dirs.sort(key=natural_sort_key)
396+
397+
# 收集当前目录的图片并排序
398+
current_files = []
399+
for f in filenames:
400+
if os.path.splitext(f)[1].lower() in image_extensions:
401+
current_files.append(os.path.join(root, f))
402+
403+
# 对当前目录的文件进行自然排序后添加
404+
current_files.sort(key=natural_sort_key)
405+
files.extend(current_files)
406+
407+
for file_path in files:
377408
self._add_file_to_folder(file_path, folder_item)
378409

379410
# 更新文件夹显示的文件数
@@ -413,8 +444,8 @@ def _add_folder_group(self, folder_path: str, files: List[str]):
413444
# 保存文件夹节点
414445
self.folder_nodes[folder_path] = folder_item
415446

416-
# 添加文件列表
417-
for file_path in sorted(files, key=natural_sort_key):
447+
# 添加文件列表(保持传入的顺序,已经按子文件夹排序好了)
448+
for file_path in files:
418449
self._add_file_to_folder(file_path, folder_item)
419450

420451
# 更新文件夹显示的文件数

doc/CHANGELOG_v1.9.1.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@
2828
- 优化文件删除流程,删除单个文件不重建列表,保持文件夹展开状态
2929
- 改进文件夹路径转换逻辑,正确处理翻译后的文件夹
3030

31+
### 文件夹递归查找
32+
- 添加文件夹时默认递归查找所有子文件夹中的图片文件
33+
- 按子文件夹顺序排序,确保翻译顺序符合预期(第1话 → 第2话 → 第3话...)
34+
- 文件列表显示顺序与实际翻译顺序保持一致
35+
- 自动忽略 `manga_translator_work` 工作目录
36+
3137
### 检测和过滤
3238
- 优化最小框过滤逻辑,添加对条漫(极端长宽比图片)的特殊处理
3339
- 改进面积过滤算法,使用切割块面积作为参考,提高过滤准确性

0 commit comments

Comments
 (0)