Storage queries run in the background with cancellation and covering indexes so switching views no longer freezes the UI. Co-authored-by: Cursor <cursoragent@cursor.com>
107 lines
4.0 KiB
Markdown
107 lines
4.0 KiB
Markdown
# Explorer Workbench
|
||
|
||
Working name for a Windows file manager with **persistent memory**: live Explorer browsing plus a SQLite index for search, folder sizes, offline media and storage analysis.
|
||
|
||
Mental model:
|
||
|
||
> Open Explorer → see files → manage files → search immediately → analyze storage.
|
||
|
||
The index is infrastructure. You never need to know about SQLite, FTS or change journals to use the app.
|
||
|
||
## Requirements
|
||
|
||
- Windows 10 version 1809 or later, or Windows 11
|
||
- [.NET 10 SDK](https://dotnet.microsoft.com/download) (this repo pins `10.0.301` in `global.json`)
|
||
- No administrator privileges required
|
||
|
||
## Build
|
||
|
||
```powershell
|
||
dotnet build Explorer.slnx -c Release
|
||
```
|
||
|
||
## Run
|
||
|
||
```powershell
|
||
dotnet run --project src/Explorer.App -c Release
|
||
```
|
||
|
||
The executable is `src/Explorer.App/bin/Release/net10.0-windows/Explorer.App.exe`.
|
||
|
||
## Tests
|
||
|
||
```powershell
|
||
dotnet test Explorer.slnx -c Release
|
||
```
|
||
|
||
## Architecture overview
|
||
|
||
Modular monolith (see `docs/ARCHITECTURE.md`):
|
||
|
||
| Project | Role |
|
||
|---|---|
|
||
| `Explorer.App` | WPF shell, themes, composition |
|
||
| `Explorer.Presentation` | ViewModels (no WPF types) |
|
||
| `Explorer.Application` | Use-cases (browse, sources) |
|
||
| `Explorer.Domain` | Entities, identity, excludes |
|
||
| `Explorer.Indexing` | Full scan, folder reconcile, USN apply, watchers |
|
||
| `Explorer.Search` | Structured `SearchQuery` → index |
|
||
| `Explorer.Analysis` | Top-N, types, duplicates, history rollups |
|
||
| `Explorer.FileOperations` | Transfer queue, copy/move/delete |
|
||
| `Explorer.Storage.Sqlite` | Schema, WAL, FTS5 |
|
||
| `Explorer.Windows` | Volumes, USN, Recycle Bin, `CopyFileEx` |
|
||
|
||
Listing is **hybrid**: the open folder always comes from the live filesystem when the location is online. Folder sizes, search, analysis and offline media come from the index.
|
||
|
||
## Database location
|
||
|
||
`%LocalAppData%\ExplorerWorkbench\index.db`
|
||
|
||
Never stored beside the executable.
|
||
|
||
## Logging location
|
||
|
||
`%LocalAppData%\ExplorerWorkbench\logs\explorer-YYYYMMDD.log`
|
||
|
||
## Indexing behavior
|
||
|
||
- Browsing local drives works immediately with an empty index.
|
||
- Initial indexing is **user-triggered** (banner **Build index** or the toolbar **Index** button).
|
||
- Scans run in the background, write in batches, skip inaccessible paths, and can be cancelled.
|
||
- Local NTFS volumes use the USN change journal when the process can open it; otherwise folder reconcile + `FileSystemWatcher` (best effort; overflow marks the location as possibly out of date).
|
||
- SMB/UNC paths are added manually (address bar or **Add network**). The Windows Network neighborhood is not enumerated.
|
||
- Default excludes include `C:\Windows`, recycle bins, `node_modules`, `.git`, and similar.
|
||
|
||
## Keyboard shortcuts
|
||
|
||
| Shortcut | Action |
|
||
|---|---|
|
||
| `Alt+Left` / `Back` | Back |
|
||
| `Alt+Right` | Forward |
|
||
| `Alt+Up` | Up |
|
||
| `F5` | Refresh |
|
||
| `Enter` | Open |
|
||
| `F2` | Rename |
|
||
| `Ctrl+C` / `Ctrl+X` / `Ctrl+V` | Copy / Cut / Paste |
|
||
| `Delete` | Delete to Recycle Bin |
|
||
| `Ctrl+T` | New tab |
|
||
| `Ctrl+W` | Close tab |
|
||
|
||
Drag and drop copies by default; hold `Shift` to move.
|
||
|
||
## Known limitations
|
||
|
||
- Product name `Explorer` is temporary; app data uses `ExplorerWorkbench`.
|
||
- UI strings are English in this build; resource structure can take German later.
|
||
- Everything-like search syntax is not implemented; name/glob plus size/type/date filters are.
|
||
- USN requires privileges Windows does not grant to a normal desktop process on many volumes — fallback is used then.
|
||
- Duplicate hashing is staged (size → partial hash → full hash only when partial hashes still collide) and runs in the background; confirmed groups appear after hashing finishes.
|
||
- No treemap, no document full-text, no cloud providers, no installer/MSIX in this run.
|
||
- Very large folders rely on WPF virtualization; search results are paged (500, hard cap 10 000).
|
||
- `mmap_size` is not applied; it caused unreliable native SQLite startup under concurrent test hosts.
|
||
- UI chrome is English; German `.resx` files are not wired through every control in this run.
|
||
|
||
## License
|
||
|
||
Use as a private/local project unless otherwise specified.
|