linux下用简单c语言代码怎么实现实现文件夹所有内容的复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下用简单c语言代码怎么实现实现文件夹所有内容的复制相关的知识,希望对你有一定的参考价值。

我是linux初学者,正在学习文件IO操作,求一段C代码研习,目的是复制文件内的所有文件到另一个文件夹中,如复制/root/kk目录下的所有文件到/root/kk1中,谢谢。
要完整的程序代码,谢谢

#include <unistd.h>

int main(int argc, char const *argv[])

  system("cp -r 目标目录 目的目录");//把目标目录和目的目录改成实际目录即可
  return 0;

直接调用shell命令即可

参考技术A 先用fopen打开原文件(绝对路径)r模式,再打开创建的(绝对路径)w模式。
然后fscanf()读原文件数据保存到字符串中,然后在用fprintf写到新文件中
至于函数用法,自己百度追问

给完整代码,追加50分

参考技术B #include <sys/stat.h>
#include <unistd.h>
// 目录
int isdir(char *path)

struct stat buf;
int cc;
cc=stat(path,&buf);
if(!cc && (buf.st_mode & S_IFDIR)) return(1);
return(cc);

// 可读普通文件
int isrfile(char *path)

struct stat buf;
int cc;
int euid,egid;
cc=stat(path,&buf);
if(!cc)
if((buf.st_mode & S_IFMT) != S_IFREG) return 0;
euid=geteuid();
egid=getegid();
if(euid==0)
if(buf.st_mode & S_IRUSR || buf.st_mode & S_IRGRP ||
buf.st_mode & S_IROTH)
return 1;
else return 0;

if((buf.st_mode & S_IROTH)!=0) return 1;
if((buf.st_gid == egid) && ((buf.st_mode & S_IRGRP)!=0))
return 1;
if((buf.st_uid == euid) && ((buf.st_mode & S_IRUSR)!=0))
return 1;


return cc;
【江西新华】追问

嗯能解释一下各行代码的作用么,谢谢。。还有这个程序没有main函数。。。。

本回答被提问者采纳
参考技术C #include <sys/stat.h>
#include <unistd.h>
// 目录
int isdir(char *path)

struct stat buf;
int cc;
cc=stat(path,&buf);
if(!cc && (buf.st_mode & S_IFDIR)) return(1);
return(cc);

// 可读普通文件
int isrfile(char *path)

struct stat buf;
int cc;
int euid,egid;
cc=stat(path,&buf);
if(!cc)
if((buf.st_mode & S_IFMT) != S_IFREG) return 0;
euid=geteuid();
egid=getegid();
if(euid==0)
if(buf.st_mode & S_IRUSR || buf.st_mode & S_IRGRP ||
buf.st_mode & S_IROTH)
return 1;
else return 0;

if((buf.st_mode & S_IROTH)!=0) return 1;
if((buf.st_gid == egid) && ((buf.st_mode & S_IRGRP)!=0))
return 1;
if((buf.st_uid == euid) && ((buf.st_mode & S_IRUSR)!=0))
return 1;


return cc;
【江西新华】

linux下c语言简单实现获取配置文件中的配置项

使用好处:有些参数不用写死,也不用在编译时添加。免得每次修改参数修改代码或重新编译,直接使用配置文件即可。
类比windows下GetPrivateProfileString、GetPrivateProfileInt获取配置的API

1. 使用vs2019创建linux项目

1.1 测试的配置文件如下图

1.2 测试代码和结果如下图

2. 核心代码

2.1 ini.h

#ifndef __INI_H__
#define __INI_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#define BUF_SIZE 1024

int GetIniChar(char* section, char* key, char* buf, char* filename);
int GetIniInt(char* section, char* key, int defeat, char* filename);

#endif

2.2 ini.c

#include "ini.h"

// 获取char类型配置项
int GetIniChar(char* section, char* key, char* buf, char* filename)

	if (buf == NULL)
	
		printf("buf is null\\n");
		return -1;
	
	memset(buf, 0, sizeof(buf));		// 清零

	if (section == NULL || key == NULL || filename == NULL)
	
		printf("param is null\\n");
		return -2;
	
	char cSection[BUF_SIZE] =  0 ;			// 存放配置文件每行去除空格和注释的section
	sprintf(cSection, "[%s]", section);

	FILE* fp = NULL;							// 配置文件描述符
	if (NULL == (fp = fopen(filename, "r")))
	
		printf("fopen err:%d [%s]\\n", errno, strerror(errno));
		return -3;
	
	
	char cBufFileLine[BUF_SIZE] =  0 ;		// 存放配置文件每行的实际数据
	int flag = 0;								// section标记
	while (NULL != fgets(cBufFileLine, BUF_SIZE, fp))
	
		int i, j;									// 循环计数器
		
		// 去注释,去空格,去换行符
		char cBufLine[BUF_SIZE] =  0 ;			// 存放配置文件每行去除空格和注释的数据
		for (i = 0, j = 0; i < strlen(cBufFileLine); i++)
		
			if (cBufFileLine[i] != ' ' && cBufFileLine[i] != '\\t')
			
				if (cBufFileLine[i] == ';' || cBufFileLine[i] == '\\n')
				
					cBufLine[j] = '\\0';
					break;
				
				cBufLine[j++] = cBufFileLine[i];
			
		

		char* cTmpString = NULL;					// 存放cBufLine中第一次出现字符=的位置及之后的字符串,用于提取value
		cTmpString = strchr(cBufLine, '=');	// 返回cBufFileLine中第一次出现字符=的位置,失败返回null
		if (cTmpString && flag)
		
			// 获取key
			char cKey[BUF_SIZE] =  0 ;				// 存放配置文件每行去除空格和注释的key
			for (i = 0; i < strlen(cBufLine); i++)
			
				cKey[i] = cBufLine[i];
				if (cBufLine[i] == '=')
				
					cKey[i] = '\\0';
					break;
				
			
			
			if (0 == strncmp(key, cKey, strlen(key)))
			
				// 获取value
				char cValue[BUF_SIZE] =  0 ;				// 存放配置文件每行去除空格和注释的value
				for (i = 1; i < strlen(cTmpString); i++)
				
					cValue[i - 1] = cTmpString[i];
				
				
				fclose(fp);
				strcpy(buf, cValue);
				return 0;		// 成功
			
		
		else
		
			if (flag && strchr(cBufLine, '[') && strchr(cBufLine, ']'))
			
				fclose(fp);
				return  -4;		// 该section已经搜索完毕
			
			if (0 == strncmp(cSection, cBufLine, strlen(cSection)))
			
				flag = 1;
			
		

	
	fclose(fp);
	return -5;	// 未找到配置项


// 获取int类型配置项
int GetIniInt(char* section, char* key, int defeat, char* filename)

	char cBuf[BUF_SIZE] =  0 ;
	if (0 == GetIniChar(section, key, cBuf, filename))
	
		return atoi(cBuf);
	
	return defeat;

以上是关于linux下用简单c语言代码怎么实现实现文件夹所有内容的复制的主要内容,如果未能解决你的问题,请参考以下文章

linux下用c语言写出复制黏贴文件

Mac下用C语言实现代码合并功能

如何在Linux下用c语言创建守护进程并监控系统运行期间的所有进程

在windows下用C语言如何实现socket网络编程,需要用到哪些头文件或者库?

linux下用C语言生成一个rgb888的BMP图片,为啥生成了,打开的时候(图片浏览软件)提示头文件有错

linux下用gcc如何生成预处理汇编等文件