我有一个GUI(lxn / walk)应用程序修补程序,可通过ftp下载文件,将其流式传输到临时文件,然后提取内容以更新本地文件。删除文件命令被推迟。
这是可行的,除非用户在下载文件时退出程序,然后文件不会被删除。
我试图通过捕获信号并在那里删除文件来正常退出来解决此问题。但不幸的是,它抛出一个错误,因为另一个程序正在使用该文件,因此无法将其删除。这是有道理的,因为另一个程序本身实际上仍在写入临时文件。
现在,我陷入困境,不知道该怎么办,以确保在修补程序未运行后临时文件自动消失。我如何正确地做到这一点?
也可以将文件创建为普通文件,而不仅仅是临时文件。我也想问一下,在Windows哪里最好写一个临时文件?
答案 0 :(得分:2)
现在,我陷入困境,不知道该怎么办,以确保在修补程序未运行后临时文件自动消失。我如何正确地做到这一点?
没有保证的方法来完成此操作,因为超出应用程序控制范围的许多事情都可能导致它退出。由于某些硬件问题而导致的电源故障或内核崩溃可能会使计算机崩溃或迫使其重新启动。
一种常用的策略是在程序启动时检查上一次运行的状态。一些应用程序在启动时创建一个锁定文件,并在正常退出时将其删除。如果重新启动程序时此锁定文件存在,则意味着先前的运行未导致干净退出,并且应用程序可以采取任何纠正措施。确切的操作取决于应用程序的性质,有些拒绝启动,有些则向用户发出警告。
我也想问一下,在Windows哪个位置最好写一个临时文件?
每个操作系统都有其自己的临时文件位置。如果您取消了dir
的{{1}}参数,则会在documentation中提到的适当位置创建它:
TempFile
在目录dir中创建一个新的临时文件,打开 文件进行读写,并返回结果TempFile
。的 通过采用模式并向其中添加随机字符串来生成文件名 结束。如果pattern包含*os.File
,则随机字符串替换 最后"*"
。 如果dir是空字符串,则"*"
使用默认值 临时文件的目录(请参见TempFile
)。多个程序 同时调用os.TempDir
不会选择相同的文件。的 调用方可以使用TempFile
查找文件的路径名。它是 呼叫者有责任在不再需要时删除文件。
在os.TempDir
中,我们看到以下内容:
在Unix系统上,如果非空,则返回
f.Name()
,否则返回$TMPDIR
。上 Windows,它使用/tmp
,返回第一个非空值 来自GetTempPath
,%TMP%
,%TEMP%
或Windows目录中。上 方案9,它返回%USERPROFILE%
。该目录既不能保证存在也不可以访问 权限。