/*
1、用户输入任意目录名称,显示该目录下的文件列表信息,包括文件类型,文件权限,文件大小,文件名称
2、拷贝用户输入的文件到当前目录下
3、第二点功能,使用4种方式完成,并比较说明效率
*/

/*

struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
};

先前所描述的st_mode 则定义了下列数种情况:
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 scoket
S_IFLNK 0120000 符号连接
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置
S_IFIFO 0010000 先进先出

S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位

S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限

S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限

S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限

上述的文件类型在POSIX中定义了检查这些类型的宏定义:
S_ISLNK (st_mode) 判断是否为符号连接
S_ISREG (st_mode) 是否为一般文件
S_ISDIR (st_mode) 是否为目录
S_ISCHR (st_mode) 是否为字符装置文件
S_ISBLK (s3e) 是否为先进先出
S_ISSOCK (st_mode) 是否为socket
*/

#include<stdio.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include<sys/time.h>
#include<fcntl.h>

int mode_to_letters(int mode,char *str)
{

strcpy(str,"----------");

if(S_ISDIR(mode))str[0] = 'd';

if(S_ISCHR(mode))str[0] = 'c';

if(S_ISBLK(mode))str[0] = 'b';

if(mode&S_IRUSR)str[1] = 'r';

if(mode&S_IWUSR)str[2] = 'w';

if(mode&S_IXUSR)str[3] = 'x';

if(mode&S_IRGRP)str[4] = 'r';

if(mode&S_IWGRP)str[5] = 'w';

if(mode&S_IXGRP)str[6] = 'x';

if(mode&S_IROTH)str[7] = 'r';

if(mode&S_IWOTH)str[8] = 'w';

if(mode&S_IXOTH)str[9] = 'x';

return 0;

}
int dostat(const char *path)
{
struct stat info;
char modestr[16];
if(stat(path, &info)==-1)
{
printf("%s stat error\n",path);
return -1;

}
printf(" %s %ld ", path,info.st_size);
mode_to_letters(info.st_mode,modestr);

printf("%s\n",modestr);
return 0;
}

int cpchar(char *src, char *des)
{
FILE *fpsrc,*fpdes;
char ch;

fpsrc = fopen(src, "r");
if(fpsrc==NULL)
{
printf("open src fail\n");
return -1;
}

fpdes = fopen(des, "w");
if(fpdes==NULL)
{
printf("open des fail\n");
return -1;
}

while(1)
{
if((ch=fgetc(fpsrc))!=EOF)
{
fputc(ch,fpdes);
//printf("%c",ch);
}
else
{
break;
}
}

fclose(fpsrc);
fclose(fpdes);

return 0;
}

/*fgets fputs 一行*/
int cpline(char *src, char *des)
{
FILE *fpsrc,*fpdes;
char buf[1024];

fpsrc = fopen(src, "r");
if(fpsrc==NULL)
{
printf("open src fail\n");
return -1;
}

fpdes = fopen(des, "w");
if(fpdes==NULL)
{
printf("open des fail\n");
return -1;
}

while(1)
{
if(fgets(buf,1024,fpsrc)!=NULL)
{
fputs(buf,fpdes);
//printf("%s",buf);
}
else
{
break;
}
}

fclose(fpsrc);
fclose(fpdes);

return 0;
}

/*fread fwrite 一块*/
int cpblk(char *src, char *des)
{
FILE *fpsrc,*fpdes;
char buf[1024];
int num;

fpsrc = fopen(src, "r");
if(fpsrc==NULL)
{
printf("open src %s fail\n",src);
return -1;
}

fpdes = fopen(des, "w");
if(fpdes==NULL)
{
printf("open des %s fail\n",des);
return -1;
}

while(1)
{
if((num=fread(buf,sizeof(char),1024,fpsrc))>0)
{
fwrite(buf,sizeof(char),num,fpdes);
//printf("%d ",num);
}
else
{
break;
}
}

fclose(fpsrc);
fclose(fpdes);

return 0;
}

/*系统read write*/
int cp(char *src, char *des)
{
int fd1,fd2;
char buf[1024];
int nbyte;

if((fd1 = open(src, O_RDONLY)) < 0)
{
printf("open src fail!\n");
return -1;
}

if((fd2 = open(des, O_WRONLY)) < 0)
{
printf("open des fail!\n");
return -1;
}

while((nbyte = read(fd1, buf, sizeof(buf))) > 0)
{
write(fd2, buf, nbyte);
}

close(fd1);
close(fd2);

return 0;
}

int mydir(const char *dirname){
DIR *dp;
struct dirent *dir;
dp=opendir(dirname);
char path[256];
char inputfilename[256];
char pathbuf[256];
char path_getcwd[256];
int ret;
if(dp==NULL)
{

printf("open dir fail");
return -1;
}
strncpy(path,dirname,strlen(dirname)+1);
while(1)
{
dir=readdir(dp);
if(dir!=NULL)
{
//printf("%ld %s\n",dir->d_ino,dir->d_name);

strncpy(pathbuf,path,strlen(path)+1);
dostat(strcat(strcat(pathbuf,"/"),dir->d_name));

}
else
{
break;

}
}
//拷贝用户输入的文件到当前目录下
printf("please input copy file name to current dir\n");
scanf("%s",inputfilename);
strncpy(pathbuf,path,strlen(path)+1);
printf("%s\n",pathbuf);
getcwd(path_getcwd,256);

strcat(strcat(pathbuf,"/"),inputfilename);
strcat(strcat(path_getcwd,"/"),inputfilename);
struct timeval tv;
long start_time,stop_time,use_time;

gettimeofday(&tv,NULL);
//printf("tv_usec:%d\n",tv.tv_usec);
start_time=tv.tv_sec*1000+tv.tv_usec/1000;

ret=cp(pathbuf,path_getcwd);

gettimeofday(&tv,NULL);
//printf("tv_usec:%d\n",tv.tv_usec);
stop_time=tv.tv_sec*1000+tv.tv_usec/1000;
use_time=stop_time-start_time;
if(ret==0)
{

printf("cp test success! use time= %ld msec\n",use_time);
}

gettimeofday(&tv,NULL);
//printf("tv_usec:%d\n",tv.tv_usec);
start_time=tv.tv_sec*1000+tv.tv_usec/1000;

ret=cpchar(pathbuf,path_getcwd);

gettimeofday(&tv,NULL);
//printf("tv_usec:%d\n",tv.tv_usec);
stop_time=tv.tv_sec*1000+tv.tv_usec/1000;
use_time=stop_time-start_time;
if(ret==0)
{

printf("cpchar test success! use time= %ld msec\n",use_time);
}

gettimeofday(&tv,NULL);
//printf("tv_usec:%d\n",tv.tv_usec);
start_time=tv.tv_sec*1000+tv.tv_usec/1000;

ret=cpline(pathbuf,path_getcwd);

gettimeofday(&tv,NULL);
//printf("tv_usec:%d\n",tv.tv_usec);
stop_time=tv.tv_sec*1000+tv.tv_usec/1000;
use_time=stop_time-start_time;
if(ret==0)
{

printf("cpline test success! use time= %ld msec\n",use_time);
}

gettimeofday(&tv,NULL);
//printf("tv_usec:%d\n",tv.tv_usec);
start_time=tv.tv_sec*1000+tv.tv_usec/1000;

ret=cpblk(pathbuf,path_getcwd);

gettimeofday(&tv,NULL);
//printf("tv_usec:%d\n",tv.tv_usec);
stop_time=tv.tv_sec*1000+tv.tv_usec/1000;
use_time=stop_time-start_time;
if(ret==0)
{

printf("cpblk test success! use time= %ld msec\n",use_time);
}

closedir(dp);

return 0;
}

int main(int argc, char * argv[])
{
if(argc != 2)
{
printf("Input dir error\n");
return -1;
}

mydir(argv[1]);
return 0;
}

运行结果如下,read write 最快, fread fwrite次之, 之后是fputs 和fputc.

另外fputs和fputc用于非字符串文件时会有问题,深层原因还待分析。

