Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions pylnk3.py
Original file line number Diff line number Diff line change
Expand Up @@ -586,9 +586,9 @@ def __init__(self, bytes=None):
version_offset = read_short(buf)

@classmethod
def create_for_path(cls, path):
def create_for_path(cls, path, entry_type):
entry = cls()
entry.type = os.path.isdir(path) and TYPE_FOLDER or TYPE_FILE
entry.type = entry_type
try:
st = os.stat(path)
entry.file_size = st.st_size
Expand Down Expand Up @@ -690,7 +690,7 @@ def bytes(self):
return out.getvalue()

def __str__(self):
return "<PathSegmentEntry: %s>" % self.full_name
return f"<PathSegmentEntry: {self.full_name} ({self.type})>"


class UwpSubBlock:
Expand Down Expand Up @@ -1803,7 +1803,26 @@ def for_file(
elements = [RootEntry(ROOT_MY_COMPUTER),
DriveEntry(levels[0])]
for level in levels[1:]:
segment = PathSegmentEntry.create_for_path(level)
entry_type = None
# check if entry exists in file system
if os.path.exists(level):
# check if entry is dir
if os.path.isdir(level):
entry_type = TYPE_FOLDER
elif os.path.isfile(level):
entry_type = TYPE_FILE
else:
raise RuntimeError(f"Unknown file system entry type for path: {level}")
else:
# path does not exist (creating from linux or different system)
# set TYPE_FOLDER by default, unless it's the last entry (which is the file)
# not possible to create links to folders
if level == levels[-1]:
entry_type = TYPE_FILE
else:
entry_type = TYPE_FOLDER

segment = PathSegmentEntry.create_for_path(level, entry_type)
elements.append(segment)
lnk.shell_item_id_list = LinkTargetIDList()
lnk.shell_item_id_list.items = elements
Expand Down