디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[free] 검색어로 폴더와 그 하위 폴더 안의 파일을 찾아주는 프로그램

몬발켜갤로그로 이동합니다. 2024.12.24 17:54:56
조회 127 추천 0 댓글 0
														

특정한 폴더 안에서 파일을 찾는 프로그램을 완성한 후에 

저는 그 폴더 안에 하위 폴더가 있을 때에도 작동하는 프로그램을 만들고 싶었습니다. 

그래서 chaGPT에게 하위 폴더의 파일도 검색하도록 코드를 수정하라고 했습니다. 

그랬더니 프로그램을 만들어 주었습니다. 



29b9d52ae3db34a33eed98a518d604031ea82f77659c6cdadc


코드는 이것입니다. 


import os
from send2trash import send2trash
from PyQt5.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QListWidget, QFileDialog, QMessageBox, QLineEdit
)
from PyQt5.QtGui import QFont
from PyQt5.QtCore import Qt, QTimer


class FileManagerApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("File Manager")
        self.setGeometry(200, 200, 800, 500)

        # 레이아웃 설정
        self.main_layout = QVBoxLayout()
        self.setLayout(self.main_layout)

        # 버튼 및 검색어 입력 레이아웃
        self.input_layout = QHBoxLayout()
        self.main_layout.addLayout(self.input_layout)

        # 왼쪽 폴더 선택 버튼
        self.left_folder_btn = QPushButton("폴더 선택")
        self.left_folder_btn.clicked.connect(self.select_left_folder)
        self.input_layout.addWidget(self.left_folder_btn)

        # 검색어 입력
        self.search_input = QLineEdit()
        self.search_input.setPlaceholderText("검색어를 입력하세요")
        self.search_input.setMaximumWidth(200)  # 폭을 30% 정도로 줄임
        self.input_layout.addWidget(self.search_input)

        # 오른쪽 파일 찾기 버튼
        self.right_file_btn = QPushButton("파일 찾기")
        self.right_file_btn.clicked.connect(self.start_search_files)
        self.input_layout.addWidget(self.right_file_btn)

        # 폴더 창 레이아웃
        self.folder_layout = QHBoxLayout()
        self.main_layout.addLayout(self.folder_layout)

        # 왼쪽 폴더 창
        self.left_list_widget = QListWidget()
        self.left_list_widget.setFont(QFont("Arial", 12))
        self.folder_layout.addWidget(self.left_list_widget)

        # 오른쪽 폴더 창
        self.right_list_widget = QListWidget()
        self.right_list_widget.setFont(QFont("Arial", 12))
        self.folder_layout.addWidget(self.right_list_widget)

        # 현재 선택된 폴더 경로 및 오른쪽 파일 리스트
        self.current_folder = None
        self.right_files_list = []  # 오른쪽 폴더 창에 표시된 파일 리스트 저장

        # 검색 상태
        self.search_index = 0
        self.search_files_list = []

    def select_left_folder(self):
        """왼쪽 폴더 선택 및 파일 표시"""
        # 오른쪽 폴더 창 초기화
        self.right_list_widget.clear()
        self.right_files_list = []

        folder = QFileDialog.getExistingDirectory(self, "왼쪽 폴더 선택", "")
        if folder:
            self.current_folder = os.path.abspath(folder)
            # 왼쪽 폴더 창 초기화
            self.left_list_widget.clear()
            self.populate_left_list()

    def populate_left_list(self):
        """왼쪽 리스트에 폴더의 모든 파일 표시 (하위 폴더 포함)"""
        if not self.current_folder:
            return

        # 왼쪽 폴더 창 초기화 보장
        self.left_list_widget.clear()

        try:
            files = []
            for root, _, filenames in os.walk(self.current_folder):
                for file in filenames:
                    relative_path = os.path.relpath(os.path.join(root, file), self.current_folder)
                    files.append(relative_path)

            if files:
                self.left_list_widget.addItems(files)
            else:
                QMessageBox.information(self, "알림", "폴더에 파일이 없습니다.")
        except Exception as e:
            QMessageBox.critical(self, "오류", f"파일을 로드하는 중 오류가 발생했습니다: {e}")

    def start_search_files(self):
        """파일 검색 시작"""
        # 왼쪽 폴더 창 새로 고침
        self.populate_left_list()

        # 오른쪽 폴더 창 초기화
        self.right_list_widget.clear()
        self.right_files_list = []

        self.search_files_list = [self.left_list_widget.item(i).text() for i in range(self.left_list_widget.count())]
        search_query = self.search_input.text().strip()

        if not self.search_files_list:
            QMessageBox.information(self, "알림", "왼쪽 리스트에 파일이 없습니다.")
            return

        if not search_query:
            QMessageBox.warning(self, "경고", "검색어를 입력하세요.")
            return

        # 진행 상태 표시를 위한 메시지 박스
        self.progress_box = QMessageBox(self)
        self.progress_box.setWindowTitle("파일 검색 진행 중")
        self.progress_box.setStandardButtons(QMessageBox.NoButton)
        self.progress_box.show()

        # QTimer를 사용하여 비동기적으로 검색 작업 실행
        self.timer = QTimer()
        self.timer.timeout.connect(lambda: self.search_next_file(search_query))
        self.timer.start(10)  # 10ms 간격으로 작업 실행

    def search_next_file(self, search_query):
        """다음 파일 검색"""
        if self.search_index >= len(self.search_files_list):
            # 검색 완료 처리
            self.timer.stop()
            self.progress_box.close()
            self.progress_box.deleteLater()  # 메시지 박스 강제 삭제

            # 검색 완료 후 진행 상태 초기화
            self.search_index = 0

            self.update_right_list_widget()
            return

        file_name = self.search_files_list[self.search_index]
        self.search_index += 1

        # 진행 상태 업데이트
        self.progress_box.setText(f"{self.search_index}/{len(self.search_files_list)}")

        if search_query in file_name:
            self.right_files_list.append(file_name)

    def update_right_list_widget(self):
        """오른쪽 리스트 창 갱신"""
        self.right_list_widget.clear()
        self.right_list_widget.addItems(self.right_files_list)

    def keyPressEvent(self, event):
        """DEL 키로 오른쪽 리스트에서 파일 삭제"""
        if event.key() == Qt.Key_Delete:
            self.delete_selected_file()

    def delete_selected_file(self):
        """오른쪽 리스트에서 선택한 파일 삭제"""
        selected_item = self.right_list_widget.currentItem()
        if not selected_item:
            return  # 선택된 파일이 없으면 종료

        file_name = selected_item.text()
        file_path = os.path.join(self.current_folder, file_name)
        file_path = os.path.normpath(file_path)

        # 파일 삭제
        try:
            send2trash(file_path)
        except Exception as e:
            QMessageBox.critical(self, "오류", f"파일 삭제 중 오류가 발생했습니다: {e}")
            return

        # 삭제된 파일을 리스트에서 제거하고 오른쪽 창 갱신
        self.right_files_list.remove(file_name)
        self.update_right_list_widget()


if __name__ == "__main__":
    app = QApplication([])
    window = FileManagerApp()
    window.show()
    app.exec_()


추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
- 설문 현역으로 군대 안 간게 의아한 스타는? 운영자 25/06/30 - -
- AD 휴대폰 바꿀까? 특가 구매 찬스! 운영자 25/07/02 - -
1 공지 프로그램 소스 코드의 공유/수정/판매 [2] 몬발켜갤로그로 이동합니다. 24.12.24 279 2
20 fre 빨간 공 파란 공 랜덤으로 그리는 프로그램 몬발켜갤로그로 이동합니다. 05.15 20 0
19 fre textmovie -자막만 있는 동영상 [2] 몬발켜갤로그로 이동합니다. 04.10 23 0
18 fre novel 9을 또 수정했습니다 몬발켜갤로그로 이동합니다. 02.27 18 0
17 fre html 파일 분할 (장 나누기) 몬발켜갤로그로 이동합니다. 02.21 25 0
16 fre 제미나이 복붙 novel 9을 또 수정했습니다 몬발켜갤로그로 이동합니다. 02.13 40 0
15 fre 제미나이 Flash 2.0을 위한 코드를 수정하였습니다 [4] 몬발켜갤로그로 이동합니다. 02.06 50 0
14 fre 1206, flash 1.5를 위한 코드를 수정했습니다 몬발켜갤로그로 이동합니다. 02.01 23 0
13 fre 누락된 파일명 찾아내기 몬발켜갤로그로 이동합니다. 01.31 12 0
12 fre 순서가 뒤죽박죽인 html 파일 이름 바꾸기 코드 몬발켜갤로그로 이동합니다. 01.31 27 0
11 fre 순서가 뒤죽박죽인 html 파일들 해결하기 몬발켜갤로그로 이동합니다. 01.30 27 0
10 fre 1206, Flash 1.5를 위한 코드를 또 수정했습니다 몬발켜갤로그로 이동합니다. 01.28 24 0
9 fre 1206 복붙 코드를 수정하였습니다 몬발켜갤로그로 이동합니다. 01.17 23 0
8 fre 1206을 위한 복붙 [2] 몬발켜갤로그로 이동합니다. 01.13 81 0
7 일반 이런갤도 있네 프갤러(223.38) 01.10 17 0
6 일반 북스캔 코드에 관한 설명을 추가합니다 몬발켜갤로그로 이동합니다. 01.09 56 0
5 fre 북스캔 book scan 몬발켜갤로그로 이동합니다. 01.07 216 1
fre 검색어로 폴더와 그 하위 폴더 안의 파일을 찾아주는 프로그램 몬발켜갤로그로 이동합니다. 24.12.24 127 0
3 fre 검색어로 폴더 안의 파일을 찾아주는 프로그램 [2] 몬발켜갤로그로 이동합니다. 24.12.24 188 0
2 fre 파일명이 (1)로 끝나는 파일만 찾아주는 프로그램 몬발켜갤로그로 이동합니다. 24.12.24 123 1
뉴스 ‘남겨서 뭐하게’ 양세형 X 이동국 X 정지선과 함께 서해 ‘도도도’ 섬 찾는다! 디시트렌드 10:00
1
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2