打开其中的文件后删除包含目录是否安全?
Is it safe to remove the containing directory after a file in it is opened?
我有一些代码需要 return 一个文件对象并清理包含的目录,例如:
def create_file():
# create a temp directory: temp_dir
# generate a file inside the directory: filename
file_obj = open(filename, 'rb')
shutil.rmtree(temp_dir)
return file_obj
如果我有文件句柄(open()
的结果),删除包含目录是否安全?
取决于你如何定义"safe"。在 linux 框上:
>>> p = os.path.join(os.getcwd(), "tmpdir")
>>> def foo(p):
... os.makedirs(p)
... f = open(os.path.join(p, "tmp.txt"), "w")
... shutil.rmtree(p)
... return f
...
>>> f = foo(p)
>>> f
<open file '/home/bruno/tmpdir/tmp.txt', mode 'w' at 0x7f14f65c2270>
>>> f.write("foo")
>>> f.close()
>>> f.name
'/home/bruno/tmpdir/tmp.txt'
>>> open(f.name).read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: '/home/bruno/tmpdir/tmp.txt'
>>>
>>> os.listdir(p)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/home/bruno/tmpdir'
编辑
So I can't remove the containing directory if I'm going to write to the file, do I?
嗯,显然不是。无论如何它都没有任何意义,因为,正如您问自己的那样:
where does write() write in such case?
这是个好问题...
"files"和"directories"只是OS给出的一种表示。从技术上讲,OS 将文件数据写入它想要的位置(它可以分散在不同位置的多个块中),并在已知位置写入元数据,告诉哪些块属于哪个 "file" 以及哪个 "file"属于"directory"。
此外,除非您另有说明,否则 IO 会被缓冲,因此 write()
不一定会立即写入任何内容。也就是说,使用无缓冲文件(and/or 在 write
之后刷新文件)不会改变上述代码片段的行为(至少在 ubuntu-linux python 2.7).
但无论如何:打开文件写入目录,然后在文件被使用之前删除整个目录的整个想法让我觉得有些可疑(这是轻描淡写的 xD)- OS 应该拒绝删除目录,因为它有一个文件,或者它应该删除文件和目录,然后写入一个任何人都无法读取的文件有什么意义?
现在这看起来真的像一个 XY 问题,所以也许解释(在某些上下文中)为什么你 "need" 这么奇怪的事情会有所帮助。另外,请注意 Python 已经 some support for temporary files and directories
我有一些代码需要 return 一个文件对象并清理包含的目录,例如:
def create_file():
# create a temp directory: temp_dir
# generate a file inside the directory: filename
file_obj = open(filename, 'rb')
shutil.rmtree(temp_dir)
return file_obj
如果我有文件句柄(open()
的结果),删除包含目录是否安全?
取决于你如何定义"safe"。在 linux 框上:
>>> p = os.path.join(os.getcwd(), "tmpdir")
>>> def foo(p):
... os.makedirs(p)
... f = open(os.path.join(p, "tmp.txt"), "w")
... shutil.rmtree(p)
... return f
...
>>> f = foo(p)
>>> f
<open file '/home/bruno/tmpdir/tmp.txt', mode 'w' at 0x7f14f65c2270>
>>> f.write("foo")
>>> f.close()
>>> f.name
'/home/bruno/tmpdir/tmp.txt'
>>> open(f.name).read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: '/home/bruno/tmpdir/tmp.txt'
>>>
>>> os.listdir(p)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/home/bruno/tmpdir'
编辑
So I can't remove the containing directory if I'm going to write to the file, do I?
嗯,显然不是。无论如何它都没有任何意义,因为,正如您问自己的那样:
where does write() write in such case?
这是个好问题...
"files"和"directories"只是OS给出的一种表示。从技术上讲,OS 将文件数据写入它想要的位置(它可以分散在不同位置的多个块中),并在已知位置写入元数据,告诉哪些块属于哪个 "file" 以及哪个 "file"属于"directory"。
此外,除非您另有说明,否则 IO 会被缓冲,因此 write()
不一定会立即写入任何内容。也就是说,使用无缓冲文件(and/or 在 write
之后刷新文件)不会改变上述代码片段的行为(至少在 ubuntu-linux python 2.7).
但无论如何:打开文件写入目录,然后在文件被使用之前删除整个目录的整个想法让我觉得有些可疑(这是轻描淡写的 xD)- OS 应该拒绝删除目录,因为它有一个文件,或者它应该删除文件和目录,然后写入一个任何人都无法读取的文件有什么意义?
现在这看起来真的像一个 XY 问题,所以也许解释(在某些上下文中)为什么你 "need" 这么奇怪的事情会有所帮助。另外,请注意 Python 已经 some support for temporary files and directories