春暖花开
雪化了,花开了,春天来了
posts - 149,comments - 125,trackbacks - 0

昨天想做这么一个操作,就是将文件从一个文件夹拷贝到另一个文件夹中,同时删除源文件夹中的内容。想着挺简单的,于是就首先使用了MoveFile。
当目的文件夹中,不存在文件时,MoveFile成功。而当目的文件夹包含该文件时,MoveFile则调用不成功。他不支持覆盖。所以挪动文件,用MoveFile似乎不是首选。
此时,我想到的是DeleteAndRenameFile,
在SDK中解释到This function deletes the source file after it copies the content of the source file to the destination file. 拷贝源文件的内容到目的文件,然后删除源文件。看似符合要求,但是他要求调用该函数的时候目的文件必须存在。

这两个函数都不可行,结合起来到是不错的选择,可以满足要求。可惜我昨天没有这么想,昨天我想到了CopyFile。
CopyFile的原型是
BOOL CopyFile(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName,
  BOOL bFailIfExists
);

最后一个参数表示当目的文件已经存在的时候,CopyFile调用成功还是失败的操作。如果为False,就可以覆盖拷贝了。

于是我就自己写了一个CopyAndDel的小函数。先拷贝再删除原来的文件。删除文件的时候还需要考虑一下文件属性的问题。

BOOL CopyAndDel(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName)
{
    
if (CopyFile(lpExistingFileName, lpNewFileName, FALSE))
    
{
        
if (!DeleteFile(lpExistingFileName))
        
{
            SetFileAttributes(lpExistingFileName, FILE_ATTRIBUTE_NORMAL);
            
return DeleteFile(lpExistingFileName);
        }

        
return TRUE;
    }

    
return FALSE;
}


这个小函数的缺陷在于还需要考虑删除文件的属性问题。似乎利用MoveFile和DeleteAndRenameFile组合更好一些。

这里总结一下:
MoveFile 重命名一个文件或目录,包括它所有的孩子。可对文件夹进行操作。不过需要保证的是新文件或新文件夹不存在,否则调用失败。
DeleteAndRenameFile 当拷贝源文件的内容到目的文件后,删除源文件。需要保证目的文件在调用前已经存在。
CopyFile 拷贝一个已经存在的文件,并生成一个新的文件。不能对文件夹进行操作。
DeleteFile 删除一个文件。不能删除文件夹。该函数删除失败的时候,考虑一下文件的属性问题。
RemoveDirectory 删除一个空的文件夹。

 

posted on 2009-09-17 09:38 Sandy 阅读(7299) 评论(3)  编辑 收藏 引用 所属分类: Windows Mobile

FeedBack:
# 不同见解
2011-04-19 15:53 |
如果在同一块硬盘上,MoveFile的效率高很多,只是改个文件名而已,这种情况下,如果先复制新文件再删除旧文件,文件太大的话速度就上不去了。  回复  更多评论
  
# re: MoveFile、CopyFile和DeleteAndRenameFile
2012-04-10 10:19 | 1111
我就是要找"剪切"功能,而很多人给出的是"复制后再删除",Windows系统还是很智能的,如果是在一个驱动器里剪切,系统只做了更改那个文件的所在位置,物理上并没有移动文件的位置,而复制后再删除,是重写硬盘上一段数据,浪费效率!  回复  更多评论
  
# re: MoveFile、CopyFile和DeleteAndRenameFile[未登录]
2012-12-21 20:02 | riverqh
其实可以试试SHFileOperation这个API。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理