社区
C语言
帖子详情
请问在LINUX下如何用C写传送目录及其目录下的所有文件
gyhs
2003-10-17 04:42:10
以前写了一个C/S下传送文件的程序。
现在想在客户端输入目录名,在服务端查找这个目录,并把目录和所有文件都传到
客户端。
请问传送目录这段程序应该怎么写啊?
初学者,向各位高手请教,谢谢了!!!
...全文
70
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
下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 另一种方法:
Linux
文件
系统的
目录
结构
Linux
文件
系统的
目录
结构 转自:
Linux
文件
系统的
目录
结构
Linux
下的
文件
系统为树形结构,入口为/ 树形结构下的
文件
目录
: 无论哪个版本的
Linux
系统,都有这些
目录
,这些
目录
应该是标准的。各个
Linux
发行版本会存在一些小小的差异,但总体来说,还是大体差不多。 /
文件
系统的入口,最高一级
目录
; /bin 基础系统所需要的命令位于此
目录
,是最小系统所需要的命令,如:ls, cp
C语言
69,336
社区成员
243,078
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章