檔案和目錄管理

2022-02-23 16:44:17 字數 3594 閱讀 8050

1、檔案與其元資料

struct stat ;

下面是通過stat呼叫獲得檔案資訊,eg:

int main()

fstat和stat的不同之處是呼叫的時候引數是檔案描述符,下面程式判斷檔案是否位於乙個物理裝置,eg:

int main()

可以通過chmod(fchmod)設定檔案所屬的使用者,eg:

int main()

printf("

\n");

x = sp.st_mode|3;

ret = chmod("

test

", x);

if(ret == -1)

printf("

chmod error.\n

");ret = stat("

test

", &sp);

printf("

%d\n

", x=sp.st_mode);

while(x > 0)

printf("

\n");

return

0;}

以前沒有寫過mode中的各個位代表的是什麼意思,其實也不需要知道。定義了一些常量來表示,如果要設定該屬性只需要將mode與該值進行或運算就可以了,取消的話與該值的非進行與運算,下面列出這些值:

s_irwxu:擁有者可以讀、寫、執行。

s_irusr:擁有者可以讀。

s_iwusr:擁有者可以寫。

s_ixusr:擁有者可以執行。

s_irwxg:組可以讀、寫、執行。

s_irgrp:組可以讀。

s_iwgrp:組可以寫。

s_ixgrp:組可以執行。

s_irwxo:其他人可以讀、寫、執行。

s_iroth:其他人可以讀。

s_iwoth:其他人可以寫。

s_ixoth:其他人可以執行。

在呼叫chown可以修改檔案的所有者,需要注意的是,如果哦path指向的是乙個鏈結,那麼chown會跟隨鏈結改變目標的所有權,而lchown則只是變更符號鏈結本身的所有權,可能發生錯誤的原因也是非常地多,可以更具errno來判斷,eg:

int main()

return

0;}

2、擴充套件屬性

擴充套件屬性(xattrs)提供了乙個機制用來將《鍵/值》對永久地關聯到檔案,讓現有的檔案系統得以支援在原始設計中未提供的功能。擴充套件屬性是檔案系統不可知論者,應用程式可以通過乙個標準的介面來操縱他們,此介面不因檔案系統而異。每個擴充套件屬性可以通過唯一的鍵來區分,鍵的內容必須是有效的utf-8,格式為namespace.attribute,每個鍵採用完全限定的形式。

需要注意的是這裡的值可以是任意位元組的陣列,未必是字元存,而且最後可能不是null,這樣在訪問的時候必須知道值的大小。在設定的時候當然也就需要設定值大小。

乙個擴充套件屬性的用處:gui的檔案管理程式的行為根據檔案型別而異。要判斷檔案的格式,winodws之類的作業系統僅需要檢視檔案的副檔名就可以了,而unix系統往往需要檢視檔案的內容來判斷型別。有些檔案管理程式會直接產生此資訊,有些則會將產生的資訊快取起來以備下次使用。乙個更好的做法就是將此類元資料存入擴充套件屬性。

linux下定義的4種擴充套件屬性命名空間:

system:用於實現利用擴充套件屬性的核心功能,例如訪問控制表。eg:system.posix_acl_access便是位於此使用者空間的擴充套件屬性,使用者是否可以讀取或寫入這些屬性取決於所使用的安全模組。

security:用於實現安全模組。

trusted:把受限制的資訊存入使用者空間。

user:一般程序所使用的標準命名空間,經過一般檔案許可權位來控制此命名空間的訪問。

下面給出set、get、remove、list四個操作的乙個簡單的例子:

#include 

#include

#include

#include

#include

#include

void testset();

char value[2] = ;

int i, ret;

for(int i = 0; i < 10; i++)

}void testlist()

}void testremove()

void testget()

}int main()

3、目錄

每個程序都有乙個當前目錄,該目錄最初繼承自父程序,當前工作目錄是核心用於解析相對路徑名稱的起點。下面的**可用與獲得當前的工作目錄,eg:

int main()

char *cwd = get_current_dir_name();

printf("

%s\n

", cwd);

return

0;}

當乙個使用者首次登入她的系統,login程序會根據/etc/passwd檔案中設定將她的當前工作目錄設定為她的home目錄,然而有些時候程序會想變更它的當前工作目錄,為此系統提供兩個系統呼叫:

int main()

fd = open("

/home/ggzwtj/

", o_directory);

ret = fchdir(fd);

if(ret != -1)

return

0;}

建立刪除目錄的系統呼叫,eg:

int main()

讀目錄:

int main()

closedir(dir);

return

0;}

4、鏈結

int main()

int main()

int main()

5、檔案的複製、移動

在檔案系統看來,拷貝檔案就是複製乙份檔案內容,然後在新的目錄下建立該拷貝的硬鏈結。而移動檔案的代價就小的多,只是對檔案的目錄項更名。雖然沒有提供系統呼叫來專門地實現複製、移動,但是知道檔案系統的實質操作後也就簡單了。eg:

int main()

需要注意是兩個位置必須是在相同的檔案系統中,還必須有訪問許可權。

6、裝置節點

裝置節點是一種特殊的檔案,應用程式可以通過它鏈結到裝置驅動程式。當乙個應用程式在裝置節點上進行普通的unix i/o,核心會把此類請求傳遞給乙個裝置驅動程式,然後裝置把處理結構返回給使用者。下面是幾個有意思的特殊檔案:

/dev/null,丟掉對該裝置的所有寫入,對於讀請求總是返回eof。

/dev/zero,丟掉所有寫入請求,對讀請求返回null位元組的無窮流。

/dev/full,對寫請求觸發enospc,表示裝置已滿,對讀請求返回無窮null。

/dev/random,核心的隨機數產生器。它收集雜亂的資料,把他們連線在一起並進行單向雜湊運算,所得到的結果放入乙個熵池,核心不斷估算熵的位數目。

檔案和目錄管理

mkdir 建立目錄 mkdir p 級聯建立目錄 rm 刪除檔案和目錄 rm r 刪除目錄用的選項 rm rf 強制刪除不提示 慎用 cp 複製檔案或目錄 copy的簡寫 cp option 檔案 目地檔案 cp r 複製目錄需要加 r mv 移動檔案或目錄 move的簡寫 mv 檔案 目地檔案 ...

linux檔案和目錄管理

cd 相對路徑 絕對路徑 用途 變更當前目錄,cd是change directory的縮寫 例 cd 回到上層目錄 cd home 相對路徑的寫法 cd var www html絕對路徑的寫法 cd 回到使用者的根目錄 cd 回到使用者的根目錄 cd loki 回到使用者loki的根目錄 pwd 用...

IOS管理檔案和目錄

1 常見的nsfilemanager檔案方法 nsdata contentsatpath path 從乙個檔案讀取資料 bool createfileatpath path contents nsdata data attributes attr 向乙個檔案寫入資料 bool removeitema...