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流模式,不再影响文件名(测试版)。 优化右键响应,现在可以正确在被点击的项目处出现右键菜单了。