📄 duplicatfile.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 + -