# everytools
一个强大的Python库,用于调用Windows系统上的Everything搜索引擎进行高效文件搜索。
## 特性
- 🚀 **高性能搜索** - 基于Everything搜索引擎,毫秒级搜索速度
- 🎯 **现代化API** - 提供链式调用的SearchBuilder和丰富的过滤器
- 🔄 **向后兼容** - 保留传统API,无缝升级
- 🎨 **丰富过滤器** - 支持文件类型、大小、日期、媒体类型等多种过滤
- 📊 **详细结果** - 获取文件名、路径、大小、创建/修改时间等完整信息
- ⚡ **异步支持** - 支持异步搜索,避免阻塞
- 🛡️ **错误处理** - 完善的异常处理机制
- 📝 **完整文档** - 详细的使用说明和示例代码
## 库的整体结构
```
everytools/
├── __init__.py # 包入口点,导出主要类和函数
├── everytools.py # 传统API实现(向后兼容)
├── constants.py # 常量定义(排序类型、请求标志、错误码等)
├── exceptions.py # 自定义异常类
├── config.py # 配置管理
├── utils/ # 工具函数模块
│ ├── __init__.py
│ ├── download.py # Everything SDK DLL下载工具
│ └── time_utils.py # Windows FILETIME时间转换工具
├── core/ # 核心功能模块
│ ├── __init__.py
│ ├── dll_loader.py # DLL加载和初始化管理
│ └── result.py # 搜索结果处理和封装
├── query/ # 查询功能模块
│ ├── __init__.py
│ ├── search.py # 现代化搜索API(SearchBuilder)
│ └── filters.py # 搜索过滤器(文件、日期、媒体等)
└── dll/ # Everything SDK DLL文件存放目录
├── Everything32.dll # 32位DLL(自动下载)
└── Everything64.dll # 64位DLL(自动下载)
```
## 运行环境
### 安装everything软件
由于需要调用电脑版everything程序,没有安装的需要[下载](https://www.voidtools.com/zh-cn/downloads/)安装everything,安装完后请确保已经运行,任务栏会出现程序图标。
### 安装everytools库
在命令行窗口下使用pip进行安装everytools库
```shell
pip install everytools
```
## 使用方法
### 新API (推荐)
从v0.2.0开始,everytools提供了更加现代化、易用的API。根据不同的使用场景,我们提供了两种搜索方式:
#### 1. 简单搜索 - Search类 (高性能)
适用于简单查询和性能敏感的场景:
```python
from everytools import Search
# 直接创建搜索实例
search = Search("Python")
search.execute()
results = search.get_results()
# 遍历结果
for result in results:
print(f"{result.name} - {result.full_path} ({result.size} bytes)")
```
带参数的简单搜索:
```python
from everytools import Search, SortType, RequestFlag
# 创建带参数的搜索
search = Search(
query_string="*.py",
match_case=False,
sort_type=SortType.SIZE_DESCENDING,
max_results=10,
request_flags=RequestFlag.FILE_NAME | RequestFlag.PATH | RequestFlag.SIZE
)
search.execute()
results = search.get_results()
```
#### 2. 构建器搜索 - SearchBuilder类 (易用性)
适用于复杂查询构建和需要链式调用的场景:
```python
from everytools import SearchBuilder, FileFilter, SortType
# 创建搜索构建器
search = (
SearchBuilder()
.keywords("Python") # 搜索关键词
.filter(FileFilter().with_extensions("py", "txt")) # 过滤器
.match_case(False) # 不区分大小写
.sort_by(SortType.SIZE_DESCENDING) # 按大小降序排序
.limit(10) # 限制结果数量
.execute() # 执行搜索
)
# 获取结果
results = search.get_results()
# 遍历结果
for result in results:
print(f"{result.name} - {result.full_path} ({result.size} bytes)")
```
#### 性能对比与使用建议
**Search类 vs SearchBuilder类的性能差异:**
| 特性 | Search类 | SearchBuilder类 |
|------|----------|----------------|
| 执行速度 | ⚡ 更快 | 🐌 较慢 |
| 内存占用 | 💾 更少 | 📦 较多 |
| 代码简洁性 | 📝 简单直接 | 🎨 链式调用 |
| 功能丰富性 | 🔧 基础功能 | 🛠️ 丰富过滤器 |
**性能差异原因:**
- SearchBuilder需要额外的对象创建和参数传递开销
- SearchBuilder在execute()时会创建新的Search实例
- 查询字符串需要动态构建和组装
**使用场景建议:**
```python
# ✅ 推荐使用Search类的场景:
# 1. 高频查询(如实时搜索)
# 2. 简单关键词搜索
# 3. 性能敏感的应用
# 4. 批量处理大量搜索请求
from everytools import Search
# 高频搜索示例
def quick_search(keyword):
search = Search(keyword)
search.execute()
return search.get_results()
# ✅ 推荐使用SearchBuilder类的场景:
# 1. 复杂查询条件组合
# 2. 需要多种过滤器
# 3. 代码可读性要求高
# 4. 一次性查询任务
from everytools import SearchBuilder, FileFilter, DateFilter
# 复杂查询示例
def complex_search():
return (
SearchBuilder()
.keywords("project")
.filter(FileFilter().with_extensions("py", "js"))
.filter(DateFilter().modified_after("2024-01-01"))
.sort_by(SortType.DATE_MODIFIED_DESCENDING)
.limit(50)
.execute()
.get_results()
)
```
**性能优化技巧:**
```python
# 1. 复用Search实例
search = Search("")
for keyword in ["python", "java", "javascript"]:
search._query_string = keyword
search.execute()
results = search.get_results()
# 处理结果...
# 2. 预设常用搜索配置
def create_optimized_search(query):
return Search(
query_string=query,
max_results=100, # 限制结果数量
request_flags=RequestFlag.FILE_NAME | RequestFlag.PATH # 只请求必要信息
)
# 3. 批量处理
def batch_search(keywords, batch_size=10):
results = {}
for i in range(0, len(keywords), batch_size):
batch = keywords[i:i+batch_size]
for keyword in batch:
search = Search(keyword)
search.execute()
results[keyword] = search.get_results()
return results
```
#### 使用过滤器
everytools提供了丰富的过滤器来精确控制搜索结果:
```python
from everytools import SearchBuilder, FileFilter, FolderFilter, MediaFilter, DocumentFilter, DateFilter, SizeFilter
# 文件过滤器 - 搜索大于1MB的Python文件
python_files = FileFilter().with_extensions("py").with_size_range(min_size=1024*1024)
# 文件夹过滤器 - 搜索空文件夹
empty_folders = FolderFilter().empty_only()
# 媒体过滤器 - 搜索图片文件
images = MediaFilter("image") # 支持 "audio", "video", "image", "all"
# 文档过滤器 - 搜索Office文档
documents = DocumentFilter("office") # 支持 "office", "pdf", "text", "all"
# 日期过滤器 - 搜索最近修改的文件
recent_files = DateFilter().modified_after("2024-01-01")
# 大小过滤器 - 搜索大文件
large_files = SizeFilter().larger_than_mb(100) # 大于100MB
# 组合多个过滤器
search = (
SearchBuilder()
.keywords("project")
.filter(python_files)
.filter(recent_files)
.sort_by(SortType.DATE_MODIFIED_DESCENDING)
.execute()
)
```
##### 过滤器详细说明
**FileFilter(文件过滤器)**
```python
file_filter = (
FileFilter()
.with_extensions("py", "txt", "md") # 指定文件扩展名
.with_size_range(min_size=1024, max_size=1024*1024) # 文件大小范围
.with_content("TODO") # 搜索文件内容(仅文本文件)
.duplicates_only() # 仅显示重复文件
)
```
**DateFilter(日期过滤器)**
```python
date_filter = (
DateFilter()
.by_modified_date() # 按修改日期过滤
.in_range("2024-01-01", "2024-12-31") # 日期范围
)
# 便捷方法
recent_created = DateFilter().created_after("2024-06-01")
recent_modified = DateFilter().modified_after("2024-06-01")
```
**SizeFilter(大小过滤器)**
```python
size_filter = (
SizeFilter()
.larger_than_mb(10) # 大于10MB
.smaller_than_gb(1) # 小于1GB
)
```
#### 异步搜索
```python
from everytools import SearchBuilder
# 创建一个异步搜索
search = SearchBuilder().keywords("large files").execute(async_query=True)
# 等待搜索完成
if search.wait_for_completion(timeout_ms=5000):
results = search.get_results()
print(f"找到 {len(results)} 个结果")
else:
print("搜索超时!")
```
### 传统API (向后兼容)
为了兼容旧版本,我们继续保留了传统API:
```python
# 导入EveryTools类
from everytools import EveryTools
es = EveryTools() # 实例化,只需要第一次就行
```
#### 用名称搜索
使用`search()`方法可以通过输入关键词检索文件,一般在几秒内能结束,检索完后可以读取结果数量。
```python
es.search('工作')
print('everything reuslt number:', es.get_num_total_results()) # 获取搜索结果对象数量
```
#### 获取搜索数量
搜索后可以获得的数量有三种:结果总数量、文件数量、文件夹数量。
```python
es.get_num_total_results() #总数量
es.get_num_total_file() # 文件数量
es.get_num_total_folder() # 文件夹数量
```
#### 获取搜索结果
使用`results()`获取搜索结果,该返回为迭代器。输出结果会包含name, path等信息,由于检索信息需要耗一定时间,数量比较多的情况下需要等待片刻。
```python
results = es.results() # 获取输出结果
# 只打印前五个结果
for i, result in enumerate(results):
if i >= 5:
break
print(result)
```
#### 更改结果排序
更改`results`方法`sort_type`参数实现更改排序结果,默认参数为`1`,其他参数如下:
| **排序类型** | **值** |
| :----------: | :----: |
| 名称升序 | 1 |
| 名称降序 | 2 |
| 路径升序 | 3 |
| 路径降序 | 4 |
| 大小升序 | 5 |
| 大小降序 | 6 |
| 拓展名升序 | 7 |
| 拓展名降序 | 8 |
#### 快速搜索方法
```python
es.search_audio() # 搜索音频
es.search_zip() # 搜索压缩包
es.search_doc() # 搜索文档
es.search_exe() # 搜索可执行文件
es.search_folder() # 搜索文件夹
es.search_pic() # 搜索图片
es.search_video() # 搜索视频
es.search_ext(ext='pdf') # 搜索文件拓展
es.search_in_located('C:\\Users\\') # 搜索指定文件夹下
```
## 高级功能
### 搜索结果详细信息
每个搜索结果包含丰富的文件信息:
```python
from everytools import SearchBuilder
search = SearchBuilder().keywords("example").limit(1).execute()
results = search.get_results()
for result in results:
print(f"文件名: {result.name}")
print(f"路径: {result.path}")
print(f"完整路径: {result.full_path}")
print(f"文件大小: {result.size} 字节")
print(f"创建时间: {result.date_created}")
print(f"修改时间: {result.date_modified}")
print(f"访问时间: {result.date_accessed}")
print(f"文件扩展名: {result.extension}")
print(f"是否为文件: {result.is_file}")
print(f"是否为文件夹: {result.is_folder}")
print(f"文件属性: {result.attributes}")
```
### 排序选项
everytools支持多种排序方式:
```python
from everytools import SearchBuilder, SortType
# 按名称排序
search = SearchBuilder().keywords("test").sort_by(SortType.NAME_ASCENDING).execute()
# 按大小排序
search = SearchBuilder().keywords("test").sort_by(SortType.SIZE_DESCENDING).execute()
# 按修改时间排序
search = SearchBuilder().keywords("test").sort_by(SortType.DATE_MODIFIED_DESCENDING).execute()
```
**可用的排序类型:**
- `NAME_ASCENDING` / `NAME_DESCENDING` - 按名称排序
- `PATH_ASCENDING` / `PATH_DESCENDING` - 按路径排序
- `SIZE_ASCENDING` / `SIZE_DESCENDING` - 按大小排序
- `EXTENSION_ASCENDING` / `EXTENSION_DESCENDING` - 按扩展名排序
- `DATE_CREATED_ASCENDING` / `DATE_CREATED_DESCENDING` - 按创建时间排序
- `DATE_MODIFIED_ASCENDING` / `DATE_MODIFIED_DESCENDING` - 按修改时间排序
- `DATE_ACCESSED_ASCENDING` / `DATE_ACCESSED_DESCENDING` - 按访问时间排序
### 错误处理
everytools提供了完善的错误处理机制:
```python
from everytools import SearchBuilder, EverythingError
try:
search = SearchBuilder().keywords("test").execute()
results = search.get_results()
print(f"找到 {len(results)} 个结果")
except EverythingError as e:
print(f"搜索出错: {e}")
except Exception as e:
print(f"其他错误: {e}")
```
### 系统信息查询
```python
from everytools.core.dll_loader import get_dll_loader
loader = get_dll_loader()
print(f"Everything版本: {loader.version}")
print(f"数据库已加载: {loader.is_db_loaded()}")
print(f"管理员权限: {loader.is_admin()}")
```
## Everything搜索语法
everytools完全支持Everything的强大搜索语法,可以直接在关键词中使用:
### 基本语法
```python
# 通配符
SearchBuilder().keywords("*.txt").execute() # 所有txt文件
SearchBuilder().keywords("test?.doc").execute() # test后跟一个字符的doc文件
# 逻辑操作符
SearchBuilder().keywords("python AND tutorial").execute() # 包含python和tutorial
SearchBuilder().keywords("python OR java").execute() # 包含python或java
SearchBuilder().keywords("python NOT tutorial").execute() # 包含python但不包含tutorial
# 路径搜索
SearchBuilder().keywords("c:\\users\\").execute() # 在特定路径下搜索
SearchBuilder().keywords("parent:c:\\users\\").execute() # 父目录为指定路径
```
### 高级语法
```python
# 文件大小
SearchBuilder().keywords("size:>1mb").execute() # 大于1MB的文件
SearchBuilder().keywords("size:1kb..1mb").execute() # 1KB到1MB之间的文件
# 日期搜索
SearchBuilder().keywords("dm:today").execute() # 今天修改的文件
SearchBuilder().keywords("dc:2024").execute() # 2024年创建的文件
SearchBuilder().keywords("dm:>2024/1/1").execute() # 2024年1月1日后修改的文件
# 文件属性
SearchBuilder().keywords("attrib:h").execute() # 隐藏文件
SearchBuilder().keywords("attrib:r").execute() # 只读文件
# 正则表达式
SearchBuilder().keywords("regex:test\\d+\\.txt").use_regex(True).execute()
```
### 常用搜索模式
```python
# 查找重复文件
SearchBuilder().keywords("dupe:").execute()
# 查找空文件夹
SearchBuilder().keywords("empty:").execute()
# 查找大文件(前100个最大的文件)
SearchBuilder().keywords("").sort_by(SortType.SIZE_DESCENDING).limit(100).execute()
# 查找最近修改的文件
SearchBuilder().keywords("dm:today").sort_by(SortType.DATE_MODIFIED_DESCENDING).execute()
```
## 实用示例
### 常见使用场景
#### 1. 清理重复文件
```python
from everytools import SearchBuilder, FileFilter
# 查找重复文件
duplicates = SearchBuilder().keywords("dupe:").execute().get_results()
print(f"找到 {len(duplicates)} 个重复文件:")
for file in duplicates:
print(f"- {file.full_path} ({file.size} bytes)")
```
#### 2. 查找大文件释放空间
```python
from everytools import SearchBuilder, SortType
# 查找最大的100个文件
large_files = (
SearchBuilder()
.keywords("") # 搜索所有文件
.sort_by(SortType.SIZE_DESCENDING)
.limit(100)
.execute()
.get_results()
)
print("最大的文件:")
for file in large_files[:10]: # 显示前10个
size_mb = file.size / (1024 * 1024) if file.size else 0
print(f"- {file.name}: {size_mb:.2f} MB")
```
#### 3. 项目文件管理
```python
from everytools import SearchBuilder, FileFilter, DateFilter
# 查找项目中的Python文件,按最近修改时间排序
project_files = (
SearchBuilder()
.keywords("C:\\MyProject\\") # 指定项目路径
.filter(FileFilter().with_extensions("py", "js", "html", "css"))
.filter(DateFilter().modified_after("2024-01-01"))
.sort_by(SortType.DATE_MODIFIED_DESCENDING)
.execute()
.get_results()
)
print("最近修改的项目文件:")
for file in project_files[:20]:
print(f"- {file.name} (修改于: {file.date_modified})")
```
#### 4. 媒体文件整理
```python
from everytools import SearchBuilder, MediaFilter, SizeFilter
# 查找大于50MB的视频文件
large_videos = (
SearchBuilder()
.filter(MediaFilter("video"))
.filter(SizeFilter().larger_than_mb(50))
.sort_by(SortType.SIZE_DESCENDING)
.execute()
.get_results()
)
print("大视频文件:")
for video in large_videos:
size_gb = video.size / (1024 * 1024 * 1024) if video.size else 0
print(f"- {video.name}: {size_gb:.2f} GB")
```
#### 5. 系统清理
```python
from everytools import SearchBuilder, FileFilter
# 查找临时文件
temp_files = (
SearchBuilder()
.filter(FileFilter().with_extensions("tmp", "temp", "cache", "log"))
.filter(DateFilter().modified_after("2024-01-01"))
.execute()
.get_results()
)
print(f"找到 {len(temp_files)} 个临时文件")
# 查找空文件夹
empty_folders = SearchBuilder().keywords("empty:").execute().get_results()
print(f"找到 {len(empty_folders)} 个空文件夹")
```
### 性能优化建议
#### 1. 使用适当的过滤器
```python
# 好的做法:使用具体的过滤器
search = (
SearchBuilder()
.keywords("report")
.filter(FileFilter().with_extensions("pdf", "docx"))
.filter(DateFilter().modified_after("2024-01-01"))
.limit(100) # 限制结果数量
.execute()
)
# 避免:过于宽泛的搜索
# search = SearchBuilder().keywords("").execute() # 会返回所有文件
```
#### 2. 合理使用限制
```python
# 对于大量结果,使用limit限制
search = SearchBuilder().keywords("*.txt").limit(1000).execute()
# 或者分批处理
def process_search_results(keywords, batch_size=100):
search = SearchBuilder().keywords(keywords).execute()
results = search.get_results()
for i in range(0, len(results), batch_size):
batch = list(results)[i:i+batch_size]
# 处理这一批结果
yield batch
```
#### 3. 异步搜索处理
```python
import time
from everytools import SearchBuilder
def search_with_timeout(keywords, timeout_seconds=10):
search = SearchBuilder().keywords(keywords).execute(async_query=True)
if search.wait_for_completion(timeout_ms=timeout_seconds * 1000):
return search.get_results()
else:
print("搜索超时")
return []
# 使用示例
results = search_with_timeout("large files", timeout_seconds=5)
```
## 故障排除
### 常见问题
#### 1. Everything未运行
```python
from everytools.core.dll_loader import get_dll_loader
try:
loader = get_dll_loader()
if not loader.is_db_loaded():
print("Everything数据库未加载,请确保Everything正在运行")
except Exception as e:
print(f"无法连接到Everything: {e}")
print("请确保:")
print("1. Everything已安装并正在运行")
print("2. Everything服务已启动")
print("3. 当前用户有足够权限")
```
#### 2. DLL加载失败
```python
import os
from everytools.utils.download import download_sdk_dll
# 手动下载DLL
dll_dir = os.path.join(os.path.dirname(__file__), "everytools", "dll")
try:
download_sdk_dll(dll_dir)
print("DLL下载成功")
except Exception as e:
print(f"DLL下载失败: {e}")
```
#### 3. 搜索结果为空
```python
from everytools import SearchBuilder
search = SearchBuilder().keywords("test").execute()
results = search.get_results()
if len(results) == 0:
print("搜索结果为空,可能的原因:")
print("1. 搜索关键词不存在")
print("2. Everything索引未完成")
print("3. 搜索路径不在索引范围内")
# 尝试更宽泛的搜索
broad_search = SearchBuilder().keywords("*").limit(10).execute()
broad_results = broad_search.get_results()
print(f"宽泛搜索找到 {len(broad_results)} 个结果")
```
## 其他方法
### 查看版本信息
```python
# 新API方式
from everytools.core.dll_loader import get_dll_loader
loader = get_dll_loader()
print(f"Everything版本: {loader.version}")
# 传统API方式
from everytools import EveryTools
es = EveryTools()
print(f"主要版本: {es.major_version}")
print(f"次要版本: {es.minor_version}")
print(f"修正版: {es.revision}")
print(f"编译号: {es.build_number}")
print(f"完整版本: {es.version}")
```

## 版本更新
| **版本** | **更新内容** | **日期** |
| :------: | :------------------------------------------------------------: | :--------: |
| 0.2.1 | 修复filters各种bug | 2025-07-19 |
| 0.2.0 | 重构项目架构,提供新的现代API,支持异步搜索和更多过滤功能 | 2025-07-19 |
| 0.0.1.4 | 去掉多余的pandas模块 | 2025-07-06 |
| 0.0.1.2 | 修复搜索拓展不生效,输出结果新增拓展名,优化搜索为空返回值 | 2021-10-06 |
| 0.0.1.1 | 修复安装时环境依赖警告 | 2021-09-25 |
| 0.0.1.0 | 提供everything基本搜索以及快速搜索方法。 | 2021-09-25 |
## 联系作者
**作者(author):Jan Yang**
**邮箱(Email):yang.jiada@foxmail.com**
Raw data
{
"_id": null,
"home_page": "https://github.com/yangjiada/everytools",
"name": "everytools",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "everything, everytools, windows, file, search, file search, everything sdk",
"author": "Jan Yang",
"author_email": "yang.jiada@foxmail.com",
"download_url": "https://files.pythonhosted.org/packages/6c/13/b005c4aaeb00c531af73adf0ab19b380a537462af260246366f7dbabffab/everytools-0.2.2.tar.gz",
"platform": null,
"description": "# everytools\r\n\r\n\u4e00\u4e2a\u5f3a\u5927\u7684Python\u5e93\uff0c\u7528\u4e8e\u8c03\u7528Windows\u7cfb\u7edf\u4e0a\u7684Everything\u641c\u7d22\u5f15\u64ce\u8fdb\u884c\u9ad8\u6548\u6587\u4ef6\u641c\u7d22\u3002\r\n\r\n## \u7279\u6027\r\n\r\n- \ud83d\ude80 **\u9ad8\u6027\u80fd\u641c\u7d22** - \u57fa\u4e8eEverything\u641c\u7d22\u5f15\u64ce\uff0c\u6beb\u79d2\u7ea7\u641c\u7d22\u901f\u5ea6\r\n- \ud83c\udfaf **\u73b0\u4ee3\u5316API** - \u63d0\u4f9b\u94fe\u5f0f\u8c03\u7528\u7684SearchBuilder\u548c\u4e30\u5bcc\u7684\u8fc7\u6ee4\u5668\r\n- \ud83d\udd04 **\u5411\u540e\u517c\u5bb9** - \u4fdd\u7559\u4f20\u7edfAPI\uff0c\u65e0\u7f1d\u5347\u7ea7\r\n- \ud83c\udfa8 **\u4e30\u5bcc\u8fc7\u6ee4\u5668** - \u652f\u6301\u6587\u4ef6\u7c7b\u578b\u3001\u5927\u5c0f\u3001\u65e5\u671f\u3001\u5a92\u4f53\u7c7b\u578b\u7b49\u591a\u79cd\u8fc7\u6ee4\r\n- \ud83d\udcca **\u8be6\u7ec6\u7ed3\u679c** - \u83b7\u53d6\u6587\u4ef6\u540d\u3001\u8def\u5f84\u3001\u5927\u5c0f\u3001\u521b\u5efa/\u4fee\u6539\u65f6\u95f4\u7b49\u5b8c\u6574\u4fe1\u606f\r\n- \u26a1 **\u5f02\u6b65\u652f\u6301** - \u652f\u6301\u5f02\u6b65\u641c\u7d22\uff0c\u907f\u514d\u963b\u585e\r\n- \ud83d\udee1\ufe0f **\u9519\u8bef\u5904\u7406** - \u5b8c\u5584\u7684\u5f02\u5e38\u5904\u7406\u673a\u5236\r\n- \ud83d\udcdd **\u5b8c\u6574\u6587\u6863** - \u8be6\u7ec6\u7684\u4f7f\u7528\u8bf4\u660e\u548c\u793a\u4f8b\u4ee3\u7801\r\n\r\n## \u5e93\u7684\u6574\u4f53\u7ed3\u6784\r\n```\r\neverytools/\r\n\u251c\u2500\u2500 __init__.py # \u5305\u5165\u53e3\u70b9\uff0c\u5bfc\u51fa\u4e3b\u8981\u7c7b\u548c\u51fd\u6570\r\n\u251c\u2500\u2500 everytools.py # \u4f20\u7edfAPI\u5b9e\u73b0\uff08\u5411\u540e\u517c\u5bb9\uff09\r\n\u251c\u2500\u2500 constants.py # \u5e38\u91cf\u5b9a\u4e49\uff08\u6392\u5e8f\u7c7b\u578b\u3001\u8bf7\u6c42\u6807\u5fd7\u3001\u9519\u8bef\u7801\u7b49\uff09\r\n\u251c\u2500\u2500 exceptions.py # \u81ea\u5b9a\u4e49\u5f02\u5e38\u7c7b\r\n\u251c\u2500\u2500 config.py # \u914d\u7f6e\u7ba1\u7406\r\n\u251c\u2500\u2500 utils/ # \u5de5\u5177\u51fd\u6570\u6a21\u5757\r\n\u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u251c\u2500\u2500 download.py # Everything SDK DLL\u4e0b\u8f7d\u5de5\u5177\r\n\u2502 \u2514\u2500\u2500 time_utils.py # Windows FILETIME\u65f6\u95f4\u8f6c\u6362\u5de5\u5177\r\n\u251c\u2500\u2500 core/ # \u6838\u5fc3\u529f\u80fd\u6a21\u5757\r\n\u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u251c\u2500\u2500 dll_loader.py # DLL\u52a0\u8f7d\u548c\u521d\u59cb\u5316\u7ba1\u7406\r\n\u2502 \u2514\u2500\u2500 result.py # \u641c\u7d22\u7ed3\u679c\u5904\u7406\u548c\u5c01\u88c5\r\n\u251c\u2500\u2500 query/ # \u67e5\u8be2\u529f\u80fd\u6a21\u5757\r\n\u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u251c\u2500\u2500 search.py # \u73b0\u4ee3\u5316\u641c\u7d22API\uff08SearchBuilder\uff09\r\n\u2502 \u2514\u2500\u2500 filters.py # \u641c\u7d22\u8fc7\u6ee4\u5668\uff08\u6587\u4ef6\u3001\u65e5\u671f\u3001\u5a92\u4f53\u7b49\uff09\r\n\u2514\u2500\u2500 dll/ # Everything SDK DLL\u6587\u4ef6\u5b58\u653e\u76ee\u5f55\r\n \u251c\u2500\u2500 Everything32.dll # 32\u4f4dDLL\uff08\u81ea\u52a8\u4e0b\u8f7d\uff09\r\n \u2514\u2500\u2500 Everything64.dll # 64\u4f4dDLL\uff08\u81ea\u52a8\u4e0b\u8f7d\uff09\r\n```\r\n\r\n## \u8fd0\u884c\u73af\u5883\r\n\r\n### \u5b89\u88c5everything\u8f6f\u4ef6\r\n\r\n\u7531\u4e8e\u9700\u8981\u8c03\u7528\u7535\u8111\u7248everything\u7a0b\u5e8f\uff0c\u6ca1\u6709\u5b89\u88c5\u7684\u9700\u8981[\u4e0b\u8f7d](https://www.voidtools.com/zh-cn/downloads/)\u5b89\u88c5everything\uff0c\u5b89\u88c5\u5b8c\u540e\u8bf7\u786e\u4fdd\u5df2\u7ecf\u8fd0\u884c\uff0c\u4efb\u52a1\u680f\u4f1a\u51fa\u73b0\u7a0b\u5e8f\u56fe\u6807\u3002\r\n\r\n### \u5b89\u88c5everytools\u5e93\r\n\r\n\u5728\u547d\u4ee4\u884c\u7a97\u53e3\u4e0b\u4f7f\u7528pip\u8fdb\u884c\u5b89\u88c5everytools\u5e93\r\n\r\n```shell\r\npip install everytools\r\n```\r\n\r\n## \u4f7f\u7528\u65b9\u6cd5\r\n\r\n### \u65b0API (\u63a8\u8350)\r\n\r\n\u4ecev0.2.0\u5f00\u59cb\uff0ceverytools\u63d0\u4f9b\u4e86\u66f4\u52a0\u73b0\u4ee3\u5316\u3001\u6613\u7528\u7684API\u3002\u6839\u636e\u4e0d\u540c\u7684\u4f7f\u7528\u573a\u666f\uff0c\u6211\u4eec\u63d0\u4f9b\u4e86\u4e24\u79cd\u641c\u7d22\u65b9\u5f0f\uff1a\r\n\r\n#### 1. \u7b80\u5355\u641c\u7d22 - Search\u7c7b (\u9ad8\u6027\u80fd)\r\n\r\n\u9002\u7528\u4e8e\u7b80\u5355\u67e5\u8be2\u548c\u6027\u80fd\u654f\u611f\u7684\u573a\u666f\uff1a\r\n\r\n```python\r\nfrom everytools import Search\r\n\r\n# \u76f4\u63a5\u521b\u5efa\u641c\u7d22\u5b9e\u4f8b\r\nsearch = Search(\"Python\")\r\nsearch.execute()\r\nresults = search.get_results()\r\n\r\n# \u904d\u5386\u7ed3\u679c\r\nfor result in results:\r\n print(f\"{result.name} - {result.full_path} ({result.size} bytes)\")\r\n```\r\n\r\n\u5e26\u53c2\u6570\u7684\u7b80\u5355\u641c\u7d22\uff1a\r\n\r\n```python\r\nfrom everytools import Search, SortType, RequestFlag\r\n\r\n# \u521b\u5efa\u5e26\u53c2\u6570\u7684\u641c\u7d22\r\nsearch = Search(\r\n query_string=\"*.py\",\r\n match_case=False,\r\n sort_type=SortType.SIZE_DESCENDING,\r\n max_results=10,\r\n request_flags=RequestFlag.FILE_NAME | RequestFlag.PATH | RequestFlag.SIZE\r\n)\r\nsearch.execute()\r\nresults = search.get_results()\r\n```\r\n\r\n#### 2. \u6784\u5efa\u5668\u641c\u7d22 - SearchBuilder\u7c7b (\u6613\u7528\u6027)\r\n\r\n\u9002\u7528\u4e8e\u590d\u6742\u67e5\u8be2\u6784\u5efa\u548c\u9700\u8981\u94fe\u5f0f\u8c03\u7528\u7684\u573a\u666f\uff1a\r\n\r\n```python\r\nfrom everytools import SearchBuilder, FileFilter, SortType\r\n\r\n# \u521b\u5efa\u641c\u7d22\u6784\u5efa\u5668\r\nsearch = (\r\n SearchBuilder()\r\n .keywords(\"Python\") # \u641c\u7d22\u5173\u952e\u8bcd\r\n .filter(FileFilter().with_extensions(\"py\", \"txt\")) # \u8fc7\u6ee4\u5668\r\n .match_case(False) # \u4e0d\u533a\u5206\u5927\u5c0f\u5199\r\n .sort_by(SortType.SIZE_DESCENDING) # \u6309\u5927\u5c0f\u964d\u5e8f\u6392\u5e8f\r\n .limit(10) # \u9650\u5236\u7ed3\u679c\u6570\u91cf\r\n .execute() # \u6267\u884c\u641c\u7d22\r\n)\r\n\r\n# \u83b7\u53d6\u7ed3\u679c\r\nresults = search.get_results()\r\n\r\n# \u904d\u5386\u7ed3\u679c\r\nfor result in results:\r\n print(f\"{result.name} - {result.full_path} ({result.size} bytes)\")\r\n```\r\n\r\n#### \u6027\u80fd\u5bf9\u6bd4\u4e0e\u4f7f\u7528\u5efa\u8bae\r\n\r\n**Search\u7c7b vs SearchBuilder\u7c7b\u7684\u6027\u80fd\u5dee\u5f02\uff1a**\r\n\r\n| \u7279\u6027 | Search\u7c7b | SearchBuilder\u7c7b |\r\n|------|----------|----------------|\r\n| \u6267\u884c\u901f\u5ea6 | \u26a1 \u66f4\u5feb | \ud83d\udc0c \u8f83\u6162 |\r\n| \u5185\u5b58\u5360\u7528 | \ud83d\udcbe \u66f4\u5c11 | \ud83d\udce6 \u8f83\u591a |\r\n| \u4ee3\u7801\u7b80\u6d01\u6027 | \ud83d\udcdd \u7b80\u5355\u76f4\u63a5 | \ud83c\udfa8 \u94fe\u5f0f\u8c03\u7528 |\r\n| \u529f\u80fd\u4e30\u5bcc\u6027 | \ud83d\udd27 \u57fa\u7840\u529f\u80fd | \ud83d\udee0\ufe0f \u4e30\u5bcc\u8fc7\u6ee4\u5668 |\r\n\r\n**\u6027\u80fd\u5dee\u5f02\u539f\u56e0\uff1a**\r\n- SearchBuilder\u9700\u8981\u989d\u5916\u7684\u5bf9\u8c61\u521b\u5efa\u548c\u53c2\u6570\u4f20\u9012\u5f00\u9500\r\n- SearchBuilder\u5728execute()\u65f6\u4f1a\u521b\u5efa\u65b0\u7684Search\u5b9e\u4f8b\r\n- \u67e5\u8be2\u5b57\u7b26\u4e32\u9700\u8981\u52a8\u6001\u6784\u5efa\u548c\u7ec4\u88c5\r\n\r\n**\u4f7f\u7528\u573a\u666f\u5efa\u8bae\uff1a**\r\n\r\n```python\r\n# \u2705 \u63a8\u8350\u4f7f\u7528Search\u7c7b\u7684\u573a\u666f\uff1a\r\n# 1. \u9ad8\u9891\u67e5\u8be2\uff08\u5982\u5b9e\u65f6\u641c\u7d22\uff09\r\n# 2. \u7b80\u5355\u5173\u952e\u8bcd\u641c\u7d22\r\n# 3. \u6027\u80fd\u654f\u611f\u7684\u5e94\u7528\r\n# 4. \u6279\u91cf\u5904\u7406\u5927\u91cf\u641c\u7d22\u8bf7\u6c42\r\n\r\nfrom everytools import Search\r\n\r\n# \u9ad8\u9891\u641c\u7d22\u793a\u4f8b\r\ndef quick_search(keyword):\r\n search = Search(keyword)\r\n search.execute()\r\n return search.get_results()\r\n\r\n# \u2705 \u63a8\u8350\u4f7f\u7528SearchBuilder\u7c7b\u7684\u573a\u666f\uff1a\r\n# 1. \u590d\u6742\u67e5\u8be2\u6761\u4ef6\u7ec4\u5408\r\n# 2. \u9700\u8981\u591a\u79cd\u8fc7\u6ee4\u5668\r\n# 3. \u4ee3\u7801\u53ef\u8bfb\u6027\u8981\u6c42\u9ad8\r\n# 4. \u4e00\u6b21\u6027\u67e5\u8be2\u4efb\u52a1\r\n\r\nfrom everytools import SearchBuilder, FileFilter, DateFilter\r\n\r\n# \u590d\u6742\u67e5\u8be2\u793a\u4f8b\r\ndef complex_search():\r\n return (\r\n SearchBuilder()\r\n .keywords(\"project\")\r\n .filter(FileFilter().with_extensions(\"py\", \"js\"))\r\n .filter(DateFilter().modified_after(\"2024-01-01\"))\r\n .sort_by(SortType.DATE_MODIFIED_DESCENDING)\r\n .limit(50)\r\n .execute()\r\n .get_results()\r\n )\r\n```\r\n\r\n**\u6027\u80fd\u4f18\u5316\u6280\u5de7\uff1a**\r\n\r\n```python\r\n# 1. \u590d\u7528Search\u5b9e\u4f8b\r\nsearch = Search(\"\")\r\nfor keyword in [\"python\", \"java\", \"javascript\"]:\r\n search._query_string = keyword\r\n search.execute()\r\n results = search.get_results()\r\n # \u5904\u7406\u7ed3\u679c...\r\n\r\n# 2. \u9884\u8bbe\u5e38\u7528\u641c\u7d22\u914d\u7f6e\r\ndef create_optimized_search(query):\r\n return Search(\r\n query_string=query,\r\n max_results=100, # \u9650\u5236\u7ed3\u679c\u6570\u91cf\r\n request_flags=RequestFlag.FILE_NAME | RequestFlag.PATH # \u53ea\u8bf7\u6c42\u5fc5\u8981\u4fe1\u606f\r\n )\r\n\r\n# 3. \u6279\u91cf\u5904\u7406\r\ndef batch_search(keywords, batch_size=10):\r\n results = {}\r\n for i in range(0, len(keywords), batch_size):\r\n batch = keywords[i:i+batch_size]\r\n for keyword in batch:\r\n search = Search(keyword)\r\n search.execute()\r\n results[keyword] = search.get_results()\r\n return results\r\n```\r\n\r\n#### \u4f7f\u7528\u8fc7\u6ee4\u5668\r\n\r\neverytools\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u8fc7\u6ee4\u5668\u6765\u7cbe\u786e\u63a7\u5236\u641c\u7d22\u7ed3\u679c\uff1a\r\n\r\n```python\r\nfrom everytools import SearchBuilder, FileFilter, FolderFilter, MediaFilter, DocumentFilter, DateFilter, SizeFilter\r\n\r\n# \u6587\u4ef6\u8fc7\u6ee4\u5668 - \u641c\u7d22\u5927\u4e8e1MB\u7684Python\u6587\u4ef6\r\npython_files = FileFilter().with_extensions(\"py\").with_size_range(min_size=1024*1024)\r\n\r\n# \u6587\u4ef6\u5939\u8fc7\u6ee4\u5668 - \u641c\u7d22\u7a7a\u6587\u4ef6\u5939\r\nempty_folders = FolderFilter().empty_only()\r\n\r\n# \u5a92\u4f53\u8fc7\u6ee4\u5668 - \u641c\u7d22\u56fe\u7247\u6587\u4ef6\r\nimages = MediaFilter(\"image\") # \u652f\u6301 \"audio\", \"video\", \"image\", \"all\"\r\n\r\n# \u6587\u6863\u8fc7\u6ee4\u5668 - \u641c\u7d22Office\u6587\u6863\r\ndocuments = DocumentFilter(\"office\") # \u652f\u6301 \"office\", \"pdf\", \"text\", \"all\"\r\n\r\n# \u65e5\u671f\u8fc7\u6ee4\u5668 - \u641c\u7d22\u6700\u8fd1\u4fee\u6539\u7684\u6587\u4ef6\r\nrecent_files = DateFilter().modified_after(\"2024-01-01\")\r\n\r\n# \u5927\u5c0f\u8fc7\u6ee4\u5668 - \u641c\u7d22\u5927\u6587\u4ef6\r\nlarge_files = SizeFilter().larger_than_mb(100) # \u5927\u4e8e100MB\r\n\r\n# \u7ec4\u5408\u591a\u4e2a\u8fc7\u6ee4\u5668\r\nsearch = (\r\n SearchBuilder()\r\n .keywords(\"project\")\r\n .filter(python_files)\r\n .filter(recent_files)\r\n .sort_by(SortType.DATE_MODIFIED_DESCENDING)\r\n .execute()\r\n)\r\n```\r\n\r\n##### \u8fc7\u6ee4\u5668\u8be6\u7ec6\u8bf4\u660e\r\n\r\n**FileFilter\uff08\u6587\u4ef6\u8fc7\u6ee4\u5668\uff09**\r\n```python\r\nfile_filter = (\r\n FileFilter()\r\n .with_extensions(\"py\", \"txt\", \"md\") # \u6307\u5b9a\u6587\u4ef6\u6269\u5c55\u540d\r\n .with_size_range(min_size=1024, max_size=1024*1024) # \u6587\u4ef6\u5927\u5c0f\u8303\u56f4\r\n .with_content(\"TODO\") # \u641c\u7d22\u6587\u4ef6\u5185\u5bb9\uff08\u4ec5\u6587\u672c\u6587\u4ef6\uff09\r\n .duplicates_only() # \u4ec5\u663e\u793a\u91cd\u590d\u6587\u4ef6\r\n)\r\n```\r\n\r\n**DateFilter\uff08\u65e5\u671f\u8fc7\u6ee4\u5668\uff09**\r\n```python\r\ndate_filter = (\r\n DateFilter()\r\n .by_modified_date() # \u6309\u4fee\u6539\u65e5\u671f\u8fc7\u6ee4\r\n .in_range(\"2024-01-01\", \"2024-12-31\") # \u65e5\u671f\u8303\u56f4\r\n)\r\n\r\n# \u4fbf\u6377\u65b9\u6cd5\r\nrecent_created = DateFilter().created_after(\"2024-06-01\")\r\nrecent_modified = DateFilter().modified_after(\"2024-06-01\")\r\n```\r\n\r\n**SizeFilter\uff08\u5927\u5c0f\u8fc7\u6ee4\u5668\uff09**\r\n```python\r\nsize_filter = (\r\n SizeFilter()\r\n .larger_than_mb(10) # \u5927\u4e8e10MB\r\n .smaller_than_gb(1) # \u5c0f\u4e8e1GB\r\n)\r\n```\r\n\r\n#### \u5f02\u6b65\u641c\u7d22\r\n\r\n```python\r\nfrom everytools import SearchBuilder\r\n\r\n# \u521b\u5efa\u4e00\u4e2a\u5f02\u6b65\u641c\u7d22\r\nsearch = SearchBuilder().keywords(\"large files\").execute(async_query=True)\r\n\r\n# \u7b49\u5f85\u641c\u7d22\u5b8c\u6210\r\nif search.wait_for_completion(timeout_ms=5000):\r\n results = search.get_results()\r\n print(f\"\u627e\u5230 {len(results)} \u4e2a\u7ed3\u679c\")\r\nelse:\r\n print(\"\u641c\u7d22\u8d85\u65f6\uff01\")\r\n```\r\n\r\n### \u4f20\u7edfAPI (\u5411\u540e\u517c\u5bb9)\r\n\r\n\u4e3a\u4e86\u517c\u5bb9\u65e7\u7248\u672c\uff0c\u6211\u4eec\u7ee7\u7eed\u4fdd\u7559\u4e86\u4f20\u7edfAPI\uff1a\r\n\r\n```python\r\n# \u5bfc\u5165EveryTools\u7c7b\r\nfrom everytools import EveryTools\r\n\r\nes = EveryTools() # \u5b9e\u4f8b\u5316\uff0c\u53ea\u9700\u8981\u7b2c\u4e00\u6b21\u5c31\u884c\r\n```\r\n\r\n#### \u7528\u540d\u79f0\u641c\u7d22\r\n\r\n\u4f7f\u7528`search()`\u65b9\u6cd5\u53ef\u4ee5\u901a\u8fc7\u8f93\u5165\u5173\u952e\u8bcd\u68c0\u7d22\u6587\u4ef6\uff0c\u4e00\u822c\u5728\u51e0\u79d2\u5185\u80fd\u7ed3\u675f\uff0c\u68c0\u7d22\u5b8c\u540e\u53ef\u4ee5\u8bfb\u53d6\u7ed3\u679c\u6570\u91cf\u3002\r\n\r\n```python\r\nes.search('\u5de5\u4f5c')\r\nprint('everything reuslt number:', es.get_num_total_results()) # \u83b7\u53d6\u641c\u7d22\u7ed3\u679c\u5bf9\u8c61\u6570\u91cf\r\n```\r\n\r\n#### \u83b7\u53d6\u641c\u7d22\u6570\u91cf\r\n\r\n\u641c\u7d22\u540e\u53ef\u4ee5\u83b7\u5f97\u7684\u6570\u91cf\u6709\u4e09\u79cd\uff1a\u7ed3\u679c\u603b\u6570\u91cf\u3001\u6587\u4ef6\u6570\u91cf\u3001\u6587\u4ef6\u5939\u6570\u91cf\u3002\r\n\r\n```python\r\nes.get_num_total_results() #\u603b\u6570\u91cf\r\nes.get_num_total_file() # \u6587\u4ef6\u6570\u91cf\r\nes.get_num_total_folder() # \u6587\u4ef6\u5939\u6570\u91cf\r\n```\r\n\r\n#### \u83b7\u53d6\u641c\u7d22\u7ed3\u679c\r\n\r\n\u4f7f\u7528`results()`\u83b7\u53d6\u641c\u7d22\u7ed3\u679c\uff0c\u8be5\u8fd4\u56de\u4e3a\u8fed\u4ee3\u5668\u3002\u8f93\u51fa\u7ed3\u679c\u4f1a\u5305\u542bname, path\u7b49\u4fe1\u606f\uff0c\u7531\u4e8e\u68c0\u7d22\u4fe1\u606f\u9700\u8981\u8017\u4e00\u5b9a\u65f6\u95f4\uff0c\u6570\u91cf\u6bd4\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u7b49\u5f85\u7247\u523b\u3002\r\n\r\n```python\r\nresults = es.results() # \u83b7\u53d6\u8f93\u51fa\u7ed3\u679c\r\n\r\n# \u53ea\u6253\u5370\u524d\u4e94\u4e2a\u7ed3\u679c\r\nfor i, result in enumerate(results):\r\n if i >= 5:\r\n break\r\n print(result)\r\n```\r\n\r\n#### \u66f4\u6539\u7ed3\u679c\u6392\u5e8f\r\n\r\n\u66f4\u6539`results`\u65b9\u6cd5`sort_type`\u53c2\u6570\u5b9e\u73b0\u66f4\u6539\u6392\u5e8f\u7ed3\u679c\uff0c\u9ed8\u8ba4\u53c2\u6570\u4e3a`1`\uff0c\u5176\u4ed6\u53c2\u6570\u5982\u4e0b\uff1a\r\n\r\n| **\u6392\u5e8f\u7c7b\u578b** | **\u503c** |\r\n| :----------: | :----: |\r\n| \u540d\u79f0\u5347\u5e8f | 1 |\r\n| \u540d\u79f0\u964d\u5e8f | 2 |\r\n| \u8def\u5f84\u5347\u5e8f | 3 |\r\n| \u8def\u5f84\u964d\u5e8f | 4 |\r\n| \u5927\u5c0f\u5347\u5e8f | 5 |\r\n| \u5927\u5c0f\u964d\u5e8f | 6 |\r\n| \u62d3\u5c55\u540d\u5347\u5e8f | 7 |\r\n| \u62d3\u5c55\u540d\u964d\u5e8f | 8 |\r\n\r\n#### \u5feb\u901f\u641c\u7d22\u65b9\u6cd5\r\n\r\n```python\r\nes.search_audio() # \u641c\u7d22\u97f3\u9891\r\nes.search_zip() # \u641c\u7d22\u538b\u7f29\u5305\r\nes.search_doc() # \u641c\u7d22\u6587\u6863\r\nes.search_exe() # \u641c\u7d22\u53ef\u6267\u884c\u6587\u4ef6\r\nes.search_folder() # \u641c\u7d22\u6587\u4ef6\u5939\r\nes.search_pic() # \u641c\u7d22\u56fe\u7247\r\nes.search_video() # \u641c\u7d22\u89c6\u9891\r\nes.search_ext(ext='pdf') # \u641c\u7d22\u6587\u4ef6\u62d3\u5c55\r\nes.search_in_located('C:\\\\Users\\\\') # \u641c\u7d22\u6307\u5b9a\u6587\u4ef6\u5939\u4e0b\r\n```\r\n\r\n## \u9ad8\u7ea7\u529f\u80fd\r\n\r\n### \u641c\u7d22\u7ed3\u679c\u8be6\u7ec6\u4fe1\u606f\r\n\r\n\u6bcf\u4e2a\u641c\u7d22\u7ed3\u679c\u5305\u542b\u4e30\u5bcc\u7684\u6587\u4ef6\u4fe1\u606f\uff1a\r\n\r\n```python\r\nfrom everytools import SearchBuilder\r\n\r\nsearch = SearchBuilder().keywords(\"example\").limit(1).execute()\r\nresults = search.get_results()\r\n\r\nfor result in results:\r\n print(f\"\u6587\u4ef6\u540d: {result.name}\")\r\n print(f\"\u8def\u5f84: {result.path}\")\r\n print(f\"\u5b8c\u6574\u8def\u5f84: {result.full_path}\")\r\n print(f\"\u6587\u4ef6\u5927\u5c0f: {result.size} \u5b57\u8282\")\r\n print(f\"\u521b\u5efa\u65f6\u95f4: {result.date_created}\")\r\n print(f\"\u4fee\u6539\u65f6\u95f4: {result.date_modified}\")\r\n print(f\"\u8bbf\u95ee\u65f6\u95f4: {result.date_accessed}\")\r\n print(f\"\u6587\u4ef6\u6269\u5c55\u540d: {result.extension}\")\r\n print(f\"\u662f\u5426\u4e3a\u6587\u4ef6: {result.is_file}\")\r\n print(f\"\u662f\u5426\u4e3a\u6587\u4ef6\u5939: {result.is_folder}\")\r\n print(f\"\u6587\u4ef6\u5c5e\u6027: {result.attributes}\")\r\n```\r\n\r\n### \u6392\u5e8f\u9009\u9879\r\n\r\neverytools\u652f\u6301\u591a\u79cd\u6392\u5e8f\u65b9\u5f0f\uff1a\r\n\r\n```python\r\nfrom everytools import SearchBuilder, SortType\r\n\r\n# \u6309\u540d\u79f0\u6392\u5e8f\r\nsearch = SearchBuilder().keywords(\"test\").sort_by(SortType.NAME_ASCENDING).execute()\r\n\r\n# \u6309\u5927\u5c0f\u6392\u5e8f\r\nsearch = SearchBuilder().keywords(\"test\").sort_by(SortType.SIZE_DESCENDING).execute()\r\n\r\n# \u6309\u4fee\u6539\u65f6\u95f4\u6392\u5e8f\r\nsearch = SearchBuilder().keywords(\"test\").sort_by(SortType.DATE_MODIFIED_DESCENDING).execute()\r\n```\r\n\r\n**\u53ef\u7528\u7684\u6392\u5e8f\u7c7b\u578b\uff1a**\r\n- `NAME_ASCENDING` / `NAME_DESCENDING` - \u6309\u540d\u79f0\u6392\u5e8f\r\n- `PATH_ASCENDING` / `PATH_DESCENDING` - \u6309\u8def\u5f84\u6392\u5e8f \r\n- `SIZE_ASCENDING` / `SIZE_DESCENDING` - \u6309\u5927\u5c0f\u6392\u5e8f\r\n- `EXTENSION_ASCENDING` / `EXTENSION_DESCENDING` - \u6309\u6269\u5c55\u540d\u6392\u5e8f\r\n- `DATE_CREATED_ASCENDING` / `DATE_CREATED_DESCENDING` - \u6309\u521b\u5efa\u65f6\u95f4\u6392\u5e8f\r\n- `DATE_MODIFIED_ASCENDING` / `DATE_MODIFIED_DESCENDING` - \u6309\u4fee\u6539\u65f6\u95f4\u6392\u5e8f\r\n- `DATE_ACCESSED_ASCENDING` / `DATE_ACCESSED_DESCENDING` - \u6309\u8bbf\u95ee\u65f6\u95f4\u6392\u5e8f\r\n\r\n### \u9519\u8bef\u5904\u7406\r\n\r\neverytools\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u9519\u8bef\u5904\u7406\u673a\u5236\uff1a\r\n\r\n```python\r\nfrom everytools import SearchBuilder, EverythingError\r\n\r\ntry:\r\n search = SearchBuilder().keywords(\"test\").execute()\r\n results = search.get_results()\r\n print(f\"\u627e\u5230 {len(results)} \u4e2a\u7ed3\u679c\")\r\nexcept EverythingError as e:\r\n print(f\"\u641c\u7d22\u51fa\u9519: {e}\")\r\nexcept Exception as e:\r\n print(f\"\u5176\u4ed6\u9519\u8bef: {e}\")\r\n```\r\n\r\n### \u7cfb\u7edf\u4fe1\u606f\u67e5\u8be2\r\n\r\n```python\r\nfrom everytools.core.dll_loader import get_dll_loader\r\n\r\nloader = get_dll_loader()\r\nprint(f\"Everything\u7248\u672c: {loader.version}\")\r\nprint(f\"\u6570\u636e\u5e93\u5df2\u52a0\u8f7d: {loader.is_db_loaded()}\")\r\nprint(f\"\u7ba1\u7406\u5458\u6743\u9650: {loader.is_admin()}\")\r\n```\r\n\r\n## Everything\u641c\u7d22\u8bed\u6cd5\r\n\r\neverytools\u5b8c\u5168\u652f\u6301Everything\u7684\u5f3a\u5927\u641c\u7d22\u8bed\u6cd5\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728\u5173\u952e\u8bcd\u4e2d\u4f7f\u7528\uff1a\r\n\r\n### \u57fa\u672c\u8bed\u6cd5\r\n\r\n```python\r\n# \u901a\u914d\u7b26\r\nSearchBuilder().keywords(\"*.txt\").execute() # \u6240\u6709txt\u6587\u4ef6\r\nSearchBuilder().keywords(\"test?.doc\").execute() # test\u540e\u8ddf\u4e00\u4e2a\u5b57\u7b26\u7684doc\u6587\u4ef6\r\n\r\n# \u903b\u8f91\u64cd\u4f5c\u7b26\r\nSearchBuilder().keywords(\"python AND tutorial\").execute() # \u5305\u542bpython\u548ctutorial\r\nSearchBuilder().keywords(\"python OR java\").execute() # \u5305\u542bpython\u6216java\r\nSearchBuilder().keywords(\"python NOT tutorial\").execute() # \u5305\u542bpython\u4f46\u4e0d\u5305\u542btutorial\r\n\r\n# \u8def\u5f84\u641c\u7d22\r\nSearchBuilder().keywords(\"c:\\\\users\\\\\").execute() # \u5728\u7279\u5b9a\u8def\u5f84\u4e0b\u641c\u7d22\r\nSearchBuilder().keywords(\"parent:c:\\\\users\\\\\").execute() # \u7236\u76ee\u5f55\u4e3a\u6307\u5b9a\u8def\u5f84\r\n```\r\n\r\n### \u9ad8\u7ea7\u8bed\u6cd5\r\n\r\n```python\r\n# \u6587\u4ef6\u5927\u5c0f\r\nSearchBuilder().keywords(\"size:>1mb\").execute() # \u5927\u4e8e1MB\u7684\u6587\u4ef6\r\nSearchBuilder().keywords(\"size:1kb..1mb\").execute() # 1KB\u52301MB\u4e4b\u95f4\u7684\u6587\u4ef6\r\n\r\n# \u65e5\u671f\u641c\u7d22\r\nSearchBuilder().keywords(\"dm:today\").execute() # \u4eca\u5929\u4fee\u6539\u7684\u6587\u4ef6\r\nSearchBuilder().keywords(\"dc:2024\").execute() # 2024\u5e74\u521b\u5efa\u7684\u6587\u4ef6\r\nSearchBuilder().keywords(\"dm:>2024/1/1\").execute() # 2024\u5e741\u67081\u65e5\u540e\u4fee\u6539\u7684\u6587\u4ef6\r\n\r\n# \u6587\u4ef6\u5c5e\u6027\r\nSearchBuilder().keywords(\"attrib:h\").execute() # \u9690\u85cf\u6587\u4ef6\r\nSearchBuilder().keywords(\"attrib:r\").execute() # \u53ea\u8bfb\u6587\u4ef6\r\n\r\n# \u6b63\u5219\u8868\u8fbe\u5f0f\r\nSearchBuilder().keywords(\"regex:test\\\\d+\\\\.txt\").use_regex(True).execute()\r\n```\r\n\r\n### \u5e38\u7528\u641c\u7d22\u6a21\u5f0f\r\n\r\n```python\r\n# \u67e5\u627e\u91cd\u590d\u6587\u4ef6\r\nSearchBuilder().keywords(\"dupe:\").execute()\r\n\r\n# \u67e5\u627e\u7a7a\u6587\u4ef6\u5939\r\nSearchBuilder().keywords(\"empty:\").execute()\r\n\r\n# \u67e5\u627e\u5927\u6587\u4ef6\uff08\u524d100\u4e2a\u6700\u5927\u7684\u6587\u4ef6\uff09\r\nSearchBuilder().keywords(\"\").sort_by(SortType.SIZE_DESCENDING).limit(100).execute()\r\n\r\n# \u67e5\u627e\u6700\u8fd1\u4fee\u6539\u7684\u6587\u4ef6\r\nSearchBuilder().keywords(\"dm:today\").sort_by(SortType.DATE_MODIFIED_DESCENDING).execute()\r\n```\r\n\r\n## \u5b9e\u7528\u793a\u4f8b\r\n\r\n### \u5e38\u89c1\u4f7f\u7528\u573a\u666f\r\n\r\n#### 1. \u6e05\u7406\u91cd\u590d\u6587\u4ef6\r\n\r\n```python\r\nfrom everytools import SearchBuilder, FileFilter\r\n\r\n# \u67e5\u627e\u91cd\u590d\u6587\u4ef6\r\nduplicates = SearchBuilder().keywords(\"dupe:\").execute().get_results()\r\n\r\nprint(f\"\u627e\u5230 {len(duplicates)} \u4e2a\u91cd\u590d\u6587\u4ef6:\")\r\nfor file in duplicates:\r\n print(f\"- {file.full_path} ({file.size} bytes)\")\r\n```\r\n\r\n#### 2. \u67e5\u627e\u5927\u6587\u4ef6\u91ca\u653e\u7a7a\u95f4\r\n\r\n```python\r\nfrom everytools import SearchBuilder, SortType\r\n\r\n# \u67e5\u627e\u6700\u5927\u7684100\u4e2a\u6587\u4ef6\r\nlarge_files = (\r\n SearchBuilder()\r\n .keywords(\"\") # \u641c\u7d22\u6240\u6709\u6587\u4ef6\r\n .sort_by(SortType.SIZE_DESCENDING)\r\n .limit(100)\r\n .execute()\r\n .get_results()\r\n)\r\n\r\nprint(\"\u6700\u5927\u7684\u6587\u4ef6:\")\r\nfor file in large_files[:10]: # \u663e\u793a\u524d10\u4e2a\r\n size_mb = file.size / (1024 * 1024) if file.size else 0\r\n print(f\"- {file.name}: {size_mb:.2f} MB\")\r\n```\r\n\r\n#### 3. \u9879\u76ee\u6587\u4ef6\u7ba1\u7406\r\n\r\n```python\r\nfrom everytools import SearchBuilder, FileFilter, DateFilter\r\n\r\n# \u67e5\u627e\u9879\u76ee\u4e2d\u7684Python\u6587\u4ef6\uff0c\u6309\u6700\u8fd1\u4fee\u6539\u65f6\u95f4\u6392\u5e8f\r\nproject_files = (\r\n SearchBuilder()\r\n .keywords(\"C:\\\\MyProject\\\\\") # \u6307\u5b9a\u9879\u76ee\u8def\u5f84\r\n .filter(FileFilter().with_extensions(\"py\", \"js\", \"html\", \"css\"))\r\n .filter(DateFilter().modified_after(\"2024-01-01\"))\r\n .sort_by(SortType.DATE_MODIFIED_DESCENDING)\r\n .execute()\r\n .get_results()\r\n)\r\n\r\nprint(\"\u6700\u8fd1\u4fee\u6539\u7684\u9879\u76ee\u6587\u4ef6:\")\r\nfor file in project_files[:20]:\r\n print(f\"- {file.name} (\u4fee\u6539\u4e8e: {file.date_modified})\")\r\n```\r\n\r\n#### 4. \u5a92\u4f53\u6587\u4ef6\u6574\u7406\r\n\r\n```python\r\nfrom everytools import SearchBuilder, MediaFilter, SizeFilter\r\n\r\n# \u67e5\u627e\u5927\u4e8e50MB\u7684\u89c6\u9891\u6587\u4ef6\r\nlarge_videos = (\r\n SearchBuilder()\r\n .filter(MediaFilter(\"video\"))\r\n .filter(SizeFilter().larger_than_mb(50))\r\n .sort_by(SortType.SIZE_DESCENDING)\r\n .execute()\r\n .get_results()\r\n)\r\n\r\nprint(\"\u5927\u89c6\u9891\u6587\u4ef6:\")\r\nfor video in large_videos:\r\n size_gb = video.size / (1024 * 1024 * 1024) if video.size else 0\r\n print(f\"- {video.name}: {size_gb:.2f} GB\")\r\n```\r\n\r\n#### 5. \u7cfb\u7edf\u6e05\u7406\r\n\r\n```python\r\nfrom everytools import SearchBuilder, FileFilter\r\n\r\n# \u67e5\u627e\u4e34\u65f6\u6587\u4ef6\r\ntemp_files = (\r\n SearchBuilder()\r\n .filter(FileFilter().with_extensions(\"tmp\", \"temp\", \"cache\", \"log\"))\r\n .filter(DateFilter().modified_after(\"2024-01-01\"))\r\n .execute()\r\n .get_results()\r\n)\r\n\r\nprint(f\"\u627e\u5230 {len(temp_files)} \u4e2a\u4e34\u65f6\u6587\u4ef6\")\r\n\r\n# \u67e5\u627e\u7a7a\u6587\u4ef6\u5939\r\nempty_folders = SearchBuilder().keywords(\"empty:\").execute().get_results()\r\nprint(f\"\u627e\u5230 {len(empty_folders)} \u4e2a\u7a7a\u6587\u4ef6\u5939\")\r\n```\r\n\r\n### \u6027\u80fd\u4f18\u5316\u5efa\u8bae\r\n\r\n#### 1. \u4f7f\u7528\u9002\u5f53\u7684\u8fc7\u6ee4\u5668\r\n\r\n```python\r\n# \u597d\u7684\u505a\u6cd5\uff1a\u4f7f\u7528\u5177\u4f53\u7684\u8fc7\u6ee4\u5668\r\nsearch = (\r\n SearchBuilder()\r\n .keywords(\"report\")\r\n .filter(FileFilter().with_extensions(\"pdf\", \"docx\"))\r\n .filter(DateFilter().modified_after(\"2024-01-01\"))\r\n .limit(100) # \u9650\u5236\u7ed3\u679c\u6570\u91cf\r\n .execute()\r\n)\r\n\r\n# \u907f\u514d\uff1a\u8fc7\u4e8e\u5bbd\u6cdb\u7684\u641c\u7d22\r\n# search = SearchBuilder().keywords(\"\").execute() # \u4f1a\u8fd4\u56de\u6240\u6709\u6587\u4ef6\r\n```\r\n\r\n#### 2. \u5408\u7406\u4f7f\u7528\u9650\u5236\r\n\r\n```python\r\n# \u5bf9\u4e8e\u5927\u91cf\u7ed3\u679c\uff0c\u4f7f\u7528limit\u9650\u5236\r\nsearch = SearchBuilder().keywords(\"*.txt\").limit(1000).execute()\r\n\r\n# \u6216\u8005\u5206\u6279\u5904\u7406\r\ndef process_search_results(keywords, batch_size=100):\r\n search = SearchBuilder().keywords(keywords).execute()\r\n results = search.get_results()\r\n \r\n for i in range(0, len(results), batch_size):\r\n batch = list(results)[i:i+batch_size]\r\n # \u5904\u7406\u8fd9\u4e00\u6279\u7ed3\u679c\r\n yield batch\r\n```\r\n\r\n#### 3. \u5f02\u6b65\u641c\u7d22\u5904\u7406\r\n\r\n```python\r\nimport time\r\nfrom everytools import SearchBuilder\r\n\r\ndef search_with_timeout(keywords, timeout_seconds=10):\r\n search = SearchBuilder().keywords(keywords).execute(async_query=True)\r\n \r\n if search.wait_for_completion(timeout_ms=timeout_seconds * 1000):\r\n return search.get_results()\r\n else:\r\n print(\"\u641c\u7d22\u8d85\u65f6\")\r\n return []\r\n\r\n# \u4f7f\u7528\u793a\u4f8b\r\nresults = search_with_timeout(\"large files\", timeout_seconds=5)\r\n```\r\n\r\n## \u6545\u969c\u6392\u9664\r\n\r\n### \u5e38\u89c1\u95ee\u9898\r\n\r\n#### 1. Everything\u672a\u8fd0\u884c\r\n\r\n```python\r\nfrom everytools.core.dll_loader import get_dll_loader\r\n\r\ntry:\r\n loader = get_dll_loader()\r\n if not loader.is_db_loaded():\r\n print(\"Everything\u6570\u636e\u5e93\u672a\u52a0\u8f7d\uff0c\u8bf7\u786e\u4fddEverything\u6b63\u5728\u8fd0\u884c\")\r\nexcept Exception as e:\r\n print(f\"\u65e0\u6cd5\u8fde\u63a5\u5230Everything: {e}\")\r\n print(\"\u8bf7\u786e\u4fdd\uff1a\")\r\n print(\"1. Everything\u5df2\u5b89\u88c5\u5e76\u6b63\u5728\u8fd0\u884c\")\r\n print(\"2. Everything\u670d\u52a1\u5df2\u542f\u52a8\")\r\n print(\"3. \u5f53\u524d\u7528\u6237\u6709\u8db3\u591f\u6743\u9650\")\r\n```\r\n\r\n#### 2. DLL\u52a0\u8f7d\u5931\u8d25\r\n\r\n```python\r\nimport os\r\nfrom everytools.utils.download import download_sdk_dll\r\n\r\n# \u624b\u52a8\u4e0b\u8f7dDLL\r\ndll_dir = os.path.join(os.path.dirname(__file__), \"everytools\", \"dll\")\r\ntry:\r\n download_sdk_dll(dll_dir)\r\n print(\"DLL\u4e0b\u8f7d\u6210\u529f\")\r\nexcept Exception as e:\r\n print(f\"DLL\u4e0b\u8f7d\u5931\u8d25: {e}\")\r\n```\r\n\r\n#### 3. \u641c\u7d22\u7ed3\u679c\u4e3a\u7a7a\r\n\r\n```python\r\nfrom everytools import SearchBuilder\r\n\r\nsearch = SearchBuilder().keywords(\"test\").execute()\r\nresults = search.get_results()\r\n\r\nif len(results) == 0:\r\n print(\"\u641c\u7d22\u7ed3\u679c\u4e3a\u7a7a\uff0c\u53ef\u80fd\u7684\u539f\u56e0\uff1a\")\r\n print(\"1. \u641c\u7d22\u5173\u952e\u8bcd\u4e0d\u5b58\u5728\")\r\n print(\"2. Everything\u7d22\u5f15\u672a\u5b8c\u6210\")\r\n print(\"3. \u641c\u7d22\u8def\u5f84\u4e0d\u5728\u7d22\u5f15\u8303\u56f4\u5185\")\r\n \r\n # \u5c1d\u8bd5\u66f4\u5bbd\u6cdb\u7684\u641c\u7d22\r\n broad_search = SearchBuilder().keywords(\"*\").limit(10).execute()\r\n broad_results = broad_search.get_results()\r\n print(f\"\u5bbd\u6cdb\u641c\u7d22\u627e\u5230 {len(broad_results)} \u4e2a\u7ed3\u679c\")\r\n```\r\n\r\n## \u5176\u4ed6\u65b9\u6cd5\r\n\r\n### \u67e5\u770b\u7248\u672c\u4fe1\u606f\r\n\r\n```python\r\n# \u65b0API\u65b9\u5f0f\r\nfrom everytools.core.dll_loader import get_dll_loader\r\nloader = get_dll_loader()\r\nprint(f\"Everything\u7248\u672c: {loader.version}\")\r\n\r\n# \u4f20\u7edfAPI\u65b9\u5f0f\r\nfrom everytools import EveryTools\r\nes = EveryTools()\r\nprint(f\"\u4e3b\u8981\u7248\u672c: {es.major_version}\")\r\nprint(f\"\u6b21\u8981\u7248\u672c: {es.minor_version}\")\r\nprint(f\"\u4fee\u6b63\u7248: {es.revision}\")\r\nprint(f\"\u7f16\u8bd1\u53f7: {es.build_number}\")\r\nprint(f\"\u5b8c\u6574\u7248\u672c: {es.version}\")\r\n```\r\n\r\n\r\n\r\n## \u7248\u672c\u66f4\u65b0\r\n\r\n| **\u7248\u672c** | **\u66f4\u65b0\u5185\u5bb9** | **\u65e5\u671f** |\r\n| :------: | :------------------------------------------------------------: | :--------: |\r\n| 0.2.1 | \u4fee\u590dfilters\u5404\u79cdbug | 2025-07-19 |\r\n| 0.2.0 | \u91cd\u6784\u9879\u76ee\u67b6\u6784\uff0c\u63d0\u4f9b\u65b0\u7684\u73b0\u4ee3API\uff0c\u652f\u6301\u5f02\u6b65\u641c\u7d22\u548c\u66f4\u591a\u8fc7\u6ee4\u529f\u80fd | 2025-07-19 |\r\n| 0.0.1.4 | \u53bb\u6389\u591a\u4f59\u7684pandas\u6a21\u5757 | 2025-07-06 |\r\n| 0.0.1.2 | \u4fee\u590d\u641c\u7d22\u62d3\u5c55\u4e0d\u751f\u6548\uff0c\u8f93\u51fa\u7ed3\u679c\u65b0\u589e\u62d3\u5c55\u540d\uff0c\u4f18\u5316\u641c\u7d22\u4e3a\u7a7a\u8fd4\u56de\u503c | 2021-10-06 |\r\n| 0.0.1.1 | \u4fee\u590d\u5b89\u88c5\u65f6\u73af\u5883\u4f9d\u8d56\u8b66\u544a | 2021-09-25 |\r\n| 0.0.1.0 | \u63d0\u4f9beverything\u57fa\u672c\u641c\u7d22\u4ee5\u53ca\u5feb\u901f\u641c\u7d22\u65b9\u6cd5\u3002 | 2021-09-25 |\r\n\r\n## \u8054\u7cfb\u4f5c\u8005\r\n\r\n**\u4f5c\u8005(author)\uff1aJan Yang**\r\n\r\n**\u90ae\u7bb1(Email)\uff1ayang.jiada@foxmail.com**\r\n\r\n",
"bugtrack_url": null,
"license": null,
"summary": "Python tools for Everything search engine",
"version": "0.2.2",
"project_urls": {
"Homepage": "https://github.com/yangjiada/everytools"
},
"split_keywords": [
"everything",
" everytools",
" windows",
" file",
" search",
" file search",
" everything sdk"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "a7318f1941d7080905b3f035fc31e8e8274d60e582b493e80d196b1e23a1cdc9",
"md5": "c2e1d807972fab84cd67f927a3878e22",
"sha256": "431551eda275173836870d9d27903e7c4ad41fad1bd2a36bd6809542effe685e"
},
"downloads": -1,
"filename": "everytools-0.2.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c2e1d807972fab84cd67f927a3878e22",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 121174,
"upload_time": "2025-07-20T00:13:29",
"upload_time_iso_8601": "2025-07-20T00:13:29.386506Z",
"url": "https://files.pythonhosted.org/packages/a7/31/8f1941d7080905b3f035fc31e8e8274d60e582b493e80d196b1e23a1cdc9/everytools-0.2.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6c13b005c4aaeb00c531af73adf0ab19b380a537462af260246366f7dbabffab",
"md5": "639de141b2d7de21d54000ad2afbfd5d",
"sha256": "732ff51c5e3cbc12c640aff2071703e5c86dcf58ea7e831f7ebbc0f56f62aeed"
},
"downloads": -1,
"filename": "everytools-0.2.2.tar.gz",
"has_sig": false,
"md5_digest": "639de141b2d7de21d54000ad2afbfd5d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 135201,
"upload_time": "2025-07-20T00:13:31",
"upload_time_iso_8601": "2025-07-20T00:13:31.539404Z",
"url": "https://files.pythonhosted.org/packages/6c/13/b005c4aaeb00c531af73adf0ab19b380a537462af260246366f7dbabffab/everytools-0.2.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-20 00:13:31",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "yangjiada",
"github_project": "everytools",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "everytools"
}