⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 duplicatfile.cpp

📁 移植Nuclues_RTC到coldfire5307在diab下编译通过
💻 CPP
字号:
/****************************************************************
 Name: DupilcateFile.cpp
 Description: Nucleus文件系统不带复制函数,在这里自己定义
			  由于用到new和delete操作,因此定义为C++函数
 Authour: 廖怡白
 Date: 2002.7.15
******************************************************************/

#include "Pcdisk.h"
#include <string.h>
extern "C" BOOL fl_change_line(UCOUNT driveno);
extern "C" BOOL ReportError(UCOUNT  error_code);

BOOL is_copy_file ;//复制文件的标志

bool NU_duplicate_file(char *file_dest, char *file_src, bool overwritte_remind)
{
//	UASSERT(file_dest != NULL && file_src != NULL);
	PC_FILE *pfile;

	is_copy_file = YES ;//置复制文件标准

	char dest_file[EMAXPATH];
	strcpy(dest_file, file_dest);
	char *pTemp = dest_file + strlen(dest_file) - 1;
	if(*pTemp != BACKSLASH) //如果路径的最后没有带\\,则加上。
		strcat(dest_file, STRBACKSLASH);
	
	pTemp = file_src + strlen(file_src);
	while(*pTemp != BACKSLASH)
		pTemp--;
	strcat(dest_file, &pTemp[1]); //在目标路径上添加源文件的文件名

	if(strcmp(dest_file, file_src) == 0)
	{//如果两个文件相同,则返回
		ReportError(ERR_CANT_DUP_SELF);
		return NO;
	}
	
	PCFD sorce_fd = NU_Open(file_src, PO_RDONLY, PS_IREAD);
	if(sorce_fd < 0 )
		return NO;


	PCFD dest_fd;
	if(overwritte_remind)
		dest_fd = NU_Open(dest_file, PO_CREAT|PO_WRONLY|PO_EXCL, PS_IWRITE);
	else
	{
		NU_Delete( dest_file );
		dest_fd = NU_Open(dest_file, PO_CREAT|PO_WRONLY, PS_IWRITE);
	}
	if(dest_fd < 0 )
	{
		NU_Close(sorce_fd);
		return NO;
	}

	const int len_pertime = 1024*64;//61440;新的文件系统支持的buffer长度没有限制
	ULONG total_size;
	int	 times, left, i;
	CHAR	*buffer = new CHAR[len_pertime];
	if( !buffer )
	{
		NU_Close(sorce_fd);
		NU_Close(dest_fd);
		NU_Delete(dest_file);//写文件失败则删除它。	
		return NO;
	}

 	if ((pfile = pc_fd2file(sorce_fd)) == NULL)
		goto ERROR;
    total_size = pfile->pobj->finode->fsize;
	
	if( file_dest[0] == 'A' )
	{
		//磁盘空间不够, 考虑到速度原因,对硬盘暂不检查
		if( fl_change_line(0) )
		{//更换了磁盘
			NU_Disk_Abort("A:");
			NU_Open_Disk("A:");
		}
		UINT8   sec_p_cluster;
		UINT16  byte_p_sec;
		UINT32  free_cluster;
		UINT32  total_cluster;
		if( NU_FreeSpace("A:", &sec_p_cluster, &byte_p_sec, &free_cluster, &total_cluster ) !=NU_SUCCESS )
			goto ERROR ;
		UINT32 left_space = sec_p_cluster * byte_p_sec * free_cluster ;
		if( left_space < (UINT32)total_size )
		{
			ReportError(ERR_DISK_FULL_NOASK);
			goto ERROR;
		}
	}

	times = total_size / len_pertime;
	left = total_size % len_pertime;
	for(i = 0; i < times; i++)
	{
		if(NU_Read(sorce_fd, buffer, len_pertime) != len_pertime)
			goto ERROR;
		if(NU_Write(dest_fd, buffer, len_pertime) != len_pertime)
			goto ERROR;
	}
	if(NU_Read(sorce_fd, buffer, left) != left)
		goto ERROR;
	if(NU_Write(dest_fd, buffer, left) != left)
		goto ERROR;

	delete [] buffer;
	NU_Close(sorce_fd);
	NU_Close(dest_fd);
	is_copy_file = NO;//清除复制文件标志
	return YES;
ERROR:
	delete [] buffer;
	NU_Close(sorce_fd);
	NU_Close(dest_fd);
	NU_Delete(dest_file);//写文件失败则删除它。
	is_copy_file = NO;//清除复制文件标志
	return NO;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -