下载可执行文件时有时会出现权限被拒绝

1 投票
1 回答
1120 浏览
提问于 2025-04-17 13:28

我正在写一个脚本,用来下载文件,如果下载没有完成,就从中断的地方继续下载。这部分我已经解决了。

我把所有其他的部分都去掉了,只留下了不工作的那部分。这里的亚马逊网址是我随便编的,所以如果你运行这个代码,实际上不会下载任何东西,但如果把网址换成一个真实的下载链接,就可以了:

import urllib
import time
import os

file_name = "setup.exe"
web_page = urllib.FancyURLopener().open("https://s3.amazonaws.com/some_bucket/files/"+file_name)
while True:
    data = web_page.read(8192)
    if not data:
        print "done"
        break
    #print os.getcwd()
    with open(file_name, "ab") as outputFile:
        outputFile.write(data)
    #print "going..."
    #time.sleep(1)

发生的情况是(这仅仅是在尝试下载EXE文件时),这个过程会从网页读取一个看似随机的次数(大约在1到20次之间),然后抛出一个IOError: 13,权限被拒绝的错误。再说一次,对于.gif或.mov文件,或者我测试过的其他一些文件,权限被拒绝的错误从来没有出现过。

另外,取消注释time.sleep(1)这一行就解决了这个问题。就好像with语句在继续之前没有完全关闭文件一样。

我以为with语句应该会处理关闭的事情,不是吗?

我还想,也许我的当前目录被改变了,但取消注释后并没有显示出这一点(不过按照同样的逻辑,它也不一定需要显示)。

(还有一点奇怪的是,如果我从桌面运行这个脚本[这样它也会写入桌面],而且Aptana在前面打开,权限被拒绝的错误就不会出现,但一旦我最小化文本编辑器去关注桌面,错误就会出现——我认为这是因为Aptana占用了很多资源,所以在打开的时候减慢了其他进程,有点像time.sleep的效果??)

非常感谢任何指点。

1 个回答

1

我不明白你为什么要每次网络读取时都去打开和关闭文件。正如Pavel所说,这样可能会让病毒扫描器有机会打开(并锁定?)这个文件进行扫描。为什么不一次性打开文件,完成所有的输入输出操作后再关闭呢?(我想这可能和你省略的代码有关。)

而不是:

while True:
    data = web_page.read(8192)
    if not data:
        print "done"
        break
    with open(file_name, "ab") as outputFile:
        outputFile.write(data)

试试:

with open(file_name, "ab") as outputFile:
    while True:
        data = web_page.read(8192)
        if not data:
            print "done"
            break
        outputFile.write(data)

撰写回答