如果我的应用程序关闭或崩溃,有什么方法可以确保删除临时文件?理想情况下,我想获取一个临时文件,使用它,然后忘记它.
现在我保留一个我的临时文件列表,并使用在Application.ApplicationExit上触发的事件处理程序删除它们.
有没有更好的办法?
一个元组,包含一个打开文件的操作系统级句柄(由os.open()返回)和该文件的绝对路径名,按顺序排列.
如何将操作系统级别的句柄转换为文件对象?
要将文件描述符包装在"文件对象"中,请使用fdopen().
所以我尝试过:
>>> import tempfile
>>> tup = tempfile.mkstemp()
>>> import os
>>> f = os.fdopen(tup[0])
>>> f.write('foo\n')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IOError: [Errno 9] Bad file descriptor
Run Code Online (Sandbox Code Playgroud) 我正在使用烧瓶进行申请.我想将一个图像(由PIL动态生成)发送到客户端而不保存在磁盘上.
知道怎么做吗?
python streaming temporary-files python-imaging-library flask
我正在编写一个Python脚本,需要将一些数据写入临时文件,然后创建一个运行C++程序的子进程,该程序将读取临时文件.我正在尝试使用NamedTemporaryFile它,但根据文档,
名称是否可以用于第二次打开文件,而命名的临时文件仍然是打开的,因此不同平台(它可以在Unix上使用;它不能在Windows NT或更高版本上使用).
事实上,在Windows上,如果我在写入后刷新临时文件,但是在我希望它消失之前不要关闭它,子进程无法打开它进行读取.
我正在通过创建文件来解决这个问题,在生成delete=False子进程之前将其关闭,然后在完成后手动删除它:
fileTemp = tempfile.NamedTemporaryFile(delete = False)
try:
fileTemp.write(someStuff)
fileTemp.close()
# ...run the subprocess and wait for it to complete...
finally:
os.remove(fileTemp.name)
Run Code Online (Sandbox Code Playgroud)
这似乎不优雅.有一个更好的方法吗?也许是一种打开临时文件权限的方法,以便子进程可以获得它?
我正在寻找一种跨平台的方式来获取指定的临时文件.例如,在linux中,它将位于/tmpdir中,而在Windows中则位于一些名为Internet Explorer的临时目录中.
是否存在跨平台(Boost?)解决方案?
编辑:
我需要这个文件存在,直到程序终止.tmpfile()不能保证.引用ccpreference:
当流关闭(fclose) 或程序正常终止时,将自动删除创建的临时文件.
我想用它tempfile.NamedTemporaryFile()来写一些内容然后打开那个文件.我写了以下代码:
tf = tempfile.NamedTemporaryFile()
tfName = tf.name
tf.seek(0)
tf.write(contents)
tf.flush()
Run Code Online (Sandbox Code Playgroud)
但我无法打开此文件,并在记事本或类似的应用程序中查看其内容.有没有办法实现这个目标?为什么我不能这样做:
os.system('start notepad.exe ' + tfName)
Run Code Online (Sandbox Code Playgroud)
在末尾
所以我正在研究的项目是关于文件上传的死亡偏执.
在这个问题的范围内,我没有在有效载荷方面使用该术语; 我说的是保密.
程序总是会崩溃,并使临时文件在文件系统中闲逛.这很正常.在稍保密偏执可以写命中临时文件夹每隔几分钟,并删除任何东西比之前的cronjob呼叫(而不是几秒钟旧的一个cronjob 一切,仅仅是因为否则可能赶上一个文件被上传过程).
......不幸的是,我们让这个偏执狂更进了一步:
理想情况下,我们希望永远不会在文件上传中看到临时文件,而是在与进程相关的RAM中.
有没有办法教PHP在内存中而不是在文件系统中查找临时文件作为blob?我们使用PHP-FPM作为CGI处理程序,使用Apache作为我们的Web服务器,以防万一.(另请注意:'Filesystem'是这里的关键字,而不是'disc',因为当然有方法将文件系统映射到RAM,但这并不能解决可访问性和自动崩溃后清理问题. )
或者,这些临时文件是否可以在写入光盘时立即加密,以便它们在没有加密的情况下永远不会保存在文件系统中?
遗憾的是,我只能接受一个答案 - 但是对于读这篇文章的人来说,整个帖子非常有价值,并且包含了许多人的集体见解.根据您希望实现的目标,接受的答案可能对您不感兴趣.如果您通过搜索引擎来到这里,请花点时间阅读整个帖子.
以下是我看到的用例的汇编,以供快速参考:
RAM而不是光盘(例如由于I/O问题)→ RAMdisk /可比较(质量87,Joe Hopfgartner)
安全文件权限→ 限制性本机Linux权限(可选择每个vhost)(Gilles)或SELinux(请参阅各种注释)
进程附加内存而不是文件系统(因此进程崩溃会删除文件)(最初由问题决定)
不要让文件数据直接到达PHP→ 反向代理(Cal)
禁用PHP写入文件系统→ 请参阅此答案中的PHP错误链接(Stephan B)或在CGI模式下运行PHP(Phil Lello)
文件→只写/dev/null …
我想在Python中创建一个ramdisk.我希望能够以跨平台的方式实现这一点,因此它可以在Windows XP到7,Mac和Linux上运行.我希望能够读取/写入ramdisk,就像它是普通驱动器一样,最好带有驱动器盘符/路径.
我想要的原因是为脚本编写测试,创建具有特定结构的目录.我想在ramdisk中完全创建目录,所以我确定在测试结束后它会被完全删除.我考虑使用Python tempfile,但如果测试将在中间停止,则可能不会删除目录.我想完全确定即使有人在测试过程中拔掉计算机上的插头,它也会被删除.
我正在开发一个Python脚本,需要创建大约50个不同的临时文件,这些文件在脚本过程中经常被附加并在最后合并.我确信该tempfile模块可以做我需要的,但我无法弄清楚如何阅读文档.
我想使用临时文件(而不是变量)来节省系统内存,因为这些数据块会随着脚本处理数万个其他文件而变大.
下面的代码块是我正在用于在非临时目录中创建这些文件(非暂时)的hack:
item = (string from another file) # string must id file for future use
tmpfile = 'tmpfiles/' + item
if item not in totalitems:
totalitems.add(item)
with open(tmpfile, 'w') as itemfile:
output = some stuff
tmpfile.write(output)
else:
with open(tmpfile, 'a') as itemfile:
output = different stuff
tmpfile.write(output)
Run Code Online (Sandbox Code Playgroud)
我想我需要的是tempfile.NamedTemporaryFile().根据文件:
可以从文件对象的名称成员中检索该名称.
不幸的是,我不明白这意味着什么.当我在我正在处理的文件中再次运行其相应的"项目"时,我只需要能够稍后再次调用每个文件.我认为这是相当直接的,我只是在密集.如果它很重要,我有Python 2.7.1和3.2.3的这个脚本的版本.我真的只需要一个人或另一个人去工作; 我创造了两个作为学习练习.
我需要创建一个临时文件,所以我尝试了这个:
String[] TempFiles = {"c1234c10","c1234c11","c1234c12","c1234c13"};
for (int i = 0; i <= 3; i++) {
try {
String tempFile = TempFiles[i];
File temp = File.createTempFile(tempFile, ".xls");
System.out.println("Temp file : " + temp.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c108415816200650069233.xls
Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c113748833645638701089.xls
Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c126104766829220422260.xls
Temp file : C:\Users\MD1000\AppData\Local\Temp\c1234c137493179265536640669.xls
Run Code Online (Sandbox Code Playgroud)
现在,我不希望将额外的数字(long int)添加到文件名中.我怎样才能做到这一点?谢谢