Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567495
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 18:45:48

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) |
给主人留下些什么吧!~~