Linux 目录操作和4中文件拷贝效率测试的更多相关文章

  1. Java学习-045-目录中文件拷贝

    挺晚的了,直接上码.敬请各位小主参阅,若有不足之处,敬请指正,非常感谢! 目录文件拷贝源码: /** * <strong>目录拷贝</strong><br> * & ...

  2. 【技术博客】 关于laravel5.1中文件上传测试的若干尝试

    关于laravel5.1中文件上传测试的若干尝试 作者:ZGJ 版本:v1.0 PM注:本人这两天也正在尝试解决这一问题,如有进展将及时更新这一博客 在我们的软工第二阶段中,我开始着手进行后端控制器的 ...

  3. windows下操作linux虚拟机映射网络驱动器中文件提示chmod权限不足解决方案

    为了方便操作,linux虚拟机会通过windows下连接网络驱动器的方式共享自己的文件,对于前端来说,我想把gulp放在windows磁盘,操作虚拟机中的php文件,一来节省虚拟机磁盘大小,二来解决虚 ...

  4. 3、Linux目录操作

    1.目录操作概述 2.ls显示目录内容 命令名称:ls 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 功能描述:显示目录文件 ls  -a    显示目录下的所有文件(包括 ...

  5. 【Linux】【一】linux 目录切换、创建目录和文件、编辑目录以及文件(txt)

    以下 是在指定目录下创建文件夹目录,以及在该目录下创建txt文件进行编辑,保存. 然后删除相关文件以及目录的命令操作记录. 本操作记录中的命令简单解释: pwd 显示当前路径 ls 显示当前目录下的文 ...

  6. 总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  7. Linux下不同机器之间的文件拷贝

    通过 scp 命令实现不同机器之间的文件拷贝. (1)本机考到目标机器:scp 本机文件 目的地: 如:scp /home/odp-web.war   root@192.168.6.137:/usr/ ...

  8. Ubuntu 14.04 + Linux 3.14.34 系统调用实现文件拷贝

    采用 64位系统, ubuntu 14.04 + 新内核linux-3.14.34 下载地址https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.1 ...

  9. 在 Linux 平台及 IPv4 环境中构建 IPv6局域网 测试环境

    在 Linux 平台及 IPv4 环境中构建 IPv6 测试环境 1 IPv6简介 IPv6(Internet Protocol Version 6)作为 IPv4 的升级版本,它是作为一共软件升级安 ...

随机推荐

  1. 记录asp.net网站停止运行原因的代码

    记录网站是什么原因导致停止运行还是有必要的,下面是具体的实现方式. protected void Application_End(object sender, EventArgs e) { Recor ...

  2. Extjs之success、failure

    Ext.form.Action.Submit的配置选项success.failure是根据返回json中success属性判断的,如果success为true,则success,false则failu ...

  3. 转:Nginx+ffmpeg的HLS开源服务器搭建配置及开发详解

    转:http://itindex.net/detail/51186-nginx-ffmpeg-hls 本文概述: 至目前为止,HLS 是移动平台上非常重要并十分流行的流媒体传输协议.做移动平台的流媒体 ...

  4. Unity Rigidbody 刚体中的Angular Drag和Freeze Position/Rotation

    Rigidbody中 Angular Drag  (角阻力):同样指的是空气阻力,只不过是用来阻碍物体旋转的.如果设置成无限的话,物体会立即停止旋转.如果设置成0,物体在上升过程中,会发生侧翻旋转. ...

  5. ComboBoxEdit数据绑定

    ComboBoxEdit也是DevExpress winform控件中经常使用的一个,我们在使用的过程中可能有时需要对ComboBoxEdit控件进行数据绑定,而ComboBoxEdit控件不像 Lo ...

  6. 北大ACM(POJ1002-487-3279)

    Question:http://poj.org/problem?id=1002问题点:字符映射.选重复项及排序. Memory: 1136K Time: 813MS Language: C++ Res ...

  7. 深入理解Java虚拟机博客参考目录

    参考博客:注明请注明出处 深入理解Java虚拟机读书笔记之:第5章 Java虚拟机(Java虚拟机内部结构图,很重要) 深入理解Java虚拟机读书笔记之:第6章 Java class文件: <深 ...

  8. 开源而又强大的迷你型web服务器推荐

    appweb显然是不二之选,看了下最新版,已经到了4了 下载下来,http://appwebserver.org/software/appweb-4.4.4-0-src.tgz,十几M,直接吓傻,离我 ...

  9. 第六十六篇、OC_Sqlite数据库操作

    #import <Foundation/Foundation.h> #import <sqlite3.h> #define kFilename @"data.sqli ...

  10. C++对象的JSON序列化与反序列化探索续-复杂对象的序列化与反序列化

    本文是基本上一篇博文进行改进而成,上一篇请见: C++对象的JSON序列化与反序列化探索 此处就不多说了,直接上代码. 1. 序列化基类 #pragma once #include <strin ...