STABLE v1.5.2_LATEST OPEN ISSUES 0

Moa

Last Updated

1일 전

README.md
MOA 앱 아이콘

MOA — 멀티 분할 경량 파일 탐색기

Windows 11 이상(x64)에서 하나의 창을 **자유 분할(트리형)**하고, 각 패널이 독립 탭을 가지며, 좌측 워크스페이스 목록으로 여러 벌의 탐색기 화면을 전환하는 초경량 파일 탐색기입니다. UI는 Rust의 egui(eframe/glow)로 직접 그리고, 아이콘·컨텍스트 메뉴·변경 감시·파일 실행 같은 셸 연동은 windows-rs로 Win32 API를 호출합니다 (Q-Dir의 멀티 패널 + VS Code의 자유 분할 UX 참고). FTP·FTPS·SFTP 원격 서버를 로컬 폴더와 같은 패널·탭에서 다룹니다.

MOA 화면 — 워크스페이스 사이드바, 네 갈래로 나뉜 패널, 원격 탭과 하단 전송 큐

핵심 기능

  • 워크스페이스: 좌측 사이드바에서 워크스페이스를 만들면(+ 버튼) 그 워크스페이스만의 탐색기 화면이 생기고, 항목을 고르면 즉시 전환됩니다. 워크스페이스마다 분할 구성·패널·탭·히스토리가 완전히 독립이며, 항목은 이름과 현재 폴더 경로를 2줄로 보여줍니다. 이름 바꾸기(F2·우클릭), 삭제(확인 후 — 마지막 1개는 불가), 드래그로 순서 변경을 지원합니다
  • 사이드바 조절: 경계선 드래그로 폭 변경(160~480px), Ctrl+B·타이틀바 왼쪽 버튼으로 접기/펼치기 (접힌 상태·폭도 저장됩니다)
  • 커스텀 타이틀바: 창 제목 표시줄을 앱이 직접 그립니다 — 왼쪽에 앱 아이콘과 워크스페이스 목록 표시 토글, 가운데에 활성 워크스페이스 이름, 오른쪽에 설정 메뉴와 최소화·최대화·닫기 버튼. 앱 아이콘은 docs/AppIcon.ico 한 장으로 타이틀바·작업 표시줄·실행 파일이 모두 같은 그림을 씁니다. 타이틀바 빈 영역을 끌어 창을 옮기고(화면 가장자리 스냅 지원), 더블클릭으로 최대화/복원하며, 창 가장자리·모서리를 끌어 크기를 바꿉니다. 설정 메뉴(⚙)에는 설정 · 업데이트 · 릴리즈 노트 · 오픈소스 라이선스 · 정보가 있고 다섯 항목이 모두 동작합니다설정은 아래의 설정 화면을, 업데이트는 새 버전 확인을(아래 「자동 업데이트」), 릴리즈 노트는 브라우저로 GitHub 릴리즈 페이지를, 오픈소스 라이선스는 라이선스 고지 화면을, 정보는 앱 정보 화면을 엽니다. OS 장식을 끈 대신 창 그림자·둥근 모서리와 Windows 11 스냅 레이아웃 팝업(최대화 버튼 호버 메뉴)은 없습니다. 최대화·복원·최소화는 OS 전환 애니메이션 없이 곧바로 바뀝니다 — 그 애니메이션이 바뀌기 전 화면과 새 화면을 겹쳐 페이드해 글자가 이중으로 보였기 때문입니다
  • 설정 화면: 타이틀바 설정 메뉴(⚙)의 설정으로 여는 대화이며, 여섯 묶음이 한 화면에 있습니다(항목이 창보다 길면 본문만 스크롤되고 제목·닫기는 제자리에 남습니다). 바꾸는 즉시 반영되고 저장됩니다(확인 버튼 없음).
    • 모양글꼴: PC에 깔린 글꼴 중 한글을 실제로 그리는 것만 골라 목록에 냅니다(목록은 앱이 시작할 때 백그라운드에서 미리 읽어 둡니다 — 대화를 열면 대개 곧바로 나옵니다). 고르면 곧바로 앱 전체 글꼴이 바뀌고, 기본값 (맑은 고딕)으로 되돌릴 수 있습니다
    • 시작윈도우 시작 시 실행: 켜면 HKCU\…\Run에 등록합니다(관리자 권한 불필요). 트레이 토글이 함께 켜져 있으면 부팅 시 창 없이 트레이로만 올라옵니다
    • 종료닫으면 트레이로 보내기: 켜면 ① 트레이 아이콘이 창이 떠 있는 동안에도 보이고 ② 닫기()가 종료 대신 창을 숨기며 ③ 아이콘 더블클릭이 창을 다시 최상위로 띄우고 ④ 아이콘 우클릭에 열기·종료 메뉴가 붙습니다. 창을 숨길 때도 세션을 저장합니다
    • 언어앱 언어: 시스템 기본·한국어·English 중에서 고르면 다음 프레임부터 모든 화면 문구가 바뀝니다(재시작 불필요). 시스템 기본은 Windows 사용자 UI 언어가 한국어면 한국어, 아니면 영어입니다. 드롭다운 항목 이름도 지금 언어를 따릅니다. 창 밖에 보이는 두 이름도 함께 바뀝니다 — 창 제목(작업 표시줄·Alt+Tab)과 트레이 아이콘 툴팁이며, 앱 이름은 한국어에서 모아, 영어에서 MOA입니다(설정 파일·자동 실행 등록 이름은 바뀌지 않습니다). 다만 이미 떠 있는 실패 사유(연결·전송)는 실패한 순간의 언어로 남고 다음 실패 때 새 언어로 나옵니다
    • 파일 보기 — 토글 셋입니다. 파일 확장명 표시(끄면 목록에서 이름 뒤 확장자를 뗍니다 — 폴더·..·확장자 없는 파일은 그대로) · 숨김 파일 및 폴더 표시(끄면 숨김 속성이 붙은 로컬 항목과 이름이 .으로 시작하는 원격 항목이 빠집니다) · 시스템 파일 표시(끄면 시스템 속성이 붙은 로컬 항목이 빠집니다. 기본값이 꺼짐이라 pagefile.sys·System Volume Information 같은 항목은 켜야 보입니다). 뒤의 둘은 속성마다 제 토글을 봅니다 — 두 속성이 함께 붙은 항목은 두 토글이 모두 켜져야 보이며, 이는 탐색기의 숨김 파일 표시보호된 운영 체제 파일 숨기기 조합과 같은 규칙입니다. 걸러진 뒤의 개수가 폴더·파일 개수 표시의 기준이 되고, 폴더 트리에도 같이 적용되며 바꾸면 트리가 하위 목록을 다시 읽습니다. 켜서 보이는 숨김·시스템 항목은 아이콘과 글자를 함께 흐리게(불투명도 절반) 그려 보통 항목과 구분합니다 — 탐색기와 같은 표시이며 보기 모드 8종 모두에 적용됩니다(폴더 트리는 그대로입니다). 셋 다 로컬·원격 목록에 같이 적용되지만 원격 서버에는 시스템 속성이 없어 그 토글은 원격 목록을 바꾸지 않습니다. 정렬·선택·경로 조립·파일 실행은 언제나 원래 이름을 씁니다
    • 원격원격 목록 자동 갱신: 켜면 화면에 보이는 원격 탭의 목록을 주기마다 스스로 다시 조회합니다(아래 「원격 연결」). 그 아래 갱신 주기10초·30초·1분·5분·10분 중에서 고릅니다(기본 30초). 토글을 끄면 주기 항목이 흐려지고 원격 재조회만 멈춥니다 — 끊긴 네트워크 드라이브·즐겨찾기 폴더의 재확인은 서버와 무관한 로컬 일이라 그대로 계속됩니다. 그 아래 전송 재시도 횟수1~`10중에서 고릅니다(기본3`) — 전송이 실패했을 때 스스로 다시 걸어 볼 횟수이며, 자동 갱신 토글과 무관해 언제나 고를 수 있습니다
  • 자동 업데이트: 앱을 켜면 백그라운드에서 GitHub 릴리즈의 최신 버전을 한 번 확인합니다(시작이 느려지지 않습니다). 새 버전이 있으면 타이틀바 오른쪽에 ↓ 업데이트가 뜨고, 누르면 다운로드 중...으로 바뀌며 설치 파일을 받습니다. 받는 동안에는 그 자리에 받은 비율이 함께 뜹니다(다운로드 중 42%) — 서버가 전체 크기를 알려 주지 않으면 종전대로 문구만 보입니다. 다 받으면 설치 화면이 뜨고 실행 중인 앱이 스스로 닫힌 뒤 설치가 끝나면 앱이 다시 열립니다 — 그때 받아 둔 파일은 지워집니다. 받은 파일이 릴리즈에 적힌 값과 다르면 설치하지 않고 그 파일을 지웁니다. 전송이 진행 중일 때 누르면 「지금 업데이트하면 그 전송이 중단됩니다」라고 먼저 확인합니다. 설정 메뉴(⚙)의 업데이트로 언제든 다시 확인할 수 있고, 이미 최신이면 그렇다고 알립니다. 설치 파일로 설치한 경우에만 동작합니다 — 빌드한 exe를 직접 실행할 때는 확인하지 않고 그 메뉴 항목도 비활성입니다
  • 오픈소스 라이선스 고지: 타이틀바 설정 메뉴(⚙)의 오픈소스 라이선스로 여는 대화입니다. 왼쪽에 이 앱이 쓰는 구성 요소 목록(이름·버전), 오른쪽에 고른 것의 SPDX 식별자·저작권자·라이선스 전문이 보입니다. MIT OR Apache-2.0처럼 선택형으로 선언된 것은 전문을 둘 다 싣고, 배포 패키지에 원문이 없는 것은 그 라이선스의 표준 전문을 대신 보이며 그 사유를 함께 적습니다. 크레이트가 아닌 것도 담습니다 — 정적 링크되는 libssh2·zlib과 실행 파일에 담기는 Phosphor 글꼴. 고지 자료는 실행 파일에 함께 들어 있어 네트워크 없이도 보이며, cargo run --example gen_licenses로 다시 만듭니다(의존성을 바꾸고 다시 만들지 않으면 cargo test가 실패합니다). 같은 명령이 레포 루트의 THIRD-PARTY-NOTICES.md도 함께 만듭니다 — 앱을 띄우지 않고 저장소에서 바로 보는 고지이며 같은 자료를 형식만 달리 적습니다
  • 앱 정보: 타이틀바 설정 메뉴(⚙)의 정보로 여는 작은 팝업입니다. 가운데에 앱 아이콘(96px), 그 아래에 이름과 버전이 한 줄로 섭니다(한국어 모아 0.1.0 / 영어 MOA 0.1.0). 그 아래로 저작권·라이선스·저장소 세 줄이 작은 글씨로 서고, 저장소 줄을 누르면 브라우저가 열립니다(세 줄은 두 언어에서 같은 값입니다 — 저작권 표기·라이선스 이름·주소는 번역 대상이 아닙니다). 닫기 버튼 하나가 있습니다. 버전은 Cargo.toml에서 빌드 시점에 박히므로 따로 손댈 곳이 없습니다. 아이콘은 화면 배율에 맞는 물리 픽셀 크기로 미리 줄여 그립니다 — 큰 그림을 그대로 올려 GPU가 줄이면 가장자리가 자글거리기 때문이며, 원본 자산은 cargo run --example gen_app_icon으로 다시 만듭니다
  • 중복 실행 방지: 이미 떠 있으면(창이 보이든 트레이에 숨어 있든) 새로 실행한 프로세스는 창을 만들지 않고 기존 창을 최상위로 띄운 뒤 스스로 끝납니다 — 두 프로세스가 같은 설정 파일에 서로 덮어써 세션이 깨지는 것을 막습니다
  • 자유 분할: 패널을 네 방향 중 원하는 쪽으로 중첩 분할합니다 — 새 패널이 오른쪽·왼쪽·위쪽·아래쪽 어디에 놓일지 고를 수 있습니다. 진입점은 각 패널 탭 스트립 오른쪽 끝의 패널 메뉴(그 패널이 대상)이며, 단축키는 Ctrl+Alt+←/→/↑/↓입니다. 기존 Ctrl+\(오른쪽)·Ctrl+Shift+\(아래쪽)도 그대로 동작합니다. 스플리터 드래그로 비율 조절, Ctrl+Shift+W 패널 닫기 (마지막 1개는 닫기 불가). 분할하면 패널마다 테두리가 그려져 경계가 드러나고, 지금 조작 중인 패널은 더 밝은 테두리로 구분됩니다. 새 패널은 나뉜 패널과 같은 폴더에서 시작하며, 그 패널이 원격 탭을 보고 있었으면 시작 폴더에서 시작합니다
  • 패널 메뉴: 탭 스트립 오른쪽 끝 버튼을 누르면 그 패널을 대상으로 하는 메뉴가 열립니다 — 보기(마우스를 올리면 보기 모드 8종이 펼쳐짐) · 네 방향 분할 · 새로 고침(F5) · 새 파일·새 폴더 · 닫기(Ctrl+Shift+W, 마지막 패널은 비활성). 상단 메뉴 바는 없습니다 — 항목이 모두 이 메뉴와 주소창·탭 스트립·사이드바에 있습니다
  • 패널별 탭: 탭 줄 오른쪽 +를 누르면 메뉴가 열려 새 탭등록한 사이트 목록(상태 점·이름·프로토콜)이 함께 나옵니다 — 사이트를 고르면 그 자리에서 원격 탭으로 열립니다. Ctrl+T는 메뉴를 거치지 않고 곧바로 새 탭(현재 경로 복제 — 원격 탭에서는 시작 폴더를 여는 로컬 탭), Ctrl+W 탭 닫기(마지막 탭은 패널 닫기로 연결), 탭 클릭 전환, 탭별 독립 히스토리. 탭 하나에 **폴더 아이콘·이름·닫기(×)**가 함께 들어 있고(가운데 버튼 클릭으로도 닫힙니다), 활성 탭만 배경으로 강조됩니다. 탭이 많으면 탭 영역만 가로로 스크롤되고 분할 버튼은 오른쪽 끝에 남습니다
  • 보기 모드 8종: 아주 큰 아이콘(256px) · 큰 아이콘(96px) · 보통 아이콘(48px) · 작은 아이콘(16px) · 목록 · 자세히 · 타일 · 내용. 패널 메뉴의 보기에 마우스를 올리면 펼쳐지고 현재 모드에 점이 붙습니다. 작은 아이콘은 왼→오른쪽, 목록은 위→아래로 채워 서로 다르게 흐릅니다. 모드는 패널마다 독립이며 세션에 저장됩니다
  • 썸네일 미리보기: 아이콘 4종·타일·내용 보기에서 사진·동영상·문서의 실제 미리보기를 보입니다(IShellItemImageFactory). 워커 스레드가 만들고 준비 전에는 형식 아이콘을 보여주며, 패널당 최근 200장(약 50MB)만 들고 폴더를 떠나면 즉시 놓습니다. 자세히·목록 보기는 16px 형식 아이콘을 유지합니다. 미리보기는 원본 비율을 지켜 아이콘 자리 안에 들어갑니다 — 탐색기와 같은 규칙이라 가로가 긴 사진은 위아래가 남고, 정사각형으로 늘어나지 않습니다(형식 아이콘은 본래 정사각형이라 자리를 그대로 채웁니다). 자리보다 작은 그림은 키우지 않고 원본 크기로 가운데에 놓습니다 — 이것도 탐색기와 같으며, 화면 배율을 따져 물리 픽셀 1:1을 넘기지 않습니다. 미리보기와 아이콘 모두 밉맵을 만들어 올려 큰 그림(256px)을 작은 자리에 줄여 그릴 때도 가장자리가 자글거리지 않습니다
  • 파일 목록: 자세히 보기는 이름·크기·종류·수정한 날짜 4열이며 열 경계를 끌어 폭을 조절할 수 있습니다(패널마다 독립·세션 저장). 머리글의 열 경계마다 세로 구분선이 서 있어 어디를 잡을지 보이고, 끄는 동안에는 그 경계가 목록 바닥까지 강조색으로 이어집니다. 열 폭 합이 패널보다 넓으면 가로로 스크롤되고, 폭을 넘는 글자는 모든 열에서 로 줄여 한 줄로 보입니다. 크기는 소수점 둘째자리까지 KB·MB·GB로 보입니다(1.00 KB·1.18 MB — 폴더는 빈 칸). 열 클릭 정렬(탐색기와 동일한 숫자 인지 정렬·폴더 우선)이며 정렬 기준과 방향은 패널마다 세션에 저장돼 재시작 뒤에도 남고, 보기 모드를 바꿔도 유지됩니다. 열 머리글의 가운데를 끌면 열 차례가 바뀝니다(놓일 자리에 세로선이 서고, 경계선 근처를 끌면 종전대로 폭 조절입니다 — 잡는 자리로 갈립니다). 바뀐 차례도 패널마다 저장되며 각 열의 폭은 그 열을 따라 움직입니다. 시스템 아이콘, 보이는 것만 그리는 가상 스크롤 + 백그라운드 열거(대량 폴더 UI 무정지). **다 읽었는데 항목이 하나도 없으면 이 폴더는 비어 있습니다**가 목록 자리에 서고(끌어다 놓기는 그대로 받습니다), 아직 아무것도 읽지 못한 채 읽는 중일 때는 목록 자리에 자리표시 8줄이 서고 목록 위에 읽는 중…이 붙습니다 — 이미 목록이 있는 폴더에서 다른 폴더로 옮기는 중이라면 종전 목록이 그대로 남습니다. 최근에 읽어 둔 폴더로 다시 가면 그때의 목록이 즉시 서고(자리표시가 뜨지 않습니다) 주소창·히스토리도 함께 옮겨진 뒤, 뒤에서 도는 실제 열거가 끝나면 그 결과로 갈아 끼워집니다 — 그동안 목록은 잠깐 낡아 있을 수 있습니다(폴더를 떠난 뒤의 변경은 감시하지 않으므로, 다른 앱이 그 사이에 만든 파일은 갱신이 도착해야 나타납니다). 담아 두는 것은 최근 8폴더·폴더당 5000항목까지이며, 그보다 큰 폴더는 담지 않는 대신 다 읽기 전에 먼저 보입니다 — 첫 2000항목이 정렬된 채 서고 나머지는 읽히는 대로 그 사이에 끼어듭니다. 옮겨 간 폴더가 그새 사라졌으면 원래 자리로 되돌아갑니다(앞으로 가기 목록도 그대로 남습니다)
  • 새로 만들기: 패널 메뉴의 새 폴더(Ctrl+Shift+N새 파일로 표시 중인 폴더에 만듭니다. 이름이 겹치면 (2), (3)… 번호가 붙고 기존 항목을 덮어쓰지 않습니다. 만들기는 워커 스레드에서 수행하며 실패하면 사유가 목록 위에 표시됩니다
  • 끌어다 놓아 복사: 로컬 탭에서 고른 파일·폴더를 다른 로컬 탭에 놓으면 그 폴더로 복사됩니다. 끌어온 자리에 그대로 놓으면 아무 일도 일어나지 않습니다 — 사본(- 복사본)을 만들지 않고 알림도 뜨지 않습니다(다른 탭이 같은 폴더를 보고 있을 때도 같습니다). 앱 에서 끄는 동안에는 고른 것 중 첫 항목의 반투명 그림이 커서를 따라옵니다 — 이미 만들어져 있는 미리보기가 있으면 그것이고 없으면 그 파일의 형식 아이콘이며, 여러 개를 끌어도 한 장입니다. 바탕화면·윈도우 탐색기에서 끌어온 것도 같은 방식으로 받습니다 — 로컬 탭에 놓으면 복사, 원격 탭에 놓으면 올리기가 됩니다(끌고 창 위를 지나는 동안 놓일 패널의 테두리가 강조되고, 패널 밖에 놓으면 아무 일도 일어나지 않습니다). 이쪽은 탐색기에서 같은 폴더로 끌어와도 종전대로 Windows가 복사합니다 — 위의 "그대로 놓으면 아무 일도 없음"은 앱 안에서 끄는 경우입니다. 반대로 로컬 탭에서 끌어 창 밖의 탐색기·바탕화면에 놓으면 그 자리로 복사됩니다(원격 항목은 대상이 아닙니다) — 창 밖으로 끄는 동안에는 고른 것 중 첫 항목의 그림복사 → 대상 문구가 커서를 따라옵니다(이미 만들어져 있는 미리보기가 있으면 그것이고, 없으면 그 파일의 형식 아이콘입니다). 그림이 뜨지 않아도 복사는 그대로 됩니다. 언제나 복사이며 이동하지 않습니다 — 보조키로 동작이 갈리지 않아 원본이 사라질 일이 없습니다. 복사 자체는 Windows가 합니다 — 진행률 창·같은 이름 충돌 확인·Ctrl+Z 되돌리기·권한 승격이 모두 탐색기에서 복사할 때와 같고, 탈이 났거나 그만두면 그 사실만 상태 줄에 알립니다
  • 탐색: 주소창 경로 입력(Enter), 뒤로/앞으로/상위(Alt+←/→/↑), 마우스 옆의 뒤로·앞으로 버튼(탐색기와 같습니다 — 활성 패널에 적용됩니다), 더블클릭 폴더 진입·파일 실행, 잘못된 경로 입력 시 현 위치 유지. 목록 첫 줄의 ..를 더블클릭해도 위 폴더로 갑니다 — 로컬·원격 목록 모두에 있으며, 올라갈 곳이 없는 드라이브 루트(C:\)에서는 나오지 않습니다. **이 조작들은 원격 탭에서도 그대로 듣습니다** — 주소창에 서버 안 경로가 보이고, 뒤로/앞으로는 그 탭에서 다닌 서버 폴더를 오가며, 상위는 서버 루트(/)에서만 멈춥니다(탭마다 따로 쌓이고 재시작 뒤에는 남지 않습니다)
  • 이름으로 거르기: 주소창 오른쪽 입력란에 글자를 치면 지금 보고 있는 폴더의 목록에서 그 글자를 이름에 담은 항목만 남습니다. 대소문자를 가리지 않고 이름 어디에 있어도 걸리며, 확장자 표시를 꺼 두었어도 원래 이름으로 견줍니다(txt를 치면 확장자가 안 보이는 상태에서도 걸립니다). 로컬·원격 목록 둘 다에서 되고 패널마다 따로 걸립니다. 맨 위 .. 줄은 언제나 남아 있어 필터를 켠 채로도 위로 올라갈 수 있습니다. 폴더를 옮기거나 탭을 바꾸면 입력란이 비워지며(필터가 켜진 채로 다른 폴더에 가면 빈 폴더처럼 보이기 때문입니다) 재시작 뒤에는 남지 않습니다. 같은 폴더를 다시 읽는 경우(변경 감시·F5·숨김 표시 토글)에는 치던 글자가 그대로 있습니다. 하위 폴더까지 훑는 검색은 하지 않습니다.
  • 폴더 트리: 패널별 토글(상태 줄 왼쪽 끝의 트리 아이콘 버튼 — 마우스를 올리면 폴더 트리/원격 트리가 뜹니다) — 드라이브 루트에서 지연 확장(하위 1단계만 워커 열거), 노드 클릭 시 활성 탭 이동 (단방향). 줄마다 탐색기와 같은 셸 아이콘이 붙고 드라이브는 로컬 디스크 (C:) 같은 셸 표시 이름으로 보입니다(이름을 얻지 못하면 C:\ 같은 경로로 보입니다). 원격 트리는 서버에서 아이콘을 얻을 수 없어 모든 줄이 같은 폴더 아이콘입니다. USB·외장 디스크를 꽂거나 빼면 1초 안에 드라이브 줄이 서고 사라집니다 — 전용 워커가 논리 드라이브 목록만 지켜보다 달라진 순간에 트리를 갱신하며, 아래 연결 판정과는 별개의 통로입니다(볼륨 이름 변경이나 광학 드라이브의 디스크 삽입처럼 드라이브 문자가 그대로인 변화는 아래 주기 확인이 맡습니다). 닿지 못하는 네트워크 드라이브 줄에는 아이콘 오른쪽 아래에 연결 끊김 표식(빨간 원 안의 흰 X)이 겹칩니다 — 탐색기와 같은 표시이며 누르기 전에도 보입니다(로컬 드라이브와 닿는 네트워크 드라이브에는 붙지 않습니다). 이 연결 판정은 앱이 뜰 때와 그 뒤 30초마다 워커가 다시 하고, 그 드라이브를 열어 볼 때도 갱신됩니다 — 연결이 되살아나면 다음 확인에서 표식이 저절로 사라지고, 끊기면 저절로 붙습니다(앞선 확인이 아직 돌고 있으면 새로 띄우지 않습니다). 이 확인은 설정의 원격 목록 자동 갱신을 꺼도 계속됩니다 — 서버에 묻지 않는 로컬 일입니다
  • 즐겨찾기: 로컬 폴더 트리 맨 위즐겨찾기 제목과 함께 자주 쓰는 폴더를 모아 둡니다. 바탕 화면·다운로드는 처음부터 맨 위에 서 있고 뺄 수 없습니다(그 줄은 우클릭해도 메뉴가 뜨지 않습니다. 폴더를 옮겼어도 윈도우에 물어 옮긴 자리를 가리키며, 그 폴더가 없는 PC에서는 해당 줄만 빠집니다). 트리 항목을 우클릭해 즐겨찾기에 담기로 담고(이미 담긴 폴더면 그 메뉴가 흐리게 보입니다), 사용자가 담은 즐겨찾기 줄을 우클릭해 해제로 뺍니다. 목록과 아래 트리 사이에는 가로 구분선이 서고, 하나도 없으면 제목도 목록도 구분선도 나오지 않습니다. 사용자가 담은 항목은 폴더 이름으로, 기본 두 줄은 윈도우가 쓰는 이름(바탕 화면)으로 보이며 마우스를 올리면 전체 경로가 뜨고, 누르면 활성 탭이 그 폴더로 갑니다. 목록은 앱에 하나뿐이라 모든 워크스페이스·패널·탭이 같은 것을 보고 재시작해도 남습니다. 사용자가 담은 항목은 끌어서 차례를 바꿀 수 있고(놓일 자리에 가로선이 서며, 조금 움직인 것은 클릭으로 처리돼 그 폴더로 갑니다) 바뀐 차례도 저장됩니다 — 기본 두 줄은 끌리지 않고 그 위로 놓을 수도 없습니다. 가리키는 폴더가 사라진 항목은 흐린 글씨로 남고 눌러도 이동하지 않습니다 — 자동으로 지우지 않으므로 잠시 끊긴 네트워크·USB 폴더가 조용히 사라지지 않고, 다시 생기면 정상으로 돌아옵니다(우클릭 해제로 직접 뺄 수 있습니다). 이 확인도 30초마다 워커가 합니다. 원격 트리에는 즐겨찾기가 없습니다
  • 항목 수 표시: 목록 위 오른쪽 끝에 폴더 20 파일 10 형식으로 폴더·파일 개수를 나눠 보입니다. 상위 이동(..) 줄은 이 폴더에 든 것이 아니라 세지 않습니다
  • 원격 연결 (FTP·FTPS·SFTP): 사이드바 +(연결 메뉴)나 사이트 관리자에서 사이트를 등록해 원격 탭을 엽니다. 원격 탭은 로컬 탭과 같은 자리에서 같은 목록·정렬·보기 모드를 쓰며, 탭 배지가 연결 단계(연결 없음·연결 중…·프로토콜 이름)를 보입니다. 주소창에 ftp://·sftp:// 주소를 넣어 바로 열 수도 있습니다. 원격 탭의 주소창에는 그 서버 안 경로만 보이고(/var/www — 호스트·프로토콜은 붙지 않습니다), 그 칸에 경로를 쳐서 Enter를 누르면 같은 서버 안에서 그리로 옮깁니다(/로 시작하지 않으면 보고 있는 폴더 아래로 봅니다). 그 자리를 열지 못하면 옮기기 전 폴더로 되돌아옵니다. 사이드바에 사이트가 하나도 없으면 그 자리에 + 를 눌러 서버를 등록하세요가 서고, 사이트 행 우클릭의 **삭제**는 목록에서 빼는 동시에 그 사이트의 연결을 끊고 그 사이트를 가리키는 원격 탭을 닫으며 전송 큐 항목도 지웁니다 — 그래서 하단 전송 큐 화면의 연결별 탭에서도 그 서버가 곧바로 사라집니다. 진행 중이거나 기다리는 전송이 있을 때만 확인을 받고, 없으면 바로 지웁니다. 사이트 자체는 사이트 관리자에 그대로 남아 다시 연결할 수 있습니다(지운 뒤 그 사실을 알리는 알림이 뜹니다). 연결에 실패하면 서버가 준 사유와 함께 그 실패에 맞는 안내가 붙고(연결 실패면 암호화 설정, 로그인 거절이면 사용자 이름·비밀번호, 지문 문제면 지문 확인), 주 동작인 재시도가 굵게 강조됩니다. 서 있던 연결이 도중에 끊기면(유휴 타임아웃·네트워크 끊김) 그 탭이 같은 실패 화면으로 바뀌어 연결이 끊어졌습니다 — <서버가 준 사유>를 보이고, 재시도를 누르면 그 자리에서 다시 붙어 보던 폴더가 그대로 섭니다 — 끊긴 뒤에도 낡은 목록이 남아 있으면 지우거나 이름을 바꿔 보고 나서야 끊긴 것을 알게 되기 때문입니다. 이 판정은 명령이 실패했을 때 서버에 연결 확인을 한 번 보내 내리므로, 방화벽에 데이터 연결만 막힌 경우처럼 서버와의 통로가 살아 있는 실패는 끊김으로 보지 않습니다. 파일 전송이 실패했을 때도 같은 확인을 거칩니다 — 목록이나 파일 작업만이 아닙니다. 화면에 보이는 원격 탭은 목록을 주기마다 스스로 다시 조회합니다(기본 30초 — 설정의 원격 묶음에서 끄거나 주기를 바꿉니다). 서버가 변경을 알려 주는 감시가 아니라 다시 묻는 것입니다. 전송이 도는 중과 그 패널을 막 조작한 직후에는 건너뛰고, 조회 결과가 직전과 같으면 목록을 갈아 끼우지 않아 고른 항목과 스크롤이 흔들리지 않습니다(달라졌으면 갈아 끼우되 고르던 것을 이름으로 되살립니다). 이 조회는 서버 로그에 성공 기록을 남기지 않고 실패만 남깁니다 — 30초마다 두 줄씩 쌓이면 사용자가 실제로 한 조작의 기록이 밀려나기 때문이며, 같은 이유로 그 실패는 화면 알림도 띄우지 않습니다. 연결이 끊긴 탭에는 이 조회를 보내지 않습니다 — 다시 붙기 전까지는 주기가 와도 건너뜁니다(스스로 다시 연결하지는 않습니다)
  • 사이트 관리자: 이름·프로토콜(FTP/FTPS/SFTP)·호스트·포트·로그온 유형(익명/일반/키 파일)·사용자·비밀번호·키 파일 경로와 키 암호·전송 모드·동시 연결 수 제한·문자 인코딩을 다룹니다. 비밀번호와 키 암호는 Windows DPAPI로 봉인해 저장하며 파일에는 평문이 남지 않습니다. DPAPI는 이 PC·이 계정에 묶여 있어 설정 파일만 복사해서는 다른 PC에서 비밀번호가 풀리지 않는데, 그럴 때는 아래 내보내기를 쓰면 됩니다. SFTP는 개인 키 파일로도 접속합니다 — 로그온 유형에서 키 파일을 고르면(그 선택지는 SFTP를 골랐을 때만 보입니다) 키 파일 경로와 키 암호 칸이 열리고 비밀번호 칸이 잠깁니다. 경로는 찾아보기로 고르며, 암호를 걸지 않은 키는 암호 칸을 비워 두면 됩니다. 인증에 실패하면 서버가 준 사유를 그대로 보입니다. 로그온 유형을 바꿔 저장하면 그 수단에 쓰지 않는 비밀은 지워집니다 — 키 파일로 바꾸면 담아 둔 비밀번호가, 비밀번호로 되돌리면 키 경로와 키 암호가 사라집니다. 에이전트(Pageant·OpenSSH) 인증은 지원하지 않습니다. SFTP는 서버 지문을 처음 볼 때 확인을 받고, 지문이 바뀌면 경고합니다. 삭제(D)는 확인 대화를 거칩니다 — 주소와 로그인 정보가 함께 사라지고 되돌릴 수 없기 때문입니다. 전송 모드 세 선택지(기본·능동형·수동형)에는 무슨 일이 일어나는지 알려 주는 설명이 툴팁으로 붙습니다. 목록 아래 새 사이트를 누르면 빈 항목이 곧바로 목록에 생기고 오른쪽 칸이 그 항목을 가리킵니다 — 주소를 적어 확인(O)을 눌러야 등록이 끝나며, 주소를 적지 않은 항목은 사이드바 연결 목록·+ 연결 메뉴·새 탭 메뉴에 서지 않습니다(붙을 곳이 없어 골라도 연결되지 않기 때문입니다). 그런 항목도 사이트 관리자 목록에는 그대로 남아 나중에 이어서 채울 수 있고, 지우려면 삭제(D)를 씁니다. 목록은 끌어서 차례를 바꿉니다 — 놓일 자리에 가로선이 그어지고, 그 차례가 곧 사이드바에 서는 차례이자 다시 켜도 남는 차례입니다. 사이트가 많아 목록 칸을 넘치면 스크롤됩니다. 목록의 항목을 더블클릭하면 그 자리에서 이름을 고칩니다. 항목을 오른쪽 버튼으로 누르면 이름 바꾸기·삭제·복사 메뉴가 뜨고, 누른 항목이 함께 골라집니다 — 셋은 위 버튼 줄과 같은 일을 합니다(복사복제(I)와 같이 사이트를 하나 더 만듭니다). 목록 칸의 빈 자리를 오른쪽 버튼으로 누르면 새 사이트·내보내기·가져오기 메뉴가 뜹니다 — 아래 버튼 줄과 같은 일이며, 등록된 사이트가 없으면 내보내기는 잠깁니다
  • 사이트 목록 내보내기·가져오기: 사이트 관리자 좌측의 내보내기를 누르면 저장할 자리만 고르면 됩니다 — 등록된 사이트 전부가 파일 하나(.moasites)에 담기며, 주소·계정·전송 설정은 물론 비밀번호까지 함께 들어가 다른 PC에서도 그대로 되살아납니다. 적을 암호도, 확인하는 물음도 없습니다. 키 파일 사이트는 그 경로까지 담기지만 키 암호는 담기지 않습니다 — 가져온 뒤 한 번 입력해 주세요. 다만 그 파일을 가진 사람은 MOA로 열 수 있으니 아무에게나 건네지 마세요 — 파일 자체가 아이디·비밀번호나 마찬가지입니다. 가져오기는 그 파일을 골라 목록에 합칩니다 — 주소·포트·프로토콜·아이디가 모두 같은 사이트가 이미 있으면 겹치는 목록을 보여 주고 덮어쓰기·건너뛰기·취소를 묻습니다. 덮어써도 그 사이트로 열어 둔 탭과 전송 큐는 그대로 이어집니다
  • 업로드 하위 메뉴: 로컬 목록에서 우클릭하면 업로드 줄이 서고, 그 아래에 같은 워크스페이스에서 연결된 원격 탭들이 붙습니다(배경으로 밀어 둔 탭도 나옵니다). 줄에는 사이트 이름과 그 탭이 보고 있는 마지막 폴더 이름만 적히고(웹서버 › htdocs, 루트면 사이트 이름만), 고르면 그 폴더로 지금 고른 것을 올립니다 — 끌어다 놓기와 같은 길이라 같은 이름 확인도 그대로 거칩니다. 연결된 원격 탭이 하나도 없으면 그 줄은 흐리게 보이고, 빈 곳 우클릭에는 서지 않습니다(올릴 것이 없습니다).
  • 원격 항목의 경로로 복사: 원격 목록에서 우클릭하면 고른 항목의 서버 안 경로를 클립보드에 담습니다(여럿이면 한 줄에 하나씩). 호스트·프로토콜은 붙이지 않습니다. 연결이 끊긴 탭에서도 눌립니다 — 이미 손에 있는 글자를 담을 뿐이라 서버에 닿지 않습니다.
  • 전송 큐: 목록 사이 끌어다 놓기(로컬 ↔ 원격, 폴더는 하위까지 펼쳐서)와 원격 메뉴의 받기·올리기로 큐에 담깁니다. 끄는 동안에는 로컬끼리의 복사와 마찬가지로 첫 항목의 반투명 그림이 커서를 따라옵니다(원격 항목은 미리보기가 없어 형식 아이콘입니다). 전송이 끝나면 그 폴더를 보고 있는 원격 목록이 저절로 다시 읽힙니다 — 손으로 새로 고칠 필요가 없습니다(여러 건을 보낼 때는 한꺼번에 묶어 다시 읽어 서버를 헛되이 두드리지 않습니다). 어디로 갈지는 전송 대상 탭이 정합니다 — 마지막으로 누른 패널의 활성 탭이 그 종류(로컬/원격)의 목적지가 되고, 그 탭은 폴더 아이콘 대신 받기(↓)·올리기(↑) 아이콘을 답니다(다른 탭을 보는 동안에도 유지됩니다). 담기 전에 대상에 같은 이름이 있는지 확인해 있으면 목록을 보여 주고 덮어쓰기·건너뛰기·취소를 묻습니다 — 세 버튼은 그 전송 전체에 한 번에 적용되고, 답하기 전에는 아무것도 큐에 들어가지 않습니다(대상을 조회하지 못하면 확인을 건너뛰고 전송합니다). 전송이 실패하면 스스로 다시 겁니다 — 설정의 원격 묶음에서 정한 횟수(1~10, 기본 3)만큼이고, 사이에 1 → 2 → 4초로 늘어나는 지연을 둡니다(60초까지). 사용자가 누른 전송 취소는 대상이 아니며 로 멈춘 것도 횟수를 먹지 않습니다. 다시 도는 동안 상태 열에 재시도 2/3이 붙고, 끝내 실패하면 사유 뒤에 (4회 시도)가 붙습니다. 손으로 누른 다시 시도는 그 횟수를 0으로 되돌립니다. 하단 도크의 큐 화면에서 진행률·속도·남은 시간을 보고 일시 정지·취소·다시 시도할 수 있으며(도크 탭은 전송 큐·성공·실패 세 필터를 모아 두고 구분선 뒤에 서버 로그가 섭니다, 우측 아이콘 넷에는 툴팁이 붙고 멈춘 동안에는 일시 정지 아이콘이 다시 시작 모양으로 바뀝니다, 크기는 파일 목록과 같은 규칙으로 보입니다 — 다만 서버가 크기를 알리지 않으면 입니다, 보일 것이 없으면 아직 전송한 파일이 없습니다가 섭니다), 끊긴 전송은 .part 파일에서 이어받습니다. 전송 취소를 누른 항목은 목록에서 사라지지 않고 취소됨으로 남습니다실패 탭에 서고 그 자리에서 다시 시도로 다시 걸 수 있습니다(재시작하면 남지 않습니다). 전송이 온전히 끝나지 못한 FTP 연결은 다시 세웁니다 — 중단할 때 서버가 주는 응답이 서버마다 달라 그대로 쓰면 그 뒤의 명령이 어긋나기 때문입니다(잠깐 「연결 중」으로 보였다가 이어집니다). 취소·실패는 물론 전송을 시작하지도 못한 실패까지 그 대상입니다. 연결이 끊긴 서버의 전송은 다시 걸지 않고 대기 중으로 둡니다 — 죽은 연결로 보내 봐야 그 자리에서 실패할 뿐이라, 그 탭에서 다시 연결하면 기다리던 것이 저절로 이어집니다. 아래 줄의 연결별 탭(전체·서버별)에 붙는 건수는 지금 고른 필터를 따릅니다성공 탭이면 성공 건수, 실패 탭이면 실패 건수이고, 그 필터에 걸리는 항목이 없는 서버도 탭 자리는 남습니다(서버 로그 화면에서는 셀 대상이 없어 건수를 적지 않습니다). 행을 클릭하면 그 행이 선택됩니다 — 파일 목록과 같은 규칙이라 Ctrl을 누른 채 누르면 하나씩 더하거나 빼고, Shift를 누른 채 누르면 그 사이가 통째로 잡힙니다. 고른 행은 파일 목록과 같은 색으로 칠해집니다. 위 필터 탭이나 아래 연결별 탭을 바꾸면 고른 것이 풀리고(보이는 목록이 통째로 바뀝니다), 목록에서 사라진 항목도 선택에서 빠집니다. 고른 것은 저장되지 않아 다시 켜면 비어 있습니다. 행을 우클릭하면 그 상태에 맞는 메뉴가 뜨고, 그 메뉴는 고른 것 전부에 걸립니다 — 여러 줄을 골라 놓고 다시 시도를 누르면 고른 것이 전부 다시 걸립니다(고르지 않은 행을 우클릭하면 그 행만 골라 메뉴를 엽니다). 실패한 행과 취소한 행다시 시도·전체 다시 시도·삭제·전체 삭제, 끝난 행은 삭제·전체 삭제, 진행 중·대기 행은 전송 취소·전체 삭제입니다(여러 상태를 함께 골랐으면 그중 하나라도 해당하는 항목이 섭니다)(전송 취소취소됨으로 남기고 삭제는 목록에서 지웁니다 — 상태별로 한 쪽만 보입니다. 전체 다시 시도는 보이는 목록에 다시 걸 것이 있을 때만 섭니다). 전체 …의 대상은 지금 보고 있는 목록 — 위 필터와 아래 연결별 탭이 함께 거른 그것입니다. 열 구성은 탭마다 다릅니다전송 큐 탭은 방향·로컬 파일·원격 파일·서버·크기·진행률·상태 일곱 열이고, 성공 탭은 진행률·상태 대신 시간(시작 ~ 완료를 한 칸에, 오늘이면 시각만 적고 아니면 앞에 MM-DD를 붙입니다) 여섯 열이며, 실패 탭은 거기에 **이유**가 붙은 일곱 열입니다 — 서버가 준 실패 사유이고, 취소한 항목에는 사용자 취소가 적힙니다. 큐 표의 열도 파일 목록과 같은 규칙으로 다룹니다 — 경계를 끌면 폭이 바뀌고(구분선·가이드도 같습니다), 머리글 가운데를 끌면 열 차례가 바뀌며(놓일 자리에 세로선이 섭니다), 머리글 우클릭 메뉴에서 열을 끄고 켤 수 있습니다방향·로컬 파일·원격 파일 셋은 무엇을 어디서 어디로 옮기는지를 정하는 열이라 체크된 채 비활성입니다. 폭·차례·끈 열은 탭마다 따로 세션에 저장되고, 차례를 바꿔도 각 열의 폭은 그 열을 따라 움직입니다 — 폭 합이 표보다 좁으면 그 탭의 마지막 열이 남는 자리를 채웁니다. 상태 표시줄에 전체 진행과 실패 건수가 요약됩니다(취소한 것은 실패로 세지 않습니다 — 탭 배지는 보이는 목록과 수를 맞추려 함께 셉니다)
  • 원격 파일 작업: 원격 목록 우클릭 메뉴로 받기·올리기·이름 바꾸기·권한 변경(8진 3자리 ↔ 체크박스 9개)·삭제·새 폴더·새로 고침. 받기·올리기의 목적지는 위 전송 대상 탭이 정하고, 대상이 없으면 그 항목이 비활성입니다. 삭제는 확인 대화를 거치며, 파일이면 파일 삭제 명령을·폴더면 폴더 삭제 명령을 앱이 알아서 보냅니다(안에 든 것까지 지우는 재귀 삭제는 없습니다 — 비어 있지 않은 폴더는 서버가 거절하고 그 사유가 남습니다). 서버가 지원하지 않는 작업(예: SITE CHMOD)은 사유가 상태 표시줄과 서버 로그에 남습니다
  • 원격 트리·서버 로그: 같은 토글이 원격 패널에서는 원격 트리(툴팁)가 되어 서버 폴더를 지연 확장하고(한 번 읽은 폴더는 다시 묻지 않습니다), 하단 도크의 로그 화면에 서버와 주고받은 명령·응답이 남습니다(비밀번호는 가려집니다). 로그는 마우스로 끌어 원하는 부분만 골라 복사할 수 있고(Ctrl+C), 로 통째로 복사할 수도 있습니다 — 화면에 보이는 줄이 선택 대상이며 긴 줄은 로 잘려 보이지만 그 줄을 전부 고르면 원문이 복사됩니다. 고른 뒤 오른쪽 버튼을 눌러도 선택이 풀리지 않고 복사 메뉴가 뜹니다 — 눌러 담는 것은 Ctrl+C와 같고, 고른 것이 없으면 그 메뉴는 흐리게 보입니다
  • 컨텍스트 메뉴: 우클릭(다중 선택 지원)하면 Windows 11 탐색기와 같은 모양의 메뉴를 앱이 직접 그립니다 — 맨 위 아이콘 줄(잘라내기·복사·이름 바꾸기·삭제 — 아이콘 아래에 이름이 붙고, 메뉴 폭은 그 이름이 잘리지 않게 실제 글자 폭을 재서 정합니다), 그 아래 탐색기와 같은 차례의 표준 항목들(열기·연결 프로그램·경로로 복사·다음으로 압축·속성 등 — **압축 파일을 골랐으면 그 자리가 압축 풀기**로 바뀝니다), 그 다음 앱 확장(설치한 확장 프로그램 항목을 한 겹으로 묶습니다 — 사라지는 것이 아니라 한 단계 뒤로 갑니다), 맨 아래 **기본 메뉴**입니다. 셸이 그림을 주지 않는 표준 줄에는 앱이 아이콘을 붙입니다 — 탐색기는 모든 줄에 아이콘이 있는데 우리가 읽는 목록에는 그림이 없는 줄이 섞여 있기 때문입니다(앱 확장 하위 줄은 그대로 둡니다 — 서로 다른 확장에 같은 아이콘을 붙이면 구분이 사라집니다). 오른쪽 끝에 단축키 표기, 하위 메뉴가 있는 줄에는 화살표가 붙고 마우스를 올리면 그 하위 메뉴가 펼쳐집니다(다른 줄로 옮기면 접힙니다). 하위 메뉴는 그것을 연 줄 옆에 뜹니다 — 화면 아래로 넘치면 위로 밀려 들어옵니다. 표준인지 확장인지는 Windows가 그 항목에 붙인 이름으로 가리고, 그 이름이 없으면 화면 문구로 한 번 더 봅니다 — 둘 다 모르는 항목은 숨기지 않고 앱 확장에 둡니다. 앱이 세우는 세 줄이 있습니다즐겨찾기에 추가(폴더 하나를 골랐을 때와 빈 곳 우클릭에서 열리며, 이미 담긴 폴더면 흐리게 보입니다) · 새 탭에서 열기(폴더 하나일 때만 섭니다) · 붙여넣기(빈 곳 우클릭에서만 서고 클립보드가 비면 흐리며 오른쪽에 Ctrl+V가 붙습니다). 가운데 것은 Windows가 주지 않는 항목이고, 나머지 둘은 Windows가 주는 같은 이름의 항목을 대신합니다 — 즐겨찾기 쪽은 탐색기의 홈에 고정하는 것이라 다른 곳을 가리키고, 붙여넣기 쪽은 Windows가 클립보드가 비면 그 줄 자체를 주지 않아 흐린 상태를 만들 수 없습니다. 기본 메뉴를 누르면 종전의 Windows 표준 메뉴가 그대로 뜹니다 — 그림으로 직접 그리는 확장 항목(문자열이 없어 우리가 읽을 수 없는 것)은 그쪽에 나옵니다. 빈 영역 우클릭은 폴더 배경 메뉴로 붙여넣기·새로 만들기·속성이 서고(목록이 화면을 다 채우지 않을 때 — 맨 위 붙여넣기가 앱이 세우는 줄입니다), 두지 않는 줄이 있습니다공유(Windows가 주는 두 벌 모두)·메뉴 사용자 지정·셸의 즐겨찾기 항목 둘, 그리고 시작 화면에 고정·이전 버전 복원·보내기·Microsoft Defender(으)로 검사·Copilot에게 질문하기, 그리고 **Windows가 주는 붙여넣기**입니다(Copilot 줄은 이 PC에서 관측되지 않아 문구로만 걸어 두었고, 붙여넣기는 사라지는 것이 아니라 앱 줄로 바뀝니다). 아이콘 줄의 넷은 모두 앱이 직접 하고, 나머지 항목의 실행은 셸에 맡깁니다
  • 다음으로 압축: 경로로 복사 아래에 서는 하위 메뉴입니다. 맨 위 Zip 파일Windows 기본 압축이고(탐색기의 보내기 > 압축(ZIP) 폴더와 같은 것이라 압축·이름 충돌·진행률·취소가 전부 Windows 것입니다), 그 아래로 이 PC에 설치된 압축 프로그램의 항목이 붙습니다. 압축 프로그램이 없어도 Zip 파일 줄은 섭니다. 탐색기의 같은 메뉴에 있는 TAR 파일·추가 옵션은 없습니다 — 그쪽은 Windows 11의 새 메뉴 전용이라 앱이 읽는 목록에 오지 않습니다
  • 압축 풀기: 압축 파일을 고르면 다음으로 압축 자리가 이 줄로 바뀝니다. Windows 기본 압축 풀기(T)...과 설치된 압축 프로그램의 항목이 함께 섭니다 — 차례는 Windows가 준 그대로입니다(실측한 PC에서는 기본 항목이 맨 위였습니다) — 이쪽은 Windows가 메뉴로 주므로 앱은 끌어올리기만 합니다(종전에는 앱 확장 안에 묻혀 있었습니다). 문구에 「풀기」가 없는 항목(파일 이름이 문구 전체인 것)은 앱 확장에 그대로 남습니다
  • 이름 바꾸기·삭제·클립보드: 로컬 목록에서 F2를 누르면 그 자리에서 이름을 고칩니다 — 확장자 앞까지 미리 선택되고(report.tar.gzreport.tar), Enter가 확정, Esc·다른 곳 누르기가 취소입니다. 폴더가 밖에서 바뀌어도 고치던 줄을 이름으로 다시 찾아 편집이 이어지고, 탭을 옮기면 접힙니다. Delete는 휴지통으로, Shift+Delete는 곧바로 지웁니다(확인 대화는 Windows가 띄웁니다). Ctrl+C·Ctrl+X·Ctrl+VWindows 표준 형식(CF_HDROP + Preferred DropEffect)을 쓰므로 탐색기와 서로 오갑니다 — 잘라낸 항목은 흐리게 보이고, 붙여넣거나 다른 것을 담으면 그 표시가 풀립니다. 원격 탭에서는 F2·Delete·Ctrl+Shift+N이 원격 대화로 이어지고 클립보드는 동작하지 않습니다(원격에는 대응 개념이 없습니다 — 전송은 큐가 맡습니다)
  • 변경 자동 새로고침: 표시 중 폴더를 감시(ReadDirectoryChangesW)해 외부 변경 시 300ms 디바운스 후 자동 갱신, F5 수동 새로 고침
  • 탐색기 단축키: Ctrl+Shift+N 새 폴더 · Alt+← 뒤로 · Alt+→ 앞으로 · Alt+↑ 상위 폴더 · F5 새로 고침 · F2 이름 변경 · Delete 휴지통으로 · Shift+Delete 영구 삭제 · Ctrl+C 복사 · Ctrl+X 잘라내기 · Ctrl+V 붙여넣기. 마우스에 옆 버튼이 있으면 그 둘도 뒤로·앞으로로 동작합니다. 여기에 앱 고유의 Ctrl+T/Ctrl+W(탭)·Ctrl+Alt+←/→/↑/↓(분할)·Ctrl+Shift+W(패널 닫기)·Ctrl+B(사이드바)가 더해집니다. F2·Delete는 마지막으로 누른 영역이 받습니다 — 사이드바 카드를 누른 뒤 F2는 워크스페이스 이름 편집이고, 파일 목록을 누른 뒤라면 파일이 대상입니다(워크스페이스 삭제에는 키를 배정하지 않았습니다 — 사이드바 우클릭 메뉴로 지웁니다)
  • 세션 저장/복원: 무엇이 바뀌든 곧(0.4초 안에) 저장합니다 — 종료를 기다리지 않아 강제 종료·전원 차단에도 남습니다. 담기는 것은 워크스페이스 목록·각 워크스페이스의 분할 구성과 탭(로컬 경로·원격 사이트와 경로패널별 보기 모드와 열 폭·정렬 기준과 방향·열 차례·전송 큐 표의 열 폭·차례·끈 열(탭마다 한 벌씩)·사이드바 폭/접힘·창 위치/최대화에 더해 등록한 사이트·끝나지 않은 전송 큐(시작·완료 시각까지)·도크의 큐 필터실행 파일과 같은 폴더의 settings.json에 저장, 재시작 시 복원합니다. 다만 하단 도크가 열려 있었는지는 저장하지 않습니다 — 앱은 언제나 도크가 닫힌 채로 시작하며(다시 열면 보던 필터와 열 폭이 그대로입니다), 트레이로 숨겼다 다시 부를 때는 같은 실행이라 보고 있던 그대로입니다. 재시작해도 서버에 자동으로 연결하지 않고 전송도 스스로 재개하지 않습니다 — 원격 탭은 연결 없음으로, 큐는 대기·실패인 채로 섭니다. 되살아난 원격 탭은 다시 연결 버튼을 보이며, 누르면 그 사이트로 붙어 저장된 폴더의 목록을 바로 보입니다(사이트를 지운 뒤 남은 탭은 붙을 곳을 모르므로 종전대로 주소 입력 안내를 보입니다). 화면이 여럿이면 지난번 그 화면에 되살립니다 — 화면마다 배율이 달라도 창이 있던 쪽을 찾아 그 화면의 작업 영역만 하게 띄우고, 그 화면을 뽑았거나 배치가 바뀌어 저장된 자리가 어디에도 없으면 주 화면 안으로 들여옵니다. 옛 형식(v2) 파일은 그대로 승격되어 살아납니다. 재시작 직후에는 활성 워크스페이스의 탐색기만 생성하고 나머지는 선택할 때 만듭니다(메모리 절약). 손상·구버전 파일은 기본 레이아웃으로 폴백합니다
  • 다크 테마: 창 전체(타이틀바·파일 목록·폴더 트리·주소창·탭·워크스페이스 사이드바)를 고정 다크 스타일로 표시합니다(전환 UI 없음). 타이틀바는 앱이 직접 그리고, 패널 메뉴 팝업도 앱 팔레트를 따릅니다. 우클릭 셸 메뉴는 Windows 다크 정책을 따릅니다
  • 팝업 공통 규격: 확인·입력 대화부터 설정·사이트 관리자까지 모든 팝업이 같은 모양입니다 — 네 모서리가 둥글고(12px), 하단 버튼은 팝업 좌우 끝까지 닿아 개수만큼 균등하게 나뉘며 그 사이를 가는 구분선이 가릅니다. 마우스를 올린 칸만 배경이 밝아지고, 그 대화의 주 동작(확인·삭제·연결 등)은 글자가 굵습니다. 본문은 버튼 줄에서 한 칸 떨어져 있어 목록·표의 테두리가 버튼 구분선과 겹쳐 보이지 않습니다. 글자를 받는 팝업(이름 바꾸기·새 폴더·권한 변경의 8진수 칸)의 입력칸은 테두리를 두른 어두운 웰이라 포커스가 없어도 어디에 입력하는지 보이며, 사이트 관리자 폼의 입력 필드와 같은 규격입니다. 이 규격은 src/ui/dialog.rs 한 곳에 있어 앞으로 더할 팝업도 자동으로 같은 모양이 됩니다. 우클릭 메뉴·드롭다운은 별도 부품으로, 모서리를 6px로 통일해 두었습니다 — 값의 정본은 src/ui/theme.rs 한 곳이라 메뉴마다 따로 적지 않아도 같은 모양이 됩니다
  • 한국어·영어 UI: 화면 문구는 한 곳(src/i18n)의 카탈로그를 거칩니다 — 키 하나에 두 언어를 함께 적고, 한쪽을 빠뜨리면 컴파일되지 않습니다. 서버가 보낸 응답 원문(530 Login incorrect 등)과 FTP 명령어는 번역하지 않고 그대로 싣습니다
  • 긴 경로(260자+)·유니코드 파일명, Per-Monitor v2 DPI

성능 실측 (release, 2026-07-28): 시작→창 표시 중앙값 133ms(2회차 이후) · 1워크스페이스·2패널 유휴 메모리 137.6MB · 워크스페이스 5개 방문 124.1MB · 10만 파일 폴더 진입 후 143.8MB, 목록 렌더 p95 0.63ms — PRD NFR-1·2(150MB)·3·8(200MB) 충족

원격 기능 추가 후 실측 (release, 2026-08-05, 같은 PC·3회 중앙값): 시작→창 표시 94ms(추가 전 같은 조건 114ms) · 유휴 메모리 127.9MB(추가 전 129.6MB) — 회귀 없음(재시작 시 자동 재연결을 하지 않아 시작 경로가 늘지 않습니다). 1GB 동시 4건 전송 중 작업 집합 증가 396KB(임계 50MB) · 1만 항목 원격 폴더 조회 왕복 4ms(가짜 서버) · exe 5.06MB → 7.14MB(+2.09MB — suppaftp·ssh2와 그 TLS/암호 의존성 몫)

설정 화면 추가 후 실측 (release, 2026-08-14, 기본 레이아웃·5회 중앙값): 시작→창 표시 277ms · 유휴 메모리 173.8MB · exe 7.69MB(추가 전 7.14MB). 유휴 메모리가 NFR-2 기준(150MB)을 넘지만 설정 화면 작업이 낸 회귀는 아닙니다 — 이 기능이 하나도 들어가지 않은 직전 커밋(6fe19e0)을 같은 PC·같은 조건(설정 파일을 지운 기본 레이아웃, 5회 중앙값)으로 따로 빌드해 재니 172.9MB로 사실상 같았습니다(시작 시간도 378ms로 오히려 느렸습니다). 트레이·글꼴·자동 실행을 하나씩 빼 보는 추가 분리는 하지 않았습니다 — 전체를 넣은 것과 뺀 것의 차이가 0.9MB(측정 편차 범위)라 나눌 몫이 없기 때문입니다. 2026-08-05 측정치(127.9MB)와의 45MB 차이는 원인을 밝히지 못했고, 같은 코드에서도 그만큼 나오므로 측정 환경(그래픽 드라이버·OS 상태)이 달라진 몫으로 보고 있습니다.

실행 방법

cargo run              # 디버그 실행
cargo build --release  # 배포 빌드 (단일 exe, 약 8.6MB)

요구 사항: Rust stable(1.80+, msvc 툴체인), Windows 11 이상.

검증: cargo test(단위테스트), cargo clippy --all-targets -- -D warnings, cargo fmt --check

설치 파일 만들기

winget install NSIS.NSIS          # 처음 한 번 (설치 파일 생성 도구)
cargo build --release
cargo run --example gen_installer # → target/installer/MOA-Setup-<버전>.exe

NSIS가 없으면 그 안내와 함께 실패로 끝납니다(빈 결과를 성공으로 알리지 않습니다). cargo build --release를 건너뛰어 target/release/moa.exe가 소스보다 낡았을 때도 같은 방식으로 멈춥니다.

설치 파일로 설치할 때

  • 관리자 권한을 묻지 않습니다%LOCALAPPDATA%\Programs\MOA에 사용자 단위로 설치합니다. 설치 폴더는 고를 수 없습니다 — 설치 위치 화면은 종전대로 보이지만 경로 입력란과 「찾아보기」가 잠겨 있습니다.
  • 설치를 시작하면 실행 중인 MOA를 자동으로 닫습니다 — 먼저 정상 종료를 청해 설정을 저장할 틈을 주고, 트레이에 남아 있으면 강제로 닫습니다. 설치하는 동안 확인 팝업은 뜨지 않습니다.
  • 설치 화면에 보이는 앱 이름은 고른 언어를 따릅니다 — 한국어면 창 제목이 모아 <버전> 설치가 되고 바로가기 이름도 모아, 영어면 MOA입니다. 맨 처음 뜨는 언어 선택 창의 문구는 Windows 표시 언어를 따르며, 거기서 고른 언어는 그 다음 화면부터 반영됩니다(고르는 순간 그 창이 다시 그려지지는 않습니다). 제거할 때는 언어를 묻지 않습니다 — 고를 것이 없어 Windows 표시 언어를 그대로 씁니다.
  • 시작 메뉴에 바로가기가 만들어지고, 바탕화면 바로가기는 마지막 화면의 체크박스로 고릅니다.
  • 설정과 서버 지문 파일이 설치 폴더 안에 생깁니다(settings.json·known_hosts.json). 재설치·덮어쓰기로는 지워지지 않습니다.
  • 제거하면 묻지 않고 설정과 지문 파일까지 함께 지웁니다 — 사이트 목록·저장한 비밀번호·서버 지문이 사라집니다(설치 첫 화면에서 이 사실을 미리 알립니다). 자동 실행을 켜 뒀다면 그 등록도 함께 걷습니다. 지우는 것은 설치 프로그램과 앱이 만든 파일뿐이라, 그 폴더에 따로 넣어 둔 파일이 있으면 폴더째 남습니다.
  • 설치본은 새 버전을 스스로 찾아 받습니다(위 「자동 업데이트」). 업데이트로 설치할 때는 언어·환영·라이선스·폴더 화면을 건너뛰고 진행 화면만 보인 뒤 앱이 다시 열립니다.
  • 코드 서명은 없습니다.

아키텍처

계층형 단일 crate — 모듈 분리 (상세 규약은 AGENTS.mddocs/conventions-ui.md, 릴리즈 절차는 docs/release.md, 요구사항 정본은 docs/prd.md):

src/
├── main.rs            # 진입점 — COM 초기화, 세션 로드, egui 창 실행
├── lib.rs             # 라이브러리 타깃 — 통합 테스트(tests/)용 모듈 재수출
├── ui/                # egui UI 계층 — 화면 구성·입력 처리 전부
│   ├── app.rs         # 앱 골격 — 워크스페이스 목록·뷰 소유, 세션 반영/수집, 창 상태 추적
│   ├── app/
│   │   ├── remote.rs           # 앱이 원격 서버를 다루는 배선 — 연결·조회·명령을 앱 상태에 잇는다 (단축키의 원격 라우팅 포함)
│   │   ├── shell_menu.rs       # 셸 메뉴를 열고 고른 것을 수행 — 표준·확장·압축·해제·숨김 분류, 아이콘 줄, 앱이 세우는 세 줄
│   │   └── transfer_conflict.rs # 전송 전 같은 이름 확인 흐름 (FR-55)
│   ├── sidebar.rs     # 워크스페이스 사이드바 (2줄 카드·인라인 편집·드래그 정렬)
│   ├── splitter.rs    # 분할 트리를 화면에 배치하고 스플리터를 드래그
│   ├── panel.rs       # 패널 — 탭 스트립/주소창/트리/목록 조립, pending-커밋 탐색, 변경 감시
│   ├── panel/
│   │   ├── workers.rs # 패널이 워커 스레드에 맡기는 일 — 폴더 열거·새 폴더/새 파일 만들기
│   │   └── tests.rs   # 패널 테스트 — 탐색·탭·원격·목록 조작
│   ├── tree.rs        # 폴더 트리 — 드라이브 루트 + 지연 확장(워커 열거), 줄마다 셸 아이콘
│   ├── file_list.rs   # 파일 목록 상태 — 항목·선택·정렬·보기 모드 소유, 모드별 렌더에 위임
│   ├── list_details.rs # 자세히 보기 — 열 머리글·열 폭 드래그·가로 스크롤
│   ├── list_grid.rs   # 그 외 보기 — 아이콘 4종·목록·타일·내용 렌더
│   ├── list_common.rs # 두 렌더 모듈의 공용 조각 (조작 타입·말줄임 배치·인라인 이름 편집칸·잘라내기 표시색)
│   ├── shell_context_menu.rs # Windows 11 모양 컨텍스트 메뉴 그리기 (아이콘 줄·항목 줄·앱 확장·다음으로 압축·압축 풀기·하위 메뉴)
│   ├── view_mode.rs   # 보기 모드 8종과 격자 배치 계산 (순수 — 테스트 대상)
│   ├── license_dialog.rs # 오픈소스 라이선스 고지 — 좌우 2단(구성 요소 목록·라이선스 전문)
│   ├── about_dialog.rs # 앱 정보 팝업 — 아이콘과 이름·버전 (표시 크기에 맞춰 아이콘을 줄인다)
│   ├── tabs.rs        # 탭 스트립 + `+` 새 탭 메뉴(사이트 목록 포함) + 오른쪽 끝 패널 메뉴 버튼
│   ├── address_bar.rs # 주소창·히스토리 버튼
│   ├── menu.rs        # 패널 메뉴 구성·단축키 테이블·마우스 옆 버튼(뒤로·앞으로)·키 소유 영역(F2·Delete를 누가 받는가)
│   ├── widgets.rs     # 공용 아이콘 버튼 — 프레임 없이 아이콘만, hover 시에만 배경
│   ├── titlebar.rs    # 커스텀 타이틀바 — 앱 아이콘·제목·사이드바 토글·설정 메뉴·창 버튼·가장자리 크기 조절
│   ├── app_icon.rs    # 앱 아이콘(docs/AppIcon.ico) → 창 아이콘·타이틀바 텍스처
│   ├── dialog.rs      # 모달 대화의 공통 껍데기 — 프레임·하단 버튼 줄 (모든 팝업이 거친다)
│   ├── settings_dialog.rs # 설정 대화 — 모양·시작·종료·파일 보기·원격·언어 여섯 묶음
│   ├── font_scan.rs   # 글꼴 목록을 워커 스레드에서 읽어 온다 (한글을 그리는 것만)
│   ├── tray.rs        # 트레이 아이콘 등록·콜백·우클릭 메뉴 (Shell_NotifyIconW)
│   ├── session.rs     # 앱 상태 ↔ 세션 파일 변환 (순수) — 원격 탭·큐·사이트 포함
│   ├── site_manager.rs # 사이트 관리자 대화 (일반·고급 탭)
│   ├── remote_states.rs # 원격 탭의 단계별 화면 (안내·연결 중·실패) + SFTP 지문 확인 대화
│   ├── remote_menu.rs  # 원격 목록 우클릭 메뉴와 이름·권한·삭제 대화
│   ├── dock.rs         # 하단 도크 — 전송 큐/서버 로그 탭 스트립
│   ├── queue_panel.rs  # 전송 큐 화면 (진행률·속도·행 메뉴)
│   ├── log_panel.rs    # 서버 로그 화면 (종류별 색·복사)
│   ├── status_bar.rs   # 상태 표시줄 — 큐 토글·큐 요약·전체 진행·현재 전송·실패 알약
│   ├── toast.rs        # 알림 (사이트 등록 등)
│   ├── icon_tex.rs    # 시스템 아이콘·썸네일 → egui 텍스처 변환
│   ├── shell_host.rs  # 셸 컨텍스트 메뉴용 HWND 확보·서브클래스
│   └── theme.rs       # 고정 다크 팔레트
├── i18n/              # 화면 문구 카탈로그 — 키 하나에 한국어·영어를 함께 적는다
│   └── mod.rs         # `strings!` 매크로(정적 문구) + `dynamic`(값이 끼어드는 문구) + 현재 언어
├── remote/            # 원격 연결 계층 (UI 비의존 — 워커 스레드 + 채널)
│   ├── types.rs       # 사이트·경로·항목·오류 등 도메인 타입과 `RemoteSession` 트레이트
│   ├── connection.rs  # 연결 하나의 워커 스레드 — 명령/이벤트 채널, 재시도, 전송
│   ├── manager.rs     # 연결 목록과 채널 계획 (탐색 1 + 전송 N)
│   ├── ftp.rs         # FTP·FTPS 세션 (suppaftp)
│   ├── sftp.rs        # SFTP 세션 (ssh2)
│   ├── hostkey.rs     # 알려진 호스트 키 저장·대조
│   ├── secret.rs      # 비밀번호·키 암호 DPAPI 봉인/해제
│   ├── sites.rs       # 사이트 저장소 (추가·복제·숨김·비밀번호·키 암호)
│   ├── queue.rs       # 전송 큐 모델 (상태·요약·필터)
│   ├── transfer.rs    # 전송 실행기 — 슬롯 배분·이어받기·취소 정리
│   ├── tree_cache.rs  # 원격 폴더 트리의 하위 폴더 캐시 (연결별·세대 무효화)
│   ├── charset.rs     # CP949 등 서버 문자셋 변환
│   ├── log.rs         # 서버 로그 버퍼 (비밀번호 가림)
│   ├── url.rs         # `ftp://`·`sftp://` 주소 해석
│   └── testing.rs     # 가짜 서버·세션 (실서버 없이 도는 테스트용)
├── app/               # 순수 로직 (UI 프레임워크 비의존)
│   ├── workspace.rs   # 워크스페이스 목록 모델 (추가/이름/삭제/정렬/부제)
│   ├── layout.rs      # 분할 레이아웃 트리 (split/close/비율/배치/스냅숏)
│   ├── settings.rs    # 세션 직렬화 v3 (serde) — v2 파일은 승격해 읽는다. 앱 설정도 함께 담는다
│   ├── favorites.rs   # 폴더 트리 즐겨찾기 — 추가 순서를 지키는 목록, 담기·빼기·중복 판정, 기본 항목(해제 불가)
│   ├── drives.rs      # 트리의 드라이브 줄 목록과 연결 상태 — 워커 결과·열어 본 결과를 반영하는 규칙
│   ├── fonts.rs       # 설치된 글꼴 목록·글꼴 파일 읽기 (TTC 포함 — GDI가 아니라 파일에서)
│   ├── autostart.rs   # 윈도우 시작 시 실행 등록·해제 (HKCU Run 키)
│   ├── single_instance.rs # 중복 실행 판정과 기존 창 깨우기 (이름 있는 뮤텍스 + 등록 메시지)
│   └── theme.rs       # 창에 거는 Win32·DWM 설정 (전역 다크 정책·전환 애니메이션·미도색 배경)
├── panel/             # 순수 모델
│   ├── tabs.rs        # 탭 모델
│   ├── file_list.rs   # 정렬 비교·크기/날짜 표시 규칙·행 추상(ListRow)
│   ├── address_bar.rs # 주소 입력 정규화 (따옴표·상대 경로)
│   ├── dir_cache.rs   # 최근 읽은 폴더의 목록 캐시 (8폴더·폴더당 5000항목 LRU)
│   └── history.rs     # 탭별 탐색 히스토리 (되돌리기용 스냅샷 복제 가능)
├── fs/
│   ├── enumerate.rs   # 워커 스레드 디렉터리 열거 (배치로 흘려보내기, FindFirstFileExW, \\?\ 긴경로)
│   ├── create.rs      # 새 폴더·새 파일 만들기 (이름 충돌 회피 — 덮어쓰지 않음)
│   ├── bitmap.rs      # GDI 32bpp 비트맵 → BGRA 바이트 (아이콘·썸네일·드래그 그림이 함께 쓴다)
│   ├── clipboard.rs   # 파일 클립보드 — CF_HDROP + Preferred DropEffect (탐색기와 상호 운용)
│   ├── icons.rs       # 셸 아이콘·종류 캐시 (크기별 시스템 이미지 리스트 공유), 셸 표시 이름
│   ├── known_folders.rs # 윈도우가 정해 준 폴더 (즐겨찾기 기본 항목 — 바탕 화면·다운로드)
│   ├── drives.rs      # 논리 드라이브 열거·셸 이름·아이콘과 네트워크 드라이브 접근 판정 (워커)
│   │                  #  + 꽂힘·빠짐을 1초마다 지켜보는 상주 감시 워커 (목록만 갱신)
│   ├── thumbnail.rs   # 썸네일 워커 + LRU 캐시 (IShellItemImageFactory)
│   ├── shell_menu.rs  # IContextMenu 셸 컨텍스트 메뉴 — 항목 읽기·하위 메뉴 채움·실행 (COM — unsafe 격리)
│   └── watcher.rs     # 폴더 변경 감시 (ReadDirectoryChangesW + 디바운스)
└── (아래는 `src/`와 나란한 레포 루트 항목이다)

tests/
├── layout_flow.rs     # 분할·닫기 시퀀스 통합 테스트
├── watcher.rs         # 감시 통합 테스트 (채널 검증)
├── transfer_memory.rs # 1GB 동시 4건 전송의 메모리 실측 (NFR-12)
├── remote_concurrency.rs # 무응답 서버·1만 항목 조회 (NFR-11·13)
└── installer.rs       # 설치 스크립트가 요구 항목을 담고 있는지 훑는 검사

examples/
├── gen_licenses.rs    # 라이선스 고지 생성기 (개발용 — 배포 exe에 들어가지 않는다).
│                      # 산출물이 둘이다: assets/licenses.json + THIRD-PARTY-NOTICES.md
├── gen_app_icon.rs    # 정보 화면용 아이콘 자산 생성기 (docs/AppIcon.png → 256px)
└── gen_installer.rs   # 설치 파일 생성기 — makensis를 찾아 installer/moa.nsi를 넘긴다

installer/
└── moa.nsi            # NSIS 설치 스크립트 (사용자 단위 설치)

assets/                # 실행 파일에 담기는 생성물·원문 (커밋 대상)
├── licenses.json      # 앱 고지 화면이 읽는 자산 — `cargo run --example gen_licenses`가 만든다
├── app_icon_256.png   # 정보 화면 아이콘 자산 — `cargo run --example gen_app_icon`이 만든다
└── spdx/              # SPDX 표준 전문 (원문이 없는 구성 요소에 쓴다)

LICENSE                # 이 프로젝트의 라이선스 (MIT)
THIRD-PARTY-NOTICES.md # 저장소에서 보는 오픈소스 고지 — 위 생성기가 만든다 (커밋 대상)

핵심 플로우: 탐색 요청 → PanelState::navigate(pending 등록, 세대 번호 증가) → 워커 스레드 열거 → 채널 수신 후 프레임에서 반영 → 경로·히스토리 커밋 → 커밋된 폴더로 변경 감시 교체. 폴더를 열지 못했을 때도 그 폴더까지 옮깁니다 — 주소창·트리와 목록이 갈리지 않도록 경로는 커밋하되 목록을 비우고 그 자리에 사유를 적으며(올라갈 곳이 있으면 첫 줄 ..만 남습니다 — 드라이브 뿌리에는 그 줄도 없습니다), 읽지 못한 폴더는 감시하지 않습니다. 사유는 세 갈래로 갈라 적습니다: 이 폴더를 열 권한이 없어 내용을 표시할 수 없습니다 / 네트워크 드라이브에 연결할 수 없어 내용을 표시할 수 없습니다 / 이 폴더를 여는 중 문제가 생겨 내용을 표시할 수 없습니다. 폴더를 찾을 수 없는 경우만 현 위치·목록을 지키고 상태 줄에 사유를 알립니다(실재하지 않는 곳에는 옮길 자리가 없습니다). 컨텍스트 메뉴는 셸에게 항목을 물어 앱이 그립니다IContextMenu::QueryContextMenu가 채운 HMENU를 읽어 우리 모델로 옮기고(라벨·아이콘·활성·하위 메뉴), 탐색기 차례의 표준 항목과 앱 확장·다음으로 압축·압축 풀기 묶음으로 갈라 세운 뒤, 고른 항목은 다시 셸의 InvokeCommand로 돌려보냅니다. 다음으로 압축의 첫 줄만 다른 길로 갑니다 — Windows 기본 압축은 메뉴로 오지 않아 SendTo 폴더의 그 항목을 IDropTarget으로 얻어 넘깁니다(fs::zip_shell). 재정렬해도 아이콘은 셸이 준 원래 자리로 찾습니다. 하위 메뉴는 처음 펼칠 때 WM_INITMENUPOPUP을 확장에 전달해 채웁니다. 기본 메뉴가 여는 표준 메뉴는 자체 메시지 루프를 돌리므로 프레임 그리기가 모두 끝난 뒤에 띄웁니다. 파일 작업 자체는 여전히 셸이 합니다 — 이름 바꾸기·삭제·복사·이동은 IFileOperation에 걸어 워커 스레드에서 돌리고(확인·진행률 대화는 Windows가 띄웁니다), 클립보드는 Windows 표준 형식을 그대로 씁니다. 종료 시 세션 수집·저장, 시작 시 복원.

원격 플로우: 사이트 선택 → 워커 스레드 하나가 그 연결을 맡고(탐색 1 + 전송 N채널), 화면은 채널만 폴링합니다 — 서버가 응답하지 않아도 다른 패널·다른 사이트는 계속 움직입니다. 목록·전송·파일 작업은 전부 명령으로 나가고 결과는 이벤트로 돌아옵니다. 목록 조회 요청은 자기 출처를 들고 다닙니다 — 패널(워크스페이스·패널 자리와 일련번호)·원격 트리·같은 이름 확인 셋으로 갈라져, 답이 청한 곳으로 정확히 돌아가고 늦게 온 지난 요청의 답은 그 일련번호로 걸러집니다. 같은 사이트를 두 패널에 나란히 열어도 한쪽의 실패가 다른 쪽을 되돌리지 않습니다. 전송은 64KB씩 흘려보내 파일 크기와 무관하게 메모리가 버퍼 몫에 머물고, 끊기면 .part의 크기에서 이어받습니다.

워크스페이스 플로우: 사이드바 클릭 → 그 워크스페이스가 활성이 되고, 처음 선택이면 저장된 구성으로 분할·탭을 만듭니다(지연 생성 — 방문하지 않은 워크스페이스는 패널도 열거 스레드도 없습니다). 이미 만든 워크스페이스는 상태를 그대로 갖고 있어 스크롤·선택이 유지됩니다. 활성 패널의 폴더가 바뀌면 사이드바 카드의 둘째 줄이 따라 갱신됩니다.

라이선스

MOA는 MIT 라이선스로 배포합니다. 전문은 LICENSE에 있습니다.

소스 코드든 빌드한 실행 파일이든 자유롭게 쓰고 고치고 다시 배포할 수 있습니다. 다만 가져다 쓸 때는 출처를 밝혀 주세요 — 저작권 표시(Copyright (c) 2026 jongcheol-pak)와 위 라이선스 전문을 함께 싣는 것이 MIT가 요구하는 조건이며, 이 저장소 주소를 함께 적어 주면 더 좋습니다.

이 앱이 쓰는 오픈소스 구성 요소의 고지는 THIRD-PARTY-NOTICES.md에 있고, 같은 내용을 앱 안에서도 볼 수 있습니다(타이틀바 설정 메뉴의 오픈소스 라이선스).

LAST_4_WEEKS 127
Releases
12 TOTAL
  • v1.5.2 Latest
    1일 전

    고친 것 파일을 주고받는 중에 서버 연결이 끊겨 실패했을 때, 목록에서 다시 시도를 눌러도 계속 실패하던 문제를 고쳤습니다. 이제 끊긴 서버의 전송은 대기 중으로 기다리다가, 그 탭에서 다시 연결하면 저절로 이어집니...

  • v1.5.1
    2일 전

    고친 것 서버와의 연결이 도중에 끊기면 이제 바로 알려 드립니다. 종전에는 끊긴 뒤에도 목록이 그대로 남아 있어, 파일을 지우거나 이름을 바꿔 보고 나서야 알 수 있었습니다. 끊긴 화면에서 재시도를 누르면 그 자리에...

  • v1.5.0
    2일 전

    고친 것 FTP·SFTP 탭에서 지금 서버 어디를 보고 있는지 주소창에 보입니다. 그동안은 빈 칸이었습니다. FTP·SFTP 탭에서도 뒤로·앞으로·위로 버튼이 동작합니다(Alt+←/→/↑와 마우스 옆 버튼도 같습니다...

  • v1.4.1
    9일 전

    고친 것 USB·외장 디스크를 꽂거나 빼면 폴더 트리에 바로 반영되도록 고쳤습니다. 전에는 최대 30초까지 걸렸습니다.

View all releases