diff --git a/package.json b/package.json index f4d7e863c..c06c8a775 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "asar": false, "target": "nsis", "icon": "src/electron/frontend/assets/app-icon/logo-guide-draft.ico", - "requestedExecutionLevel": "requireAdministrator" + "requestedExecutionLevel": "asInvoker" }, "mac": { "asar": true, diff --git a/src/pyflask/manageNeuroconv/manage_neuroconv.py b/src/pyflask/manageNeuroconv/manage_neuroconv.py index 882aea8b9..676d084c4 100644 --- a/src/pyflask/manageNeuroconv/manage_neuroconv.py +++ b/src/pyflask/manageNeuroconv/manage_neuroconv.py @@ -7,6 +7,7 @@ import math import os import re +import sys import traceback import zoneinfo from datetime import datetime, timedelta @@ -28,6 +29,37 @@ progress_handler = TQDMProgressHandler() + +def create_link(target, link, target_is_dir=False): + """Create a filesystem link, using junctions/hard links on Windows when symlinks aren't available.""" + target = str(target) + link = str(link) + + if sys.platform != "win32": + os.symlink(target, link, target_is_dir=target_is_dir) + return + + try: + os.symlink(target, link, target_is_dir=target_is_dir) + return + except OSError: + pass + + if target_is_dir: + import _winapi + + _winapi.CreateJunction(target, link) + else: + try: + os.link(target, link) + except OSError: + raise OSError( + f"Cannot create a link from '{link}' to '{target}'. " + "On Windows, either run NWB GUIDE as Administrator, " + "or ensure the source and destination are on the same drive." + ) + + EXCLUDED_RECORDING_INTERFACE_PROPERTIES = ["contact_vector", "contact_shapes", "group", "location"] EXTRA_INTERFACE_PROPERTIES = { @@ -1341,7 +1373,7 @@ def convert_to_nwb( # Create a pointer to the actual conversion outputs if not default_output_directory.exists(): - os.symlink(resolved_output_directory, default_output_directory) + create_link(resolved_output_directory, default_output_directory, target_is_dir=True) return dict(file=str(output_path)) @@ -1675,7 +1707,7 @@ def _aggregate_symlinks_in_new_directory(paths, reason="", folder_path=None) -> list(map(lambda name: os.path.join(path, name), os.listdir(path))), None, new_path ) else: - new_path.symlink_to(path, path.is_dir()) + create_link(path, new_path, target_is_dir=path.is_dir()) return folder_path