⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 localdata.cpp

📁 这个是LINUX下的HFTP测试版本
💻 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 + -