windows 我的Python程序如何避免“PermissionError:[WinError 5]当符号链接“C:\Program Files”中的文件时,访问被拒绝”

mwecs4sa  于 2022-11-26  发布在  Windows
关注(0)|答案(1)|浏览(283)

我的C:驱动器,一个256 GB固态硬盘。
我开始寻找一种方法,将“C:\Program Files”和“C:\Program Files(x86)”中的文件移动到另一个磁盘。在谷歌搜索(永远)之后,我决定编写自己的Python程序,将这些目录中的文件复制到目标驱动器,并将符号链接留在原始位置。由于这些文件在技术上不会移动,Windows应该不会在意。
在测试之后,我开始尝试从“C:\Program Files(x86)"中移动文件。我将几个子目录移动到空间更大的驱动器上,似乎没有什么问题。甚至WinMerge也说移动后的目录与原始目录完全相同,这应该意味着符号链接是正常的。
注意事项:

  • Python程序是在我的帐户下从cmd.exe“以管理员身份”运行的,以避免权限错误。
  • 计算机已被置于安全模式,以避免在尝试移动可能正在运行的程序时出现问题。
  • 我的用户帐户具有管理员权限。
  • “设定”/“病毒与威胁防护”中的“受控文件夹存取”为“关闭”。

尽管采取了这些预防措施,但在尝试从(x86)、Calibre 2移动另一个目录时,我仍收到10个类似以下内容的错误:

Traceback (most recent call last):
  File "C:\Users\...\symmer.py", line 254, in _mv
    os.remove(ps)
PermissionError: [WinError 5] Access is denied: 'C:\\Program Files (x86)\\Calibre2\\app\\bin\\api-ms-win-core-console-l1-1-0.dll'

错误不全是. dll。有7个错误是关于. dll、1个.xml文件、1个.pak文件和一个exe的。但它们都是[WinError 5]。
相关的Python 3.10.2代码很简单:

# Copy source file to destination if not there.
if not Path(dpath).exists():
    shutil.copyfile(ps, dpath)
# Delete source file from its directory.
os.remove(ps)
# Create a symlink in the source file's directory to dpath.
# Program needs to run "as admin" on Windows.
os.symlink(dpath, ps)

所以remove()失败是因为Windows拒绝访问。考虑到上面的预防措施,我看不出这是怎么可能的。我必须直接从管理员帐户运行程序以避免错误吗?这将是一个问题,因为我很确定我在安装Windows时从未给该帐户提供密码。

1l5u6lss

1l5u6lss1#

有些程序甚至在安全模式下运行。您可以尝试找到任何可能正在使用这些文件的服务,并停止它们,但这可能还不够。就像您说的,问题是删除,所以我建议复制而不是删除。然后,您可以创建一个可启动的Windows USB驱动器,并从该驱动器启动,以完成删除并创建符号链接。(您可以使用Linux USB驱动器,但其中一些驱动器默认不支持NTFS)

相关问题