簡體   English   中英

沉默的os.rename失敗

[英]Silent os.rename failure

假設我有兩個相互鏈接的文件:

-rw-rw-r-- 2 mparrott grp 5 Jul 28 09:38 bar
-rw-rw-r-- 2 mparrott grp 5 Jul 28 09:38 foo

然后,我在python中運行它:

>>> import os
>>> os.rename('foo', 'bar')

我沒有錯誤。 但是,再次列出目錄,我仍然看到foo

-rw-rw-r-- 2 mparrott grp 5 Jul 28 09:38 bar
-rw-rw-r-- 2 mparrott grp 5 Jul 28 09:38 foo

似乎正在發生這種情況,因為文件確實是同一文件(inode)。 但是,我仍然希望foo被刪除或引發錯誤。

有誰知道為什么這會失敗嗎? 我的問題是關於實現本身的,而不是如何解決該問題的(我使用os.path.samefile做到了)。 我使用的是Rhel 6.4。

謝謝!

Python的os.rename函數僅執行rename系統調用。 如果源和目標是同一文件,則系統調用將無提示地執行任何操作。 如果運行C程序,我得到的結果與您的Python腳本相同:

#include <stdio.h>

int main() {
    int result = rename("foo", "bar");
    printf("result = %d\n", result);
}

這將打印result = 0並保留兩個文件。

Linux手冊頁中記錄了此行為:

如果oldpathnewpath是引用同一文件的現有硬鏈接,則named rename()不執行任何操作,並返回成功狀態。

這也在POSIX中指定:

如果參數和參數解析為相同的現有文件,則rename()將成功返回並且不執行其他任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM