日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

UNIX 文件系統(tǒng)基本操作( 三 )


清單 3. 處理一個(gè)目錄
unsigned process_directory( char *theDir )
{
DIR *dir = NULL;
struct dirent entry;
struct dirent *entryPtr = NULL;
int retval = 0;
unsigned count = 0;
char pathName[PATH_MAX1];
/* Open the given directory, if you can. */ 
dir = opendir( theDir );
if( dir == NULL ) {
printf( "Error opening %s: %s", theDir, strerror( errno ) );
return 0;
}
在打開(kāi)了指定的目錄之后,調(diào)用 readdir_r()(請(qǐng)參見(jiàn)清單 4)以獲取關(guān)于第一個(gè)條目的信息,隨后每次調(diào)用 readdir_r() 都將返回下一個(gè)條目,直到到達(dá)了目錄末尾,并且 entryPtr 被設(shè)置為 NULL 。這里還使用了 strncmp() 來(lái)檢查“.和“..條目,以便略過(guò)它們 。如果不略過(guò)它們,您將永遠(yuǎn)都在處理類似“theDir/./././././././././.等這樣的目錄 。
清單 4. 讀取一個(gè)目錄條目
retval = readdir_r( dir, &entry, &entryPtr );
while( entryPtr != NULL ) {
struct stat entryInfo;
if( ( strncmp( entry.d_name, ".", PATH_MAX ) == 0 ) ||
( strncmp( entry.d_name, "..", PATH_MAX ) == 0 ) ) {
/* Short-circuit the . and .. entrIEs. */
retval = readdir_r( dir, &entry, &entryPtr );
continue;
}
既然已經(jīng)得到了目錄的條目名稱,那么您需要構(gòu)造一個(gè)更加完整的路徑(請(qǐng)參見(jiàn)清單 5),然后調(diào)用 lstat() 以獲取該條目的相關(guān)信息 。因?yàn)榉?hào)鏈接需要特殊的處理,所以這里使用了 lstat() 函數(shù) 。您可以使用 readlink() 函數(shù)找到其目標(biāo)文件 。
如果該條目是一個(gè)目錄,那么對(duì)這個(gè)目錄遞歸地調(diào)用 process_Directory(),并將其中所找到的條目數(shù)加到運(yùn)行總數(shù)中 。如果該條目是一個(gè)文件,那么顯示其名稱和字節(jié)數(shù)(可在 struct stat 的 st_size 成員中找到) 。
清單 5. 處理?xiàng)l目
(void)strncpy( pathName, theDir, PATH_MAX );
(void)strncat( pathName, "/", PATH_MAX );
(void)strncat( pathName, entry.d_name, PATH_MAX );
if( lstat( pathName, &entryInfo ) == 0 ) {
/* stat() succeeded, let's party */
count;
if( S_ISDIR( entryInfo.st_mode ) ) {
/* directory */
printf( "processing %s/n", pathName );
count= process_directory( pathName );
} else if( S_ISREG( entryInfo.st_mode ) ) {
/* regular file */
printf( "t%s has %lld bytesn",
pathName, (long long)entryInfo.st_size );
} else if( S_ISLNK( entryInfo.st_mode ) ) {
/* symbolic link */
char targetName[PATH_MAX1];
if( readlink( pathName, targetName, PATH_MAX ) != -1 ) {
printf( "t%s -> %sn", pathName, targetName );
} else {
printf( "t%s -> (invalid symbolic link!)n",
pathName );
}
}
} else {
printf( "Error statting %s: %sn", pathName, strerror(
errno ) );
}
在 while 循環(huán)的底部,讀取另一個(gè)目錄條目并對(duì)其進(jìn)行處理 。如果您完成了對(duì)目錄條目的處理,那么關(guān)閉當(dāng)前打開(kāi)的目錄,并返回經(jīng)過(guò)處理的條目的數(shù)目 。
清單 6. 讀取另一個(gè)條目
retval = readdir_r( dir, &entry, &entryPtr );
}
/* Close the Directory and return the number of entrIEs. */
(void)closedir( dir );
return count;
}
最后,清單 7 顯示了該程序的 main() 函數(shù),它只是對(duì)命令行中傳遞的每個(gè)參數(shù)調(diào)用了 process_directory() 函數(shù) 。一個(gè)真正的程序應(yīng)該具有使用方法消息,并且在用戶沒(méi)有指定任何參數(shù)時(shí),提供某種形式的反饋信息,但我把這項(xiàng)內(nèi)容作為練習(xí)留給讀者 。
清單 7. 主線
/* readdir_demo main()
*
* Run through the specified directories, and pass them
* to process_directory().
*/
int main( int argc, char **argv )
{
int idx = 0;
unsigned count = 0;
for( idx = 1; idx < argc; idx) {
count= process_directory( argv[idx] );

推薦閱讀