디시인사이드 갤러리

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

갤러리 본문 영역

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

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

저는 유튜브에서 동영상 파일을 많이 다운로드해 두었습니다. 

이 동영상 파일들은 각자 파일명이 있습니다. 

어느 동영상을 보고 싶을 때 윈도 탐색기에서 파일을 찾는 게 시간이 걸리고 어렵습니다. 

그래서 평소에는 everything 이라는 검색 프로그램을 애용하고 있습니다. 

하지만 이게 특정한 폴더 뿐만이 아니라 컴퓨터 전체에서 파일을 찾습니다. 

(어쩌면 특정 폴더에서만 파일을 찾을 수 있게 설정할 수 있을지도 모릅니다.)

그래서 사용자가 폴더를 선택하고, 검색어를 입력하고, 파일 리스트에서 파일을 선택하여 삭제할 수 있게 만들었습니다. 



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 = [
                f for f in os.listdir(self.current_folder)
                if os.path.isfile(os.path.join(self.current_folder, f))
            ]
            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/07/07 - -
- AD 휴대폰 바꿀까? 특가 구매 찬스! 운영자 25/07/02 - -
1 공지 프로그램 소스 코드의 공유/수정/판매 [2] 몬발켜갤로그로 이동합니다. 24.12.24 280 2
20 fre 빨간 공 파란 공 랜덤으로 그리는 프로그램 몬발켜갤로그로 이동합니다. 05.15 21 0
19 fre textmovie -자막만 있는 동영상 [2] 몬발켜갤로그로 이동합니다. 04.10 24 0
18 fre novel 9을 또 수정했습니다 몬발켜갤로그로 이동합니다. 02.27 19 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 28 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 218 1
4 fre 검색어로 폴더와 그 하위 폴더 안의 파일을 찾아주는 프로그램 몬발켜갤로그로 이동합니다. 24.12.24 128 0
fre 검색어로 폴더 안의 파일을 찾아주는 프로그램 [2] 몬발켜갤로그로 이동합니다. 24.12.24 189 0
2 fre 파일명이 (1)로 끝나는 파일만 찾아주는 프로그램 몬발켜갤로그로 이동합니다. 24.12.24 124 1
뉴스 [티처스2] ‘IQ143’ 초3, 고3 수능 ‘4점 문제’ 암산으로 정복! 특급 초등영재 등장에 정승제 초흥분 “최상 수준” 디시트렌드 07.06
1
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2