以前做了個window移植到linux中,涉及到了兩種系統之間檔案,執行緒,時間等內容的差異,今天就針對兩種系統的檔案操作進行總結;
檔案操作是程式設計師最基本的需要掌握的知識,雖然知道一些,但是通過本編文章更深刻的進行掌握。
首先來看看linux下的檔案操作,都是可以通過man函式進行檢視,今天把基本的操作列出來
1、我們都知道在linux下,一切都是檔案,檔案操作進而可以分為兩類:系統呼叫和庫函式
在linux下檔案操作無非是open,close,read,write,lseek,通過這幾個函式就可以實現對檔案的讀寫等操作。
1.1 檔案描述符
在進行檔案操作的時候需要乙個檔案標識進行讀寫操作,這個標示就是檔案描述符,也可以說是檔案id。乙個檔案id在系統中唯一標識乙個檔案。
在系統開始啟動的時候,就開啟了三個檔案描述符
0 ----標準輸入
1 ----標準輸出
2 ----標準錯誤
1.2 open函式
open顧名思義就是開啟乙個檔案,並返回檔案的描述符
在linux下終端內,直接man open就可以找到open的規範描述,在描述中有兩個介紹:
#include
#include
#include
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
前面是open函式呼叫應該具有的標頭檔案
引數說明:
path:準備開啟的檔案或裝置名字;
flags:開啟檔案的訪問模式;
訪問模式可以是o_rdonly 唯讀, o_wronly 只寫, o_rdwr 可讀可寫;
mode:就是當使用 o_creat時,建立的檔案所具有的許可權;
s_irusr:讀許可權,檔案所有者
s_iwuser:寫許可權,檔案所有者
。。。為了方便,這些檔案許可權可以通過數字進行配置,和chmod賦予許可權的型別相同。
open呼叫成功返回0,失敗返回-1. 如:
open("my.file", o_rdwd|o_creat, 0666);
賦予檔案my.file所有者,所有組,其他可讀可寫許可權。
乙個小例子:
進行編譯,執行發現my.file的許可權不對
這是什麼原因呢?
以為系統有預設的許可權,這是umask在搞怪。
當我們登入系統之後建立乙個檔案總是有乙個預設
許可權的,那麼這個許可權是怎麼來的呢?這就是umask幹的事情。umask設定了使用者
建立檔案的預設 許可權,它與chmod的效果剛好相反,umask設定的是許可權「
補碼」,而chmod設定的是檔案許可權碼。
umask是乙個函式,我們可以在**中新增umask(0000),進行設定下,就可以了,我們試一下看看
加上了,果然沒有問題了,你們也可以試試
1.3 close函式
這個函式很簡單,先看看man close
#include
int close(int fd);
close成功返回0, 失敗返回-1
1.4 write函式
write將緩衝區中的資料寫入檔案,函式原型是:
ssize_t write(int fd, void *buf, size_t count);
引數說明:
fd:檔案描述符;
buf:待寫入的檔案指標;
count:寫入的位元組數。
返回值:
返回成功寫入的字元數,錯誤返回-1
1.5 read函式
#include
ssize_t read(int fd, void *buf, size_t count);
引數和上面的write對應,這裡就不寫了。
返回值:返回成功讀取的字元數。
小例子:
1.6 lseek函式
lseek針對檔案的偏移。
#include
#include
off_t lseek(int fd, off_t offset, int whence);
引數:fd:檔案描述符;
offset:針對檔案的偏移,是根據whence的偏移,可正可負;
whence:檔案便宜的開始位置;
seek_set:檔案開始位置
seek_cur:檔案當前位置
seek_end:檔案結尾
返回:成功返回檔案的偏移,失敗返回-1.
我們直接可以採用lseek,獲取檔案的長度:
int file_len = lseek(fd, 0, seek_end);
2.window下的檔案操作
簡單介紹下window下的檔案操作,這裡面涉及內容很多
2.1 fopen函式
#include
file * fopen(const char * path , const char * mode);
path:檔案的路徑;
mode:開啟的流模式。
r:唯讀;
w:只寫;
r+:更新方式讀寫開啟;
w+:更新方式讀寫開啟,並把檔案長度截斷為0;
a+:更新方式開啟,並將內容追加在檔案尾。
2.2 fwrite
size_t fwrite(const void *buf, size_t size, size_t count, file* stream);
buf:資料的指標;
size:寫入的內容的單位元組數;
count:寫入位元組資料項的個數;
stream:寫入為檔案流指標。
返回值:寫入的資料項的個數
實際就是寫入了count * size的大小內容
2.3 fread
size_t fread(const void *buf , size_t size, size_t count, file *stream);
這個和fwrite對應。
2.4 fclose
fclose(file *stream);
2.5 fseek
fseek是lseek系統呼叫對應的檔案流函式。
int fseek(file *stream, long offset, int fromwhere);
這個和lseek相對應,就不詳細說了。
例子就不弄了,關於這方面的內容很多,相信你們早已理解,這太簡單了。
window下檔案操作命令 dir
1 a 顯示具有指定屬性的檔案。2 b 使用空格式 沒有標題資訊或摘要 3 c 在檔案大小中顯示千位數分隔符。這是預設值。用 c 來禁用分隔符顯示。4 d 跟寬式相同,但檔案是按欄分類列出的。5 l 用小寫。6 n 新的長列 式,其中檔名在最右邊。7 o 後面跟乙個字母來用分類順序列出檔案。所跟字母...
讓Python刪除window下檔案
今天接到 有樓下客戶反映,資料有問題,我連線到伺服器上,發現broke的乙個碟符空間滿了,導致,應用在報錯,停下服務,刪除了龐大的日誌檔案,服務開啟,一切正常了。早就想寫個指令碼放在伺服器上,今天正好有空,於是扒拉了一下,寫了個python的小指令碼,大牛就不用看了,原理是找出每個檔案的修改時間,如...
Linux 下檔案打包和壓縮
在 windows 下我們通常會用好壓或者是 winrar 來進行壓縮檔案,一般沒有打包的說法。在 linux 下卻不太一樣,我們可以利用一些命令完成對檔案的打包和壓縮。這篇文章介紹 tar gzip,zcat,bzip2,bunzip2 首先,我來先介紹下最為重要的命令 tar 它有這樣的幾個引數...