社区
C语言
帖子详情
请问在LINUX下如何用C写传送目录及其目录下的所有文件
gyhs
2003-10-17 04:42:10
以前写了一个C/S下传送文件的程序。
现在想在客户端输入目录名,在服务端查找这个目录,并把目录和所有文件都传到
客户端。
请问传送目录这段程序应该怎么写啊?
初学者,向各位高手请教,谢谢了!!!
...全文
79
7
打赏
收藏
请问在LINUX下如何用C写传送目录及其目录下的所有文件
以前写了一个C/S下传送文件的程序。 现在想在客户端输入目录名,在服务端查找这个目录,并把目录和所有文件都传到 客户端。 请问传送目录这段程序应该怎么写啊? 初学者,向各位高手请教,谢谢了!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
liuty2006
2003-11-20
打赏
举报
回复
mk
loadme_litbear
2003-11-20
打赏
举报
回复
给你个客户端测试,服务端的差不多都,以前学习时候写的,你参考一下思路吧,
服务端差不多,无非就是socket,bind,listen,accept,我自己在测试里面定义了传输协议
你可以写的简单点。
//---------------------------------------------------------------------------
//project : nspr Client Test
//usage: For test only.
//---------------------------------------------------------------------------
#include "protocol.h"
DataHeaderStruct Header;
PRUintn nPort = 60001;
/*
** 清除数据头
*/
void ClearDataHeader()
{
Header.header[0] = 0;
Header.header[1] = 0;
Header.header[2] = 0;
Header.header[3] = 0;
Header.header[4] = 0;
return;
}
/*
** 等待提交结果
*/
int WaitRequestReturn(PRFileDesc *pConnection)
{
pConnection->methods->fsync(pConnection);
PR_Read(pConnection, Header.header, sizeof(Header));
Header.header[0] = 0;
return TEST_OK;
}
/*
** 提交连接申请
*/
int SendConnectionRequest(PRFileDesc *pConnection)
{
PR_Write(pConnection, Header.header, sizeof(Header));
return TEST_OK;
}
/*
** 打开连接
*/
PRFileDesc *OpenConnection(char *ServerIP)
{
PRFileDesc *pConnection;
PRNetAddr ServerAddr;
PRStatus prstatus;
PRSocketOptionData socketoption;
PR_InitializeNetAddr(PR_IpAddrAny, nPort, &ServerAddr);
PR_StringToNetAddr(ServerIP, &ServerAddr);
pConnection = PR_NewTCPSocket();
socketoption.option = PR_SockOpt_Nonblocking;
socketoption.value.non_blocking = PR_FALSE;
prstatus = PR_SetSocketOption(pConnection, &socketoption);
if (prstatus != PR_SUCCESS) {
printf("设置连接参数失败\r\n");
pConnection = NULL;
return pConnection;
}
prstatus = PR_Connect(pConnection, &ServerAddr, PR_INTERVAL_NO_TIMEOUT);
if (prstatus != PR_SUCCESS) {
printf("连接服务器失败\r\n");
pConnection = NULL;
return pConnection;
}
//发送连接申请
Header.header[1] = 1;
if (SendConnectionRequest(pConnection) == TEST_FAILURE) {
pConnection = NULL;
return pConnection;
}
//等待申请返回
if (WaitRequestReturn(pConnection) == TEST_FAILURE) {
pConnection = NULL;
return pConnection;
}
return pConnection;
}
/*
** 发送文件
*/
int File_Send(char *pName, PRFileDesc *pConnection)
{
PRFileDesc *File_fd;
PRFileInfo fileinfo;
PR_GetFileInfo(pName, &fileinfo);
File_fd = PR_Open (pName, PR_RDONLY, 0);
Header.header[0] = fileinfo.size;
Header.header[1] = 2;
Header.header[4] = 0;
strcpy(Header.filename, pName);
//send file code here
pConnection->methods->transmitfile(pConnection, File_fd, &Header,
sizeof(Header), PR_TRANSMITFILE_KEEP_OPEN,
PR_INTERVAL_NO_TIMEOUT);
PR_Close(File_fd);
WaitRequestReturn(pConnection);
ClearDataHeader();
return TEST_OK;
}
/*
** 对文件名处理
** 当用户输入为文件时调用发送函数
** 当用户输入为目录时对目录进行递归处理
*/
int File_Get(char *pName, PRFileDesc *pConnection)
{
PRUintn counter;
int pNameLength;
PRDir *dir;
PRDirEntry *dirEntry;
PRFileInfo FileInfo;
char fileName[sizeof(Header.filename)];
strcpy(fileName, pName);
//得到文件属性
if (PR_GetFileInfo(pName, &FileInfo) == PR_SUCCESS) {
//处理文件
if (FileInfo.type == PR_FILE_FILE) {
printf ("文件: %s \r\n", pName);
//发送文件
if (File_Send(pName, pConnection) == TEST_FAILURE) {
printf ("发送文件失败 \r\n");
}
else {
//SendConnectionRequest(pConnection);
//WaitRequestReturn(pConnection);
printf("文件大小 %i \r\n", FileInfo.size);
printf("文件发送成功 \r\n");
}
}
//处理目录
else if (FileInfo.type == PR_FILE_DIRECTORY) {
printf("目录: %s \r\n", pName);
dir = PR_OpenDir(pName);
//枚举目录下的元素
while (true) {
dirEntry = PR_ReadDir(dir, PR_SKIP_BOTH);
//递归调用结束点
if (dirEntry == NULL)
break;
pNameLength = PL_strlen(fileName);
fileName[pNameLength] = '\\';
fileName[pNameLength + 1] = '\0';
for (counter = 0 ;counter < PL_strlen(dirEntry->name) ;counter++) {
pNameLength = PL_strlen(fileName);
fileName[pNameLength] = (char) dirEntry->name[counter];
fileName[pNameLength + 1] = '\0';
}
fileName[PL_strlen(fileName) + counter] = '\0';
/*
** 对目录进行递归
*/
File_Get(fileName, pConnection);
strcpy(fileName, pName);
}
}
}
return TEST_OK;
}
/*
** 从命令行读取文件名进行处理
*/
int GetFileName(PRFileDesc *pConnection, char *ServerIP)
{
char filename[sizeof(Header.filename)];
//数据发送命令行处理
while (true) {
printf("\r\n 当前服务器: [%s],输入 end 命令断开连接 \r\n", ServerIP);
printf("输入要上传的文件名或者目录名(包括路径) \r\n");
scanf("%s", filename);
//断开指令判断
if ((filename[0] == 'e') && (filename[1] == 'n') &&
(filename[2] == 'd') && (filename[3] == '\0')) {
return 0;
}
//进行文件传输
if (File_Get(filename, pConnection) == TEST_FAILURE) {
printf("处理输入出错 \r\n");
continue;
}
}
return TEST_OK;
}
/*
** 任务调度
*/
int StartClient(char *ServerIP)
{
PRFileDesc *pConnection;
pConnection = OpenConnection(ServerIP);
if (pConnection == NULL)
return TEST_FAILURE;
if(GetFileName(pConnection, ServerIP) == TEST_FAILURE)
return TEST_FAILURE;
return TEST_OK;
}
/*
** 主程序入口
*/
int main(int argc, char **argv)
{
char ServerIP[16];
/* 命令行处理 */
for (;;) {
printf("\r\n [文件上传客户端],输入 end 命令结束此程序 \r\n");
printf("请输入服务器IP地址: \r\n");
scanf ("%s", ServerIP);
//结束指令判断
if ((ServerIP[0] == 'e') && (ServerIP[1] == 'n') &&
(ServerIP[2] == 'd') && (ServerIP[3] == '\0')) {
return 0;
}
StartClient(ServerIP);
}
return 0;
}
loadme_litbear
2003-10-22
打赏
举报
回复
有cvs了,兄弟何必呢
gyhs
2003-10-22
打赏
举报
回复
这有特别任务的,也算是自己练习一下,大家就帮帮忙嘛
gyhs
2003-10-19
打赏
举报
回复
请大家帮帮忙
fwinfwin
2003-10-18
打赏
举报
回复
分解为传送文件和建立文件夹就可以了阿!
zhu1981
2003-10-18
打赏
举报
回复
抱歉
我想我走错门拉
linux
下c语言高级编程入门
本课程主要学习
linux
下的各种API以及
linux
下常用命令的使用,从开发环境的搭建到一行一行的编
写
小示例来完成各个API的调用,通过学习本课程可以很轻松进入
linux
、C语言高级编程的世界。
Linux
下C语言开发
Linux
下C语言开发
Linux
下C语言开发
Linux
下C语言开发流程C语言开发工具c语言代码编辑工具
Linux
C语言的编译器gccgcc 的安装和配置gcc对c语言的处理过程gcc的基础使用方法
Linux
C语言的调试工具gdbgdb的基础使用gdb运行模式的选择
Linux
C语言的项目管理工具makemake 项目管理器的基础makefile中的变量make项目管理器的使用
Linux
中的C语言应用代码C语言代码的运行机制C语言代码的程序存储空间C语言代码的main函数和参数C 语言代码的出错处理C语言代
linux
查找
目录
下的所有
文件
中是否含有某个字符串
Linux
查找
文件
内容的常用命令方法。 从
文件
内容查找匹配指定字符串的行: $ grep "被查找的字符串"
文件
名例子:在当前
目录
里第一级
文件
夹中寻找包含指定字符串的.in
文件
grep "thermcontact" */*.in 从
文件
内容查找与正则表达式匹配的行: $ grep –e “正则表达式”
文件
名 查找时不区分大小
写
: $ grep –i "被查找的字符串"
文件
名 查找匹配的行数: $ grep -c "被查找的字符串"
文件
名 从
文件
内容查找不匹配指定字符串的行: $ grep –.
linux
查询
目录
下包含关键字的所有
文件
查找
目录
下的所有
文件
中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找
目录
下的所有
文件
中是否含有某个字符串,并且只打印出
文件
名 find .|xargs grep -ri "IBM" -l 1.正则表达式 (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/、*、?等)组成。 (2)基本元字符集及其含义 ^ :...
Linux
下查找
目录
下的所有
文件
是否包含某字符串
很多时候我们需要找到某个
文件
夹下包含某个字符串的所有
文件
,比如已知一个变量名,但是不知道定义在哪个
文件
里,就可以搜一下。
目录
下的所有
文件
中查找字符串 find .| xargs grep -ri "class"
目录
下的所有
文件
中查找字符串,并且只打印出含有该字符串的
文件
名 find .| xargs grep -ri "class" -l 另一种方法:
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章