例子:单机模式下的文件上传和下载,单机是指在一台电脑上操作,服务器有一个共享目录,客户端能将文件上传到服务器的共享目录,也能从服务器的共享目录中下载文件到自己的客户端。
1、输入服务器的地址:路径和目录名
2、列出服务器中有哪些文件:
涉及目录io的内容:opendir reddir
3、输入从服务器下载的文件名 或 上传文件到服务器的文件名
4、文件下载
文件IO:open read write colse
标准IO: fopen fputs fgets fputc fgetc fread fwrite fcolse
#include"stdio.h"
#include"sys/types.h"
#include"dirent.h"
#include"string.h"
#include"unistd.h"
#include"fcntl.h"
int main()
{
DIR *dp;
int src_fd,des_fd;//定义文件IO的两个描述符,原文件和目的文件
int fd;
int ret;//读的返回值
struct dirent *dir;
char server[128]={0};//定义路径和名字的字符串
char file[128]={0};//定义从键盘输入的文件名的字符串
char buf[128]={0};//定义读取原文件读到这里的缓存
start:
printf("请输入服务器的路径和共享目录的名字:\n");
scanf("%s",server);//扫描从键盘输入的路径和名称
//打开目录
dp=opendir(server);
if(dp==NULL)
{
printf("打开失败\n",server);
goto start;//重新输入
}
printf("打开成功\n");
//读取目录内容,列出有哪些文件
while(1)
{
dir=readdir(dp);
if(dir==NULL)//表示已经读取到了,跳出循环
break;
else
{
printf("inode=%ld\t file_name=%s\n",dir->d_ino,dir->d_name);
}
}
printf("\n请输入下载的文件名:\n");
scanf("%s",file);
//上传文件,类似于cp复制的文件io操作
//先打开原文件
src_fd=open(strcat(strcat(server,"/"),file),O_RDONLY);//2个参数,文件路径+名称(server/file是绝对路径),所以用字符串连接函数strcat,打开方式
if(src_fd <0)
{
printf("打开文件失败:%s\n",file);
return -1;
}
printf("打开成功\n");
//打开目标文件,复制过去时要创建一个文件
des_fd=open(file,O_CREAT | O_WRONLY,0777);
if(des_fd <0)
{
printf("创建文件:%s失败\n",file);
return -2;
}
printf("创建文件:%s成功\n",file);
//创建成功就可以进行文件的复制
while(1)
{
ret=read(src_fd,buf,128);//读取原文件,3个参数,去哪读,读去哪(定义缓存),读多少(实际由缓存大小决定,因为大于缓存时要一直循环)
if(ret <128)
break;
write(des_fd,buf,ret);
}
write(des_fd,buf,ret);
//完成后关闭三个文件
close(src_fd);
close(des_fd);
closedir(dp);//目录流
return 0;
}
代码中用到的字符串连接函数strcat(0用法:
strcat(str1,str2)是将str2的内容接在str1后面,得到str1str2
如str1的内容是"123\o",str2是"45\0",那么strcat(str1,str2)内容输出是"12345\0",即str1的\0被覆盖。(我能理解的一个别人的解释,更详细的自己找)