diff --git a/com/tagdox/__init__.py b/com/tagdox/__init__.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6af8b31c0f3cd7963b9c6a04df64a06231a70793 100644
--- a/com/tagdox/__init__.py
+++ b/com/tagdox/__init__.py
@@ -0,0 +1,6 @@
+from com.tagdox.cores.FileTags import FileTags
+
+
+__all__ = [
+ "FileTags"
+]
\ No newline at end of file
diff --git a/com/tagdox/cores/FileTags.py b/com/tagdox/cores/FileTags.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e59e142c1aa11fd09b56c6b59232af82a1c597c
--- /dev/null
+++ b/com/tagdox/cores/FileTags.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+from typing import Set, TextIO
+import os
+import logging
+from time import sleep
+
+
+class FileTags:
+ __tags: Set[str]
+ __filename: str
+ __filestream: TextIO
+
+ def __init__(self, filename: str):
+ """
+ 构造方法\n
+ :param filename: 文件名
+ :return 空
+ """
+ self.__filename = filename
+ self.__open_tags()
+
+ def __str__(self):
+ """
+ 格式化成字符串\n
+ """
+ return "filename: %s\ntags: %s" % (self.__filename, self.__tags)
+
+ def __enter__(self):
+ """
+ 允许使用with语句\n
+ """
+ self.__open_tags()
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ """
+ 允许使用with语句\n
+ """
+ self.close()
+
+ def __open_tags(self):
+ """
+ 打开标签\n
+ """
+ logging.debug("打开文件标签" + self.__filename)
+ try:
+ self.__filestream = open(self.__filename + ":tags", "r+", encoding="utf8")
+ self.__tags = set(list(map(lambda x: x.strip(), self.__filestream.readlines())))
+ except FileNotFoundError as e:
+ self.__filestream = open(self.__filename + ":tags", "w", encoding="utf8")
+ self.__tags = set()
+
+ def add_tag(self, tag_name: str) -> None:
+ """
+ :param tag_name: 标签名
+ :return 空
+ """
+ if len(tag_name) > 0:
+ self.__tags.add(tag_name)
+ else:
+ logging.warning("文件%s新建标签不能为空" % self.__filename)
+
+ def remove_tag(self, tag_name: str) -> None:
+ """
+ :param tag_name: 标签名
+ :return 空
+ """
+ if tag_name in self.__tags:
+ self.__tags.remove(tag_name)
+ else:
+ logging.warning("文件%s没有标签%s" % (self.__filename, tag_name))
+
+ def clear_tags(self):
+ """
+ 清除标签信息\n
+ """
+ self.__tags.clear()
+
+ def save_tags(self):
+ """
+ 保存标签\n
+ """
+ self.__filestream.seek(0)
+ self.__filestream.truncate()
+ if len(self.__tags) > 0:
+ self.__filestream.writelines(list(map(lambda x: x + "\n", self.__tags)))
+
+ def get_tags(self) -> Set[str]:
+ """
+ 获取标签\n
+ """
+ return self.__tags
+
+ def close(self):
+ """
+ 关闭文件\n
+ """
+ self.save_tags()
+ logging.debug("关闭文件标签" + self.__filename)
+ self.__filestream.close()
+ if len(self.__tags) == 0:
+ os.remove(self.__filename + ":tags")
+ sleep(0.01) # 调用系统api删除文件是异步操作
+
+
+if __name__ == '__main__':
+ file = FileTags(filename="./src/img.png")
+ # file.add_tag("picture")
+ # file.add_tag("icons")
+ # file.add_tag("test")
+ # file.save_tags()
+ # file.clear_tags()
+ file.close()
+
diff --git a/com/tagdox/cores/ManageTag.py b/com/tagdox/cores/ManageTag.py
deleted file mode 100644
index a2ebf9cad36ccf0a35f621a6b8100ed30f37500e..0000000000000000000000000000000000000000
--- a/com/tagdox/cores/ManageTag.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- coding: utf-8 -*-
-from typing import Set
-import os
-
-
-class FileTags:
- __raw_file: bytes
- __tags: Set[str]
- __filename: str
-
- def __init__(self, filename: str):
- """
- 构造方法\n
- :param filename: 文件名
- :return 空
- """
- with open(filename, "rb") as f:
- self.__raw_file = f.read()
- try:
- with open(filename + ":tags", "r", encoding="utf8") as f:
- self.__tags = set(list(map(lambda x: x.strip(), f.readlines())))
- except FileNotFoundError as e:
- self.__tags = set()
- self.__filename = filename
-
- def __str__(self):
- """
- 格式化成字符串\n
- """
- return "filename: %s\ntags: %s" % (self.__filename, self.__tags)
-
- def add_tag(self, tag_name: str) -> None:
- """
- :param tag_name: 标签名
- :return 空
- """
- self.__tags.add(tag_name)
-
- def remove_tag(self, tag_name: str) -> None:
- """
- :param tag_name: 标签名
- :return 空
- """
- self.__tags.remove(tag_name)
-
- def clear_tags(self):
- """
- 清除标签信息\n
- """
- try:
- os.remove(self.__filename + ":tags")
- except FileNotFoundError as e:
- pass
-
- def show_tags(self) -> None:
- """
- 显示标签\n
- """
- print(self.__tags)
-
- def save_tags(self):
- """
- 保存标签\n
- """
- with open(self.__filename + ":tags", "w", encoding="utf8") as f:
- f.writelines(list(map(lambda x: x + "\n", self.__tags)))
-
- def save_rawfile(self):
- """
- 保存文件字节\n
- """
- with open(self.__filename, "wb") as f:
- f.write(self.__raw_file)
-
- def get_tags(self) -> Set[str]:
- """
- 获取标签\n
- """
- return self.__tags
-
- def close(self):
- """
- 关闭文件\n
- """
- self.save_rawfile()
- self.save_tags()
-
-
-if __name__ == '__main__':
- file = FileTags(filename="../../../src/img.png")
- # file.add_tag("picture")
- # file.add_tag("icons")
- # file.add_tag("test")
- # file.save_tags()
- file.show_tags()
- # file.clear_tags()
diff --git a/com/tagdox/utils/TagOps.py b/com/tagdox/utils/TagOps.py
new file mode 100644
index 0000000000000000000000000000000000000000..32040e1bf09f09af3489fad2dbd95421caa53ddc
--- /dev/null
+++ b/com/tagdox/utils/TagOps.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+from com.tagdox.cores.FileTags import FileTags
+from typing import Set
+
+
+def get_tags(filename: str) -> Set[str]:
+ """
+ 获取文件标签\n
+ :param filename: 文件路径
+ :return: 标签字典
+ """
+ with FileTags(filename) as f:
+ return f.get_tags()
+
+
+def add_tag(filename: str, tag: str) -> None:
+ """
+ 增加标签\n
+ :param filename: 文件路径
+ :param tag: 标签名
+ :return: 空
+ """
+ with FileTags(filename) as f:
+ f.add_tag(tag)
+
+
+def remove_tag(filename: str, tag: str) -> None:
+ """
+ 删除标签\n
+ :param filename: 文件路径
+ :param tag: 标签名
+ :return: 空
+ """
+ with FileTags(filename) as f:
+ f.remove_tag(tag)
+
+
+def clear_tags(filename: str) -> None:
+ """
+ 清除标签\n
+ :param filename: 文件路径
+ :return: 空
+ """
+ with FileTags(filename) as f:
+ f.clear_tags()
+
+
+if __name__ == '__main__':
+ clear_tags("./src/img.png")
+ # add_tag("./src/img.png", "test")
+ # add_tag("./src/img.png", "tag")
+ # print(get_tags("./src/img.png"))
+ # remove_tag("./src/img.png", "test")
+ print(get_tags("./src/img.png"))
\ No newline at end of file
diff --git a/com/tagdox/utils/__init__.py b/com/tagdox/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..7e113b6a564ad721f9d5e1e7e1c5279e140a450e
--- /dev/null
+++ b/com/tagdox/utils/__init__.py
@@ -0,0 +1,9 @@
+from com.tagdox.utils.TagOps import get_tags, clear_tags, add_tag, remove_tag
+
+
+__all__ = [
+ "get_tags",
+ "clear_tags",
+ "add_tag",
+ "remove_tag"
+]
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..73dc99c70a87e51744fc14b63af7210e04744e6b
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,2 @@
+future~=0.18.2
+windnd~=1.0.7
\ No newline at end of file
diff --git "a/\346\233\264\346\226\260\350\256\260\345\275\225.md" "b/\346\233\264\346\226\260\350\256\260\345\275\225.md"
index 2d8b60d61ea066c912afdd9e46c4ca945e2cf95d..8e1e3a57705e3c3fc17564c6e7b53962b75e7e3f 100644
--- "a/\346\233\264\346\226\260\350\256\260\345\275\225.md"
+++ "b/\346\233\264\346\226\260\350\256\260\345\275\225.md"
@@ -9,6 +9,10 @@
## 更新记录
+#### v0.21.0.1 2021年10月4日
+优化标签类封装逻辑,关闭文件前一直占用文件。
+新增常用工具函数,直接对标签进行增加、删除、清空、查询。
+新增依赖说明requirements.txt。
#### v0.21.0.0 2021年10月3日
优化标签逻辑,采用NTFS流模式,不再影响文件名(测试版)。
优化右键响应,现在可以正确在被点击的项目处出现右键菜单了。