windows编程一日一练(2)
今天主要看看文件練習相關的函數
簡單的看了一下C的文件操作函數:
1.打開文件
FILE *fopen(const char *filename,const char *mode)
解釋:這是c提供的一個文件操作函數,若打開成功,則返回一個指向該文件的指針(注意不是句柄,從這也可看出指針跟句柄的區別),mode常用取值列表如下
?
| 文件打開方式 | 含義 |
| "w"(只寫) | 為輸出打開一個文本文件 |
| "r"(只讀) | 為輸入打開一個文本文件 |
| "a"(追加) | 追加內容 |
| "w+"(讀/寫) | 為讀/寫建立一個新文本文件 |
| "r+"(讀/寫) | 為讀/寫打開一個文本文件 |
| "a+"(讀/寫) | 為讀/寫打開一個文本文件 |
2。關閉文件
int fclose(FILOE *fp);
3.讀文件
int fgetc(FILE *fp)?? //從打開的文件中讀取一個字符,指針后移一位
size_t fread(VOID *buffer,size_t size,size_t count,FILE *fp)????
解釋:buffer是指向數據存放緩沖區的指針,size是單個字符的字節數,count是一次讀取多少個size的數據.若函數執行成功,則返回實際讀取的字符數。
4.寫文件
int fputc(FILE *fp);
size_t fwrite(VOID *buffer,size_t size,size_t count,FILE *fp) ;//跟讀文件是一樣的,這里就不記了。
另外有一個非常常用的函數,fprintf函數,其原型是
int fprintf(FILE *fp,const char *format[,argument].....);
在這里舉個實例便于理解:
char buffer[]="world";???????????????????? //定義并賦值一個字符串
FILE fp;???????????????????????????????????????? //定義一個文件指針
if(fp=fopen("c:\test.txt","a")==NULL)? //打開文件test.txt,并判斷操作是否成功
???? exit(0);?????????????????????????????????????? //若失敗,則退出
fprintf(fp,"hello %s",buffer);?????????? //把hello和字符串buffer中的內容追加入文件test.txt
5.指針定位
由于這類函數用的比較少,這里只簡單記一下函數名及其功能
void rewind(FILE *fp);//指針返回文件開始
int fseek(FILE *fp,long offset,int origin);//指針定位到指定位置
long ftell(FILE *fp);//返回文件指針相對于文件開頭的位置
以上介紹的都是c提供的對文件的操作函數,其實windows提供了一些功能更強大的API函數供開發人員使用,雖說微軟推薦使用API函數來處理文件,但個人還是不太習慣,主要是參數過多,很多功能用不到,所謂殺雞焉用宰牛刀,所以只有在迫不得已的時候才使用API,下面介紹幾個常用的:
BOOL DeleteFile(LPCTSTR? lpFileName); //刪除文件,lpFileName為完整文件名
創建目錄函數CreateDirectory;其原型如下,第二個參數為目錄的安全性設置,通常為NULL
BOOL CreateDirectory(
?? LPCTSTR lpPathName,
?? LPSECURITY_ATTRIBUTES lpSecurityAttributes,
);
文件的復制和重命名可以用CopyFile()函數實現,其源代碼如下:
BOOL CopyFile(
?? LPCTSTR SrcFileName, ?? //完整源文件名
?? LPCTSTR DesFileName,? //完整目標文件名
?? BOOL bFailIfExits;
)
文件和目錄的移動都可以用RemoveFlie()實現,并且當移動目錄時會強制移動目錄下的所有文件和子目錄,
BOOL MoveFile(
?? LPCTSTR SrcFileName, ? //源路徑
?? LPCTSTR? DesFileName,? //目標路徑
)
最后介紹兩個有關文件屬性相關的函數
DWORD GetFileAttributes(LPCTSTR? lpFileName);
該函數若執行成功,則返回文件的屬性,否則返回0xFFFFFFFF.
BOOL SetFileAttributes(
?? LPCTSTR lpFileName,
?? DWORD dwFileAttributes
);
該函數設置文件屬性,第二個參數取值范圍如下:
| dwFileAttributes取值 | 含義解釋 |
| FILE_ATTRIBUTES_ARCHIVE | 存檔文件 |
| FILE_ATTRIBUTES_COMPRESSED | 壓縮文件 |
| FILE_ATTRIBUTES_DERECTORY | 文件夾 |
| FILE_ATTRIBUTES_ENCRYPTED | 加密文件 |
| FILE_ATTRIBUTES_HIDDEN | 隱藏文件 |
| FILE_ATTRIBUTES_NORMAL | 正常 |
| FILE_ATTRIBUTES_OFFLINE | 脫機文件 |
| FILE_ATTRIBUTES_READONLY | 只讀文件 |
| FILE_ATTRIBUTES_SYSTEM | 系統屬性 |
| FILE_ATTRIBUTES_TEMPORARY | 臨時屬性 |
至此,對于文件的操作已經都不是問題了,現在嘗試編寫一個小應用,實現批量重命名功能.
步驟:1.? 用GetModuleFile()函數獲取程序所在目錄filepath
2 . .獲取目錄下所有符合條件的文件名,并將這些文件名存在一個集合(set)中,涉及到的函數有_FindFrist(),??? _FindNext();?? _FindClose(),這些函數都包含在<io.h>頭文件中。后面會詳細介紹一下這些函數
3.循環實現文件重命名,CopyFile();
4.很重要的一步,CopyFile()函數之后記得刪除原來的文件DeleteFile();
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
?
?????? 返回值:如果查找成功的話,將返回一個long型的唯一的查找用的句柄(就是一個唯一編號)。這個句柄將在_findnext函數中被使用。若失敗,則返回-1。
?
?????? 參數:
?
?????? filespec:標明文件的字符串,可支持通配符。比如:*.c,則表示當前文件夾下的所有后綴為C的文件。
?
?????? fileinfo :這里就是用來存放文件信息的結構體的指針。這個結構體必須在調用此函數前聲明,不過不用初始化,只要分配了內存空間就可以了。函數成功后,函數會把找到的文件的信息放入這個結構體中。
int _findnext( long handle, struct _finddata_t *fileinfo );
?
?????? 返回值:若成功返回0,否則返回-1。
?
?????? 參數:
?
?????? handle:即由_findfirst函數返回回來的句柄。
?
?????? fileinfo:文件信息結構體的指針。找到文件后,函數將該文件信息放入此結構體中。
?int _findclose( long handle );
?
?????? 返回值:成功返回0,失敗返回-1。
?
?????? 參數:
?
?????? handle :_findfirst函數返回回來的句柄。
_finddata_t結構體定義如下::
struct _finddata_t {
?
???time_t?????time_create;???
???time_t?????time_access;???
???time_t?????time_write;
???_fsize_t???size;
???char???????name[260];
};
time_t,其實就是long
而_fsize_t,就是unsigned long
現在來解釋一下結構體的數據成員吧。
attrib,就是所查找文件的屬性:_A_ARCH(存檔)、_A_HIDDEN(隱藏)、_A_NORMAL(正常)、_A_RDONLY(只讀)、_A_SUBDIR(文件夾)、_A_SYSTEM(系統)。
time_create、time_access和time_write分別是創建文件的時間、最后一次訪問文件的時間和文件最后被修改的時間。
size:文件大小
name:文件名。
? 至此,批量重命名的引用就完全可以實現了,至于具體的代碼實現,明天在做,今天就到這了
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的windows编程一日一练(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue 监视属性 watch
- 下一篇: 计算机与体育教育的关系,体育教学论文:健