Powinieneś wpisać fstat
deskryptor pliku dla otwartego pliku.
>>> import os
>>> f = open("testdv.py")
>>> os.fstat(f.fileno())
posix.stat_result(st_mode=33188, st_ino=1508053, st_dev=65027L, st_nlink=1, st_uid=1000, st_gid=1000, st_size=1107, st_atime=1349180541, st_mtime=1349180540, st_ctime=1349180540)
>>> os.fstat(f.fileno()).st_nlink
1
Ok, ten plik ma jeden link, więc jeden nazwę w systemie plików. Teraz usunąć go:
>>> os.unlink("testdv.py")
>>> os.fstat(f.fileno()).st_nlink
0
Nie więcej linków, więc mamy „anonimowy plik” to tylko kept alive as long as we have it open. Tworzenie nowego pliku o tej samej nazwie nie ma wpływu na starym pliku:
>>> g = open("testdv.py", "w")
>>> os.fstat(g.fileno()).st_nlink
1
>>> os.fstat(f.fileno()).st_nlink
0
Oczywiście st_nlink
może być czasem >1
początkowo, więc sprawdzenie, czy do zera nie jest całkowicie niezawodny (choć w kontrolowanych warunkach, to może być wystarczająco dobry).Zamiast tego, można sprawdzić, czy plik na ścieżce, którą początkowo otwarty jest ten sam, który masz deskryptor dla porównując stat
wyniki:
>>> os.stat("testdv.py") == os.fstat(f.fileno())
False
>>> os.stat("testdv.py") == os.fstat(g.fileno())
True
(A jeśli chcesz to być w 100% poprawne, a następnie należy porównać tylko st_dev
i st_ino
pola na stat
wyników, ponieważ pozostałe pola i st_atime
w szczególności może zmieniać się pomiędzy połączeniami.)
może os.path.exists pracę w tym przypadku? – Alex
Problem z os.path.exists polega na tym, że może istnieć inny plik o tej samej nazwie ścieżki, mimo że stary plik został już usunięty. – user1502906