1 现象:问题描述
工作目录中的话单文件存在一定时间或达到一定大小时,需要被移动到发送目录中去。当工作目录与发送目录在同一磁盘分区上时,没有问题;但是当工作目录与发送目录在不同分区上时,文件移动过程中变小了,而且内容变乱了。
2 关键过程:根本原因分析
察看代码,移动文件的代码如下:
bool TBillWriter::FileMove(const char * pszSrc, const char * pszDst)
{
ACE_OS::last_error(0);
if (ACE_OS::rename(pszSrc, pszDst) != 0)
{
if (EXDEV == ACE_OS::last_error()) //要移動到不同分區
{
if (true == FileCopy(pszSrc, pszDst))
{
if (false == FileDel(pszSrc))
{
return false;
}
}
else
{
return false;
}
}
else
{
return false;
}
}
return true;
}
意思是说,同一分区上的文件移动直接使用rename函数,因为就相当于改名;而不同分区间的文件移动,采用先复制,再删除原始文件的方式。
问题现象是原始文件已被删,而复制文件内容不对,所以问题应该出在复制过程中。复制文件的函数如下:
bool TBillWriter::FileCopy(const char * pszSrc, const char * pszDst)
{
static const int FILE_BUFFER_SIZE = 4096;
char buffer[FILE_BUFFER_SIZE];
unsigned long ulBufRead, ulBufWrite, ulThisWrite;
FILE * fsrc = ::fopen(pszSrc, "rb"); //打开原始文件
if (NULL == fsrc)
{
return false;
}
FILE * fdst = ::fopen(pszDst, "wb"); //打开目标文件
if (NULL == fdst)
{
::fclose(fsrc);
return false;
}
while ((ulBufRead = ::fread(&buffer, FILE_BUFFER_SIZE, 1, fsrc)) != 0)
{
ulBufWrite = 0;
do
{
if (0 == (ulThisWrite = ::fwrite(&buffer + ulBufWrite,
ulBufRead, 1, fdst)))
{
::fclose(fsrc);
::fclose(fdst);
return false;
}
阅读(374) | 评论(0) | 转发(0) |