UNIX下的文件操做

1、lseek
  一、每個打開的文件都一個與之相關的"文件位置"。
  二、文件位置一般狀況是一個非負整數,用來度量文件從開始到結束的字節數。
  三、文件的讀寫操做都是從當前的文件位置開始的,根據所讀寫的字節數移動文件的位置。
  四、當使用open打開文件時除非設置O_APPEND參數,不然文件位置一概在開頭。
  五、使用fseek/lseek僅是將文件位置記錄在內核中,並不引起任何I/O操做。
  六、若是越過文件末尾位置寫入數據,將在文件中造成黑洞,它不佔用磁盤空間,但計算在文件大小內。

  off_t lseek(int fd, off_t offset, int whence);
  功能:調用文件的位置
  fd:文件描述符
  offset:偏移值
  whence:基準點
  SEEK_SET 開頭位置
  SEEK_CUR 當前位置
  SEEK_END 末尾位置
  返回值:當前文件位置

2、文件描述符的複製
  int dup(int oldfd);
  功能:複製文件描述符
  oldfd:被複制的文件描述符
  返回值:新複製出的文件描述符(操做系統隨機分配的),失敗返回-1。


  int dup2(int oldfd, int newfd);
  功能:複製文件描述符
  oldfd:被複制的文件描述符
  newfd:指定新複製出的文件描述符,若是newfd已經打開,則先關閉再複製。
  返回值:新複製出的文件描述符(操做系統隨機分配的),失敗返回-1。

3、文件同步
  一、大多數磁盤進入讀寫時都會有緩衝機制,當咱們寫入文件時實際上是寫入到了緩衝區裏並無寫到磁盤中,直到緩衝區滿才排隊寫入到磁盤中。
  二、這樣作的處是下降了寫操做的次數,提升程序的運行效率,但也形成了磁盤與文件的內容不一樣步,這樣可能會形成A程序數據已經寫入,但B程序讀不到。
  三、sync/fsync/fdatasync用於強制把緩衝區的內容同步到磁盤中。

  void sync(void);
  功能:把因此有修改過的文件同步到磁盤中,因此待同步文件會排隊把數據同步的磁盤,而sync不會等到全部文件同步完成後纔回,而是當即返回。

  int fsync(int fd);
  功能:指定某個文件的內容同步到磁盤,同步完成後才返回。async

  int fdatasync(int fd);
  功能:指定某個文件的內容同步到磁盤,同步完成後才返回,但只同步文件的數據,不一樣步文件的屬性。

4、獲取文件的屬性
  int stat(const char *path, struct stat *buf);
  功能:根據文件的路徑,獲取文件的屬性

  int fstat(int fd, struct stat *buf);
  功能:根據文件描述符,獲取文件的屬性

  int lstat(const char *path, struct stat *buf);
  功能:根據文件的路徑,獲取軟連接文件的屬性。

  注意:stat會跟蹤獲取軟連接的目標文件屬性,而lstat只獲取軟連接文件的。

  文件屬性結構體struct stat:
  dev_t st_dev; // 設備號
  ino_t st_ino; // i節點精心
  mode_t st_mode; // 文件類型和權限
  nlink_t st_nlink; // 硬連接數
  uid_t st_uid; // 屬主id
  gid_t st_gid; // 屬組id
  dev_t st_rdev; // 特殊設置id
  off_t st_size; // 文件的大小
  blksize_t st_blksize; // 系統IO塊數
  blkcnt_t st_blocks; // 512字節塊數
  time_t st_atime; // 最後訪問時間
  time_t st_mtime; // 最後修改時間
  time_t st_ctime; // 最後屬性修改時間函數


  時間轉換:
  struct tm *localtime(const time_t *timep);
  功能:把time_t類型的時間轉換成時間結構體
  struct tm 結構體:
  int tm_sec; /* seconds */
  int tm_min; /* minutes */
  int tm_hour; /* hours */
  int tm_mday; /* day of the month */
  int tm_mon; /* month */
  int tm_year; /* year */
  int tm_wday; /* day of the week */
  int tm_yday; /* day in the year */
  int tm_isdst;

5、權限屏蔽碼
  當使用open/creat建立文件時,所設置的文件權限會減掉權限屏幕碼所設置的權限。
  如何查看權限屏幕碼:
  一、命令:umask
  二、函數:mode_t umask(mode_t mask);
  功能:修改權限屏蔽碼
  返回值:修改爲功後的權限屏蔽碼
  注意:只是針對當前進程,而不會修改系統的權限屏蔽碼

6、修改文件權限
  int chmod(const char *path, mode_t mode);
  功能:根據文件的路徑修改文件的權限

  int fchmod(int fd, mode_t mode);
  功能:根據文件描述符修改文件的權限

7、修改文件的屬主和屬組
  int chown(const char *path, uid_t owner, gid_t group);
  功能:根據文件的路徑修改文件的屬主和屬組

  int fchown(int fd, uid_t owner, gid_t group);
  功能:根據文件描述符修改文件的屬主和屬組

  int lchown(const char *path, uid_t owner, gid_t group);
  功能:根據文件的路徑修改文件的屬主和屬組,只針對連接文件修改

  注意:普通用戶沒有修改的權限

8、修改文件的大小
  int truncate(const char *path, off_t length);
  功能:根據文件路徑,修改文件的大小,多餘的部分截取掉。

  int ftruncate(int fd, off_t length);
  功能:根據文件描述符,修改文件的大小,多餘的部分截取掉。

  注意:若是要修改後大小超出文件本來的大小,就會造成黑洞。

9、建立刪除硬連接文件
  int link(const char *oldpath, const char *newpath);
  功能:建立硬連接文件
  oldpath:被連接的文件路徑
  newpath:連接文件的路徑

  int unlink(const char *pathname);
  功能:刪除連接文件

  int remove(const char *pathname);
  功能:根據文件路徑刪除文件

  int rename(const char *oldpath, const char *new‐path);
  功能:爲文件重命名

  注意:普通文件就一種連接數量只有一個的硬連接文件,因此unlink也能用來刪除普通文件。

10、軟件連接文件的建立
  硬連接文件就一個文件名,是目錄文件中的一個條目,而軟連接文件是一個獨立的文件,裏面記錄的是被連接的路徑。
  int symlink(const char *oldpath, const char *newpath);
  功能:建立軟連接文件,連接目標能夠不存在
  oldpath:被連接文件能夠不存在,只要最終建立出來,連接文件就能正常訪問
  newpath:軟連接文件路徑。

  ssize_t readlink(const char *path, char *buf,size_t bufsiz);
  功能:讀取軟連接文件的信息到buf中
  buf:數據的存儲位置
  bufsiz:buf的大小
  返回值:成功讀取到的字節數

10、建立空目錄/刪除空目錄
  int mkdir(const char *pathname, mode_t mode);
  功能:建立空目錄
  pathname:路徑
  mode:目錄的權限

  int rmdir(const char *pathname);
  功能:刪除空目錄,只能刪除目錄。
  注意:操做系統沒有提供刪除非空目錄的方法。
ui

相關文章
相關標籤/搜索