📄 localdata.cpp
字号:
/********************************************************* ** 文件名: Localdata.cpp ** 建立日期:2002年7月23日 ** 作者: 何林强 ** 描述: 该文件集中了ftp客户端软件的本地部分内容 ** 主要包括本地文件列表,及用于本地的一些 ** 帐户管理内容. *********************************************************/#include "stdglo.h"extern Shftp_pixmap filestyle[5];/**************************************类Chftp_Filedata部分*********************************/Chftp_Filedata::Chftp_Filedata(){ try{ for(int i=0;i<6;i++){ //存储文件属性的指针数组需要初始化. files[i]=new char[100]; if(!files[i]) throw Chftp_error("内存分配失败,请检查您的系统后,重启hFTP.");} } catch(Chftp_error& badalloc){ badalloc.messagebox(); }}Chftp_Filedata::~Chftp_Filedata(){ for(int i=0;i<6;i++) if(files[i]) delete [] files[i];}char *Chftp_Filedata::hftp_GetCurrent_dir(){ try{ if(!(getcwd(Current_dir,sizeof(Current_dir)))) throw Chftp_error("获取本地文件路径失败,请重启hFTP."); return Current_dir; } catch(Chftp_error& badalloc){ badalloc.messagebox(); }}glong Chftp_Filedata::hftp_Getfilesize(const gchar *filename){ struct stat statbuf; if(lstat(filename,&statbuf)<0) return -2; return statbuf.st_size;}void Chftp_Filedata::hftp_GetFiles(gchar *dir,GtkWidget *clist){ DIR *dp=NULL; int i; struct stat statbuf; struct dirent *entry=NULL; if(!(dp=opendir(dir))) return; //如果当前读到无效路径,则不作任何操作,直接返回. chdir(dir); //进入先定路径. gtk_clist_clear(GTK_CLIST(clist)); //将列表框原有内容清空. while(entry=readdir(dp)){ lstat(entry->d_name,&statbuf); strcpy(files[0],entry->d_name); //文件名. if(S_ISDIR(statbuf.st_mode)) sprintf(files[1],"%s","目录"); else if(S_ISLNK(statbuf.st_mode)) sprintf(files[1],"%s","链接"); else if(S_ISREG(statbuf.st_mode)) sprintf(files[1],"%s","文件"); else sprintf(files[1],"%s","设备"); //文件类型. sprintf(files[2],"%1.2fK",(double)(statbuf.st_size)/1024); //文件大小(以K为单位). if(0==statbuf.st_uid) sprintf(files[3],"%s","root"); else sprintf(files[3],"%d",statbuf.st_uid); //文件属主. sprintf(files[4],"%s",ctime(&(statbuf.st_ctime))+8); //文件建立(修改)日期. hftp_Get_attributes(files[5],&statbuf); i=gtk_clist_append(GTK_CLIST(clist),files); //将获取内容加入列表框. if(0==strcmp(files[1],"文件")) gtk_clist_set_pixtext(GTK_CLIST(clist),i,0,files[0], 1,filestyle[3].pixmap,filestyle[3].mask); else if((0==strcmp(files[1],"目录")) && (0==strcmp(files[0],"."))) gtk_clist_set_pixtext(GTK_CLIST(clist),i,0,files[0], 1,filestyle[2].pixmap,filestyle[2].mask); else if((0==strcmp(files[1],"目录")) && (0==strcmp(files[0],".."))) gtk_clist_set_pixtext(GTK_CLIST(clist),i,0,files[0], 1,filestyle[1].pixmap,filestyle[1].mask); else if(0!=strcmp(files[1],"目录")) gtk_clist_set_pixtext(GTK_CLIST(clist),i,0,files[0], 1,filestyle[4].pixmap,filestyle[4].mask); else gtk_clist_set_pixtext(GTK_CLIST(clist),i,0,files[0], 1,filestyle[0].pixmap,filestyle[0].mask); }}/************************************* ** 获取当前文件列表中所有文件的权限 ************************************/void Chftp_Filedata::hftp_Get_attributes(char *attributes,struct stat *const statbuf){ for(int i=8;i>=0;i--){ //文件权限标志存储在struct stat的低九位中. if(statbuf->st_mode & (1<<i)){ //逐位获得文件的权限状况. if(8==i or 5==i or 2==i) *attributes++='r'; else if(7==i or 4==i or 1==i) *attributes++='w'; else *attributes++='x';} else { *attributes++='-'; } } *attributes='\0'; return;}/*************************************************************** ** 递归先序遍历整个目录树,得到整个目录树结构.并以链表形式组织 **************************************************************/Ctransfer_files *Chftp_Filedata::get_upload_dir(Ctransfer_files **tree,char *dirname){ DIR *dp=NULL; struct stat statbuf; struct dirent *entry=NULL; Ctransfer_files *temp=NULL; if(!(dp=opendir(dirname))) return NULL; chdir(dirname); //进入选定路径. strcpy((*tree)->filename,dirname); (*tree)->filesize=0; (*tree)->filetype=1; (*tree)->brother=NULL; temp=*tree; while(entry=readdir(dp)){ lstat(entry->d_name,&statbuf); if(0==strcmp("..",entry->d_name) || 0==strcmp(".",entry->d_name)) continue; temp->brother=new Ctransfer_files; temp=temp->brother; if(S_ISDIR(statbuf.st_mode)) temp=get_upload_dir(&temp,entry->d_name); else if(S_ISREG(statbuf.st_mode)){ strcpy(temp->filename,entry->d_name); temp->filesize=statbuf.st_size; temp->brother=NULL; temp->filetype=0; } } temp->brother=new Ctransfer_files; temp=temp->brother; strcpy(temp->filename,".."); temp->brother=NULL; temp->filetype=1; chdir(".."); return temp;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -