TeamSpen210 / HammerAddons

Useful tweaks and content for Source Engine Games
124 stars 36 forks source link

[WinError 5] Access Denied in Postcompiler #269

Closed electrovoyage closed 3 days ago

electrovoyage commented 5 months ago
[E] logger.except_handler(): Uncaught Exception:
Traceback (most recent call last):
  File "hammeraddons\postcompiler.py", line 315, in <module>
  File "trio\_core\_run.py", line 2010, in run
  File "hammeraddons\postcompiler.py", line 303, in main
  File "srctools\bsp.py", line 1455, in save
  File "srctools\__init__.py", line 534, in __exit__
PermissionError: [WinError 5] Access denied: 'd:\\steam\\steamapps\\common\\portal 2\\sdk_content\\maps\\tmp_3' -> 'd:\\steam\\steamapps\\common\\portal 2\\sdk_content\\maps\\zoo_under_walkway.bsp'

When running the postcompiler, I sometimes get this message, and sometimes I don't. This always causes the postcompiler to crash/quit. I have no idea why it's getting denied permission. Perhaps implement a system where it basically retries this a couple times in case of an exception? If it's still unsuccessful, the exception can be thrown anyway.

TeamSpen210 commented 5 months ago

That could be because you have the BSP open in another program, like the game - if open it can't be written to, so it gets an access denied error. I have the postcompiler write the new BSP to a temp file then rename it over the original, that way it's more difficult to get a partially-written BSP.

electrovoyage commented 5 months ago

The file is open in the game. However, the game is running a BSP from portal2/maps/ and the postcompiler is getting denied access to a map in sdk_content/maps/. The compile chain ends with a copy command, which means the file in portal2/maps/ isn't a symlink to the one in sdk_content/maps/, in which case I could see how it would be getting denied access.

electrovoyage commented 5 months ago

Also, this error results in dozens of temp files piling up and not being deleted.

electrovoyage commented 3 days ago

That could be because you have the BSP open in another program, like the game - if open it can't be written to, so it gets an access denied error. I have the postcompiler write the new BSP to a temp file then rename it over the original, that way it's more difficult to get a partially-written BSP.

Turns out yes, it was open in another program, but not the game. My sdk_content/maps/ folder is a symlink to my Dropbox folder, and when the postcompiler was trying to rename the file, Dropbox just so happened to be trying so sync it.

TeamSpen210 commented 3 days ago

Ah, I've had issues with that myself in the past. What I do is use the robocopy.exe program, which lets you copy one folder to another, checking the source continuously for changes. So whenever sdk_content changes, it gets copied to my dropbox which then sync.