forked from RaidingForPants/hd2-audio-modder
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfileutil.py
More file actions
54 lines (42 loc) · 1.53 KB
/
fileutil.py
File metadata and controls
54 lines (42 loc) · 1.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import os
import pathlib
from const import SUPPORTED_AUDIO_TYPES
class INode:
def __init__(self, isdir: bool, absolute_path: str, basename: str):
self.absolute_path: str = absolute_path
self.basename: str = basename
self.isdir = isdir
self.nodes: list[INode] = []
def generate_file_tree(path) -> INode | None:
if not os.path.exists(path):
return None
inodes: dict[str, INode] = {}
for dirpath, dirnames, filenames in os.walk(path):
curr = None
if dirpath not in inodes:
curr = INode(True, dirpath, os.path.basename(dirpath))
inodes[dirpath] = curr
else:
curr = inodes[dirpath]
for dirname in dirnames:
absolute_path = os.path.join(dirpath, dirname)
inode = INode(True, absolute_path, dirname)
inodes[absolute_path] = inode
curr.nodes.append(inode)
for filename in filenames:
_, ext = os.path.splitext(filename)
if ext in SUPPORTED_AUDIO_TYPES or "patch" in ext:
curr.nodes.append(INode(
False, os.path.join(dirpath, filename), filename))
return inodes[path]
def traverse(node):
stack: list[INode] = [node]
while len(stack) > 0:
top = stack.pop()
for node in top.nodes:
if node.isdir:
stack.append(node)
def to_posix(path: str, abs: bool = False):
if abs:
path = os.path.abspath(path)
return pathlib.PurePath(path).as_posix()