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...