![](/img/trans.png)
[英]What is the best way of determining that two file paths are referring to the same file object?
[英]Determining if two file paths point to same file under Linux / C?
在Linux下,我有兩個文件路徑A和B:
const char* A = ...;
const char* B = ...;
我現在想確定,我應該open(2)
他們兩個......
int fda = open(A, ...);
int fdb = open(B, ...);
...我會在文件系統中打開兩個文件句柄到同一個文件嗎?
為了確定這一點,我想到了stat(2)
:
struct stat
{
dev_t st_dev;
ino_t st_ino;
...
}
像(偽代碼)的東西:
bool IsSameFile(const char* sA, const char* sB)
{
stat A = stat(sA);
stat B = stat(sB);
return A.st_dev == B.st_dev && A.st_ino == B.st_ino;
}
有沒有A和B是同一個文件但是IsSameFile
會返回false的情況?
是否存在A和B是不同文件但IsSameFile
會返回true的情況?
有沒有更好的方法來做我想做的事情?
您的程序在所有情況下都能正常工作,因為A.st_ino
將返回系統中文件的inode編號 。 由於inode編號是唯一的,因此您的程序將正確識別打開的兩個文件是否相同。
您還可以檢查A.st_mode
的值以確定該文件是否為符號鏈接 。
這取決於你為什么要避免兩次打開同一個文件。 您的解決方案通常是正確的解決方案,但在某些情況下,如果文件具有相同的絕對路徑,則應視為相同,但如果它們是指向同一inode的鏈接則不應視為相同。 在這種情況下,您需要將路徑轉換為絕對路徑並進行比較...請參閱獲取文件的絕對路徑
您還需要決定是否考慮使用與文件等效的文件的符號鏈接或其他符號鏈接。 對於inode等效,它決定是使用stat
還是lstat
。 對於路徑等價,它確定您是否可以使用realpath
或者是否需要獲取絕對路徑而不遵循符號鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.