1.獲得當前工作目錄
- char* _getcwd( char *buffer, int maxlen );
- // 功 能 : 獲得當前工作目錄.
- // 頭文件 : #include <direct.h>
- // 返回值 : 成功返回指向buffer的pointer
- // 失敗返回NULL,且設置errno爲以下三個值之一:
- // ENODEV 無該設備
- // ENOMEM 內存不夠
- // ERANGE 結果超出範圍
- // 注 意 : 當第一個參數爲 NULL 時, 第二個參數 maxlen 長度設置無效,且函數
- // 使用 malloc 分配足夠內存, 需要將函數返回值傳遞給 free() 函數來
- // 釋放內存. 當第一個參數不爲 NULL 時,maxlen 指定長度不夠函數返回
- // 錯,設置errno爲ERANGE
char* _getcwd( char *buffer, int maxlen );
// 功 能 : 獲得當前工作目錄.
// 頭文件 : #include <direct.h>
// 返回值 : 成功返回指向buffer的pointer
// 失敗返回NULL,且設置errno爲以下三個值之一:
// ENODEV 無該設備
// ENOMEM 內存不夠
// ERANGE 結果超出範圍
// 注 意 : 當第一個參數爲 NULL 時, 第二個參數 maxlen 長度設置無效,且函數
// 使用 malloc 分配足夠內存, 需要將函數返回值傳遞給 free() 函數來
// 釋放內存. 當第一個參數不爲 NULL 時,maxlen 指定長度不夠函數返回
// 錯,設置errno爲ERANGE
2. 更改當前工作目錄
- int _chdir( const char *dirname );
- // 功 能 : 更改當前工作目錄.
- // 頭文件 : #include <direct.h>
- // 返回值 : 成功返回0
- // 失敗返回-1,且設置errno如下:
- // ENOENT 該路徑不存在
int _chdir( const char *dirname );
// 功 能 : 更改當前工作目錄.
// 頭文件 : #include <direct.h>
// 返回值 : 成功返回0
// 失敗返回-1,且設置errno如下:
// ENOENT 該路徑不存在
3. 文件遍歷(查找)
- long _findfirst( char *filespec, struct _finddata_t *fileinfo );
- // 功 能 : 提供與filespec指定入口泛式匹配的第一個文件.通常後繼用_findnext函
- // 數後續使用來完成某泛式下的文件遍歷.
- // 頭文件 : #include <io.h>
- // 參 數 : filespec - 目標文件規範,可以包含通配符
- // fileinfo - 文件信息buffer
- // 返回值 : 成功返回唯一的搜索句柄
- // 出錯返回-1,且設置errno爲如下值:
- // ENOENT 該泛式無法匹配
- // EINVAL 無效文件名
- // 注 意 : _finddata_t 說明
- struct _finddata_t
- {
- unsigned attrib;
- time_t time_create;
- time_t time_access;
- time_t time_write;
- _fsize_t size;
- char name[_MAX_FNAME];
- };
- // 其中 :
- // unsigned atrrib : 文件屬性的存儲位置。它存儲一個unsigned單元,用於表示文件的
- // 屬性。文件屬性是用位表示的,主要有以下一些:_A_ARCH(存檔)、
- // _A_HIDDEN(隱藏)、_A_NORMAL(正常)、_A_RDONLY(只讀)、
- // _A_SUBDIR(文件夾)、_A_SYSTEM(系統)。這些都是在<io.h>中
- // 定義的宏,可以直接使用,而本身的意義其實是一個無符號整型
- // (只不過這個整型應該是2的幾次冪,從而保證只有一位爲1,而其他
- // 位爲0)。既然是位表示,那麼當一個文件有多個屬性時,它往往是
- // 通過位或的方式,來得到幾個屬性的綜合。例如只讀+隱藏+系統屬性,
- // 應該爲:_A_HIDDEN | _A_RDONLY |_A_SYSTEM 。
- // time_t time_create:這裏的time_t是一個變量類型,用來存儲文件創建時間。
- // time_t time_access: 文件最後一次被訪問的時間。
- // time_t time_write : 文件最後一次被修改的時間。
- // _fsize_t size : 文件的大小。這裏的_fsize_t應該可以相當於unsigned整型,表示
- // 文件的字節數。
- // char name[_MAX_FNAME]:文件的文件名。這裏的_MAX_FNAME是一個常量宏,它在<stdlib.h>頭
- // 文件中被定義,表示的是文件名的最大長度。
- int _findnext( long handle, struct _finddata_t *fileinfo );
- // 功 能 : 按照前面_findfirst中的泛式規則,查找下一個符合該泛式的文件,並以此爲依據
- // 修改fileinfo中的值
- // 頭文件 : #include <io.h>
- // 參 數 : long handle - 搜索句柄(通常由緊靠其前的_findfirst()返回)
- // fileinfo - 文件信息buffer
- // 返回值 : 成功返回0
- // 出錯返回-1,且設置errno爲如下值:
- // ENOENT 沒有更多的符合該泛式的文件
- int _findclose( long handle );
- // 功 能 : 關閉搜尋句柄並釋放相應資源
- // 頭文件 : #include <io.h>
- // 參 數 : long handle - 搜索句柄(通常由緊靠其前的_findfirst()返回)
- // 返回值 : 成功返回0
- // 出錯返回-1,且設置errno爲如下值:
- // ENOENT 沒有更多的符合該泛式的文件
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
// 功 能 : 提供與filespec指定入口泛式匹配的第一個文件.通常後繼用_findnext函
// 數後續使用來完成某泛式下的文件遍歷.
// 頭文件 : #include <io.h>
// 參 數 : filespec - 目標文件規範,可以包含通配符
// fileinfo - 文件信息buffer
// 返回值 : 成功返回唯一的搜索句柄
// 出錯返回-1,且設置errno爲如下值:
// ENOENT 該泛式無法匹配
// EINVAL 無效文件名
// 注 意 : _finddata_t 說明
struct _finddata_t
{
unsigned attrib;
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;
char name[_MAX_FNAME];
};
// 其中 :
// unsigned atrrib : 文件屬性的存儲位置。它存儲一個unsigned單元,用於表示文件的
// 屬性。文件屬性是用位表示的,主要有以下一些:_A_ARCH(存檔)、
// _A_HIDDEN(隱藏)、_A_NORMAL(正常)、_A_RDONLY(只讀)、
// _A_SUBDIR(文件夾)、_A_SYSTEM(系統)。這些都是在<io.h>中
// 定義的宏,可以直接使用,而本身的意義其實是一個無符號整型
// (只不過這個整型應該是2的幾次冪,從而保證只有一位爲1,而其他
// 位爲0)。既然是位表示,那麼當一個文件有多個屬性時,它往往是
// 通過位或的方式,來得到幾個屬性的綜合。例如只讀+隱藏+系統屬性,
// 應該爲:_A_HIDDEN | _A_RDONLY |_A_SYSTEM 。
// time_t time_create:這裏的time_t是一個變量類型,用來存儲文件創建時間。
// time_t time_access: 文件最後一次被訪問的時間。
// time_t time_write : 文件最後一次被修改的時間。
// _fsize_t size : 文件的大小。這裏的_fsize_t應該可以相當於unsigned整型,表示
// 文件的字節數。
// char name[_MAX_FNAME]:文件的文件名。這裏的_MAX_FNAME是一個常量宏,它在<stdlib.h>頭
// 文件中被定義,表示的是文件名的最大長度。
int _findnext( long handle, struct _finddata_t *fileinfo );
// 功 能 : 按照前面_findfirst中的泛式規則,查找下一個符合該泛式的文件,並以此爲依據
// 修改fileinfo中的值
// 頭文件 : #include <io.h>
// 參 數 : long handle - 搜索句柄(通常由緊靠其前的_findfirst()返回)
// fileinfo - 文件信息buffer
// 返回值 : 成功返回0
// 出錯返回-1,且設置errno爲如下值:
// ENOENT 沒有更多的符合該泛式的文件
int _findclose( long handle );
// 功 能 : 關閉搜尋句柄並釋放相應資源
// 頭文件 : #include <io.h>
// 參 數 : long handle - 搜索句柄(通常由緊靠其前的_findfirst()返回)
// 返回值 : 成功返回0
// 出錯返回-1,且設置errno爲如下值:
// ENOENT 沒有更多的符合該泛式的文件
4. 創建目錄
- int _mkdir( const char *dirname );
- // 功 能 : 創建一個新目錄,目錄名爲dirname.
- // 頭文件 : #include <direct.h>
- // 返回值 : 成功返回0
- // 失敗返回-1,且設置errno爲以下三個值之一:
- // EACCESS 權限不允許
- // EEXIST 該目錄已存在
- // ENOENT 無該文件或目錄
int _mkdir( const char *dirname );
// 功 能 : 創建一個新目錄,目錄名爲dirname.
// 頭文件 : #include <direct.h>
// 返回值 : 成功返回0
// 失敗返回-1,且設置errno爲以下三個值之一:
// EACCESS 權限不允許
// EEXIST 該目錄已存在
// ENOENT 無該文件或目錄
5. 刪除目錄
- int _rmdir( const char *dirname );
- // 功 能 : 刪除名爲dirname的目錄.
- // 頭文件 : #include <direct.h>
- // 返回值 : 成功返回0
- // 失敗返回-1,且設置errno爲以下三個值之一:
- // EACCESS : 權限不允許
- // ENOTEMPTY : dirname不是文件夾;或者該文件夾不空;或
- // 者dirname爲當前工作文件夾;或者dirname
- // 爲當根文件夾;
- // ENOENT : 無該文件或目錄
int _rmdir( const char *dirname );
// 功 能 : 刪除名爲dirname的目錄.
// 頭文件 : #include <direct.h>
// 返回值 : 成功返回0
// 失敗返回-1,且設置errno爲以下三個值之一:
// EACCESS : 權限不允許
// ENOTEMPTY : dirname不是文件夾;或者該文件夾不空;或
// 者dirname爲當前工作文件夾;或者dirname
// 爲當根文件夾;
// ENOENT : 無該文件或目錄
6. 其他操作
- int _access( const char *path, int mode );
- // 功 能 : 測定文件/目錄存取權限.
- // 頭文件 : #include <io.h>
- // 參 數 : path - 文件或者目錄
- // mode - 權限設定,其值如下:
- // 00 Existence only
- // 02 Write permission
- // 04 Read permission
- // 06 Read and write permission
- int _chdrive( int drive );
- // 功 能 : 更改當前工作驅動器.
- // 頭文件 : #include <direct.h>
- // 返回值 : 成功返回0
- // 失敗返回-1
- // 注 釋 : 參數說明
- // drive =1 : A盤
- // drive =2 : B盤
- // drive =3 : C盤 ...
- char* _getdcwd( int drive, char *buffer, int maxlen );
- // 功 能 : 獲得指定驅動器的當前工作路徑.
- // 頭文件 : #include <direct.h>
- // 返回值 : 成功返回指向buffer的pointer
- // 失敗返回NULL,且設置errno爲以下三個值之一:
- // ENODEV 無該設備
- // ENOMEM 內存不夠
- // ERANGE 結果超出範圍
- // 注 意 : 當第一個參數爲 NULL 時,該函數設置errno爲ERANGE
int _access( const char *path, int mode );
// 功 能 : 測定文件/目錄存取權限.
// 頭文件 : #include <io.h>
// 參 數 : path - 文件或者目錄
// mode - 權限設定,其值如下:
// 00 Existence only
// 02 Write permission
// 04 Read permission
// 06 Read and write permission
int _chdrive( int drive );
// 功 能 : 更改當前工作驅動器.
// 頭文件 : #include <direct.h>
// 返回值 : 成功返回0
// 失敗返回-1
// 注 釋 : 參數說明
// drive =1 : A盤
// drive =2 : B盤
// drive =3 : C盤 ...
char* _getdcwd( int drive, char *buffer, int maxlen );
// 功 能 : 獲得指定驅動器的當前工作路徑.
// 頭文件 : #include <direct.h>
// 返回值 : 成功返回指向buffer的pointer
// 失敗返回NULL,且設置errno爲以下三個值之一:
// ENODEV 無該設備
// ENOMEM 內存不夠
// ERANGE 結果超出範圍
// 注 意 : 當第一個參數爲 NULL 時,該函數設置errno爲ERANGE
測試:
- // 功 能 : 打印目錄path中與模式chRE匹配的所有文件明
- // 輸 入 : path - 待打印的目錄
- // chRE - 要求匹配的正則表達式
- static void printDir( const char* path, const char* chRE )
- {
- char* chCurPath = getcwd( NULL, 0); // 當前工作目錄
- printf("current work path: %s\n", chCurPath );
- int ret = _chdir( path );
- if ( ret < 0 )
- {
- perror( path );
- }
- char* newPath = getcwd( NULL, 0 );
- printf("new work path: %s\n", newPath);
- free(newPath);
- struct _finddata_t data;
- long hnd = _findfirst( chRE, &data ); // 查找文件名與正則表達式chRE的匹配第一個文件
- // 返回唯一的搜索句柄
- if ( hnd < 0 )
- {
- perror( chRE );
- }
- int nRet = (hnd <0 ) ? -1 : 1;
- while ( nRet >= 0 )
- {
- if ( data.attrib == _A_SUBDIR ) // 如果是目錄
- printf(" [%s]*\n", data.name );
- else
- printf(" [%s]\n", data.name );
- nRet = _findnext( hnd, &data );
- }
- _findclose( hnd ); // 關閉當前句柄
- chdir( chCurPath); // 切換回之前的工作目錄
- free( chCurPath );
- }
// 功 能 : 打印目錄path中與模式chRE匹配的所有文件明
// 輸 入 : path - 待打印的目錄
// chRE - 要求匹配的正則表達式
static void printDir( const char* path, const char* chRE )
{
char* chCurPath = getcwd( NULL, 0); // 當前工作目錄
printf("current work path: %s\n", chCurPath );
int ret = _chdir( path );
if ( ret < 0 )
{
perror( path );
}
char* newPath = getcwd( NULL, 0 );
printf("new work path: %s\n", newPath);
free(newPath);
struct _finddata_t data;
long hnd = _findfirst( chRE, &data ); // 查找文件名與正則表達式chRE的匹配第一個文件
// 返回唯一的搜索句柄
if ( hnd < 0 )
{
perror( chRE );
}
int nRet = (hnd <0 ) ? -1 : 1;
while ( nRet >= 0 )
{
if ( data.attrib == _A_SUBDIR ) // 如果是目錄
printf(" [%s]*\n", data.name );
else
printf(" [%s]\n", data.name );
nRet = _findnext( hnd, &data );
}
_findclose( hnd ); // 關閉當前句柄
chdir( chCurPath); // 切換回之前的工作目錄
free( chCurPath );
}
參考: http://hi.baidu.com/cppgp/blog/item/1013c550df50ef5d1138c274.html
http://wenku.baidu.com/view/da9855b9960590c69ec376bf.html