CDiskObject: 简化常见的磁盘操作






4.85/5 (52投票s)
用于常见目录和文件列表操作的类。
- 下载源代码文件 - 9.53 Kb
- 下载类参考 - 3.86 Kb
- 下载演示二进制文件 - 15.7 Kb
- 下载演示源代码 - 30.7 Kb
- 下载演示参考 - 22.1 Kb
- 下载CodeWarrior演示源代码 - 35.2 Kb
- 下载非MFC源代码 - 10 Kb
- 下载控制台应用程序测试源代码 - 34.3 Kb

引言
一些常见的磁盘操作在代码中实现起来非常繁琐:从目录获取所有CPP文件的列表,获取目录子树中的文件列表,复制目录子树,或获取子树中的所有EXE文件。CDiskObject简化了其中一些常见操作。
使用代码
该类非常易于使用。实例化一个CDiskObject,然后调用即可!如果构造函数使用CWnd指针调用,则指向的窗口将用于反馈。反馈通常是处理过的文件或目录,以及错误消息。
函数成功时返回TRUE。否则,可以调用GetErrorMessage来获取错误消息,但FileExists函数除外,该函数在文件不存在时返回FALSE,这是一种相当正常的情况。
公共函数是:
文件
- BOOL FileExists( CString file )- 如果文件“ - file”存在,则返回- TRUE。
- BOOL CreateFile( CString file )- 创建空文件“ - file”。如果“- file”包含一个不存在的子目录,它将被创建。
- BOOL CopyFile( CString sourceFile, CString destDirectory )- 将“ - sourceFile”复制到“- destDirectory”。如果“- destDirectory”不存在,将被创建。
- BOOL CopyFiles( CString sourceDirectory, CString destDirectory)- 将“ - sourceDirectory”中的所有文件复制到“- destDirectory”。不复制子目录(使用下面描述的- CopyDirectory进行此操作)。如果“- destDirectory”不存在,将被创建。
- BOOL CopyFiles( CStringArray& files, CString destDirectory)- 将“ - files”中的文件复制到“- destDirectory”。“- files”中的文件名必须是完全限定的,或者将从当前目录复制。“- destDirectory”将会在不存在时被创建。
目录
- BOOL CreateDirectory( CString directory )- 创建“ - directory”。子目录也将被创建。
- BOOL CopyDirectory( CString sourceDirectory, CString destDirectory)- 将“ - sourceDirectory”的内容复制到“- destDirectory”。不复制子目录。
- BOOL EmptyDirectory( CString directory )- 删除“ - directory”中的所有文件。不删除子目录。
- BOOL RemoveDirectory( CString directory )- 即使目录不为空,也会删除“ - directory”。不会删除子目录。
- BOOL CopyDirectories( CString sourceDirectory, CString destDirectory)- 将“ - sourceDirectory”的内容复制到“- destDirectory”。子目录也将被复制。
- BOOL EmptyDirectories( CString directory )- 删除“ - directory”中的所有文件。子目录也将被清空。
- BOOL RemoveDirectories( CString directory )- 即使目录不为空,也会删除“ - directory”。也会删除子目录。
枚举
- BOOL EnumDirectories( CString sourceDirectory, CStringArray& directories )- 在“ - directories”中返回“- sourceDirectory”的所有子目录列表。不会枚举子目录。
- BOOL EnumFilesInDirectoryWithFilter( CString filter, CString sourceDirectory, CStringArray& files, int mode = EF_ONLY_FILENAMES)- 在“ - files”中返回“- sourceDirectory”中与“- filter”匹配的所有文件列表。如果模式为- EF_ONLY_FILENAMES(默认),则只返回文件名。如果模式为- EF_FULLY_QUALIFIED,则文件名将包含完整路径。不会搜索子目录。
- BOOL EnumFilesInDirectory( CString sourceDirectory, CStringArray& files, int mode = EF_ONLY_FILENAMES )- 在“ - files”中返回“- sourceDirectory”的所有文件列表。如果模式为- EF_ONLY_FILENAMES(默认),则只返回文件名。如果模式为- EF_FULLY_QUALIFIED,则文件名将包含完整路径。
- BOOL EnumAllFiles( CString sourceDirectory, CStringArray& files )- 在“ - files”中返回“- sourceDirectory”的所有文件列表。文件名将包含完整路径。也会搜索子目录。
- BOOL EnumAllFilesWithFilter( CString filter, CString sourceDirectory, CStringArray& files )- 在“ - files”中返回“- sourceDirectory”中与“- filter”匹配的所有文件列表。文件名将包含完整路径。也会搜索子目录。
错误处理
- CString GetErrorMessage()- 发生错误时返回错误字符串。如果构造函数中提供了反馈窗口,错误消息也将在那里显示。 
有关其他信息,请参阅可下载的文档。
关注点
首先,一个警告。删除目录子树可不是闹着玩的;如果真的发生了,被删除的不是预期的子树。请小心!
其次,再次发出同样的警告。如果EmtpyDirectories或RemoveDirectories意外指向了您不希望删除的目录,您将会非常、非常不开心。
这个类本应是一组静态函数,但出于各种原因,我希望为每个对象保留一个单独的错误字符串。我曾尝试过一个版本,增加了更多数据成员,如源目录、目标目录、源文件,以及这些成员的访问器,从而减少了操作的in参数数量。这在纸面上看起来更好。但在实际使用中,该类变得更难用,而不是更容易。我需要调用几个函数来设置类,然后应用操作。比起调用一个单独的函数,更容易出错的是调用四个函数中的一个...
历史
- 黑暗时代 
初始版本。 
- 14/4 2004 
是时候更新了。已添加以下内容: - 为in参数添加了const正确性。尽管CString会被复制,而且如今多兆系统的系统几乎不会注意到多几个字符串,但在const正确性环境中,该类将难以使用。这违背了初衷...
- 在限定文件名/目录时,将“/”替换为“\”。一位老DOS老兵的耻辱性疏忽。
- 添加了pragma以消除C4706赋值警告。禁用pragma警告并非最佳实践,但为了进行测试而编写额外的代码也并非如此。我不认为我的计算机很快会用完字母,但即便如此,额外的代码行也会累积,而大量的赋值代码可能会分散对代码更重要部分的注意力。然而,这是一个棘手的问题,涉及可读性、可维护性等。最后,这是个人偏好的问题。免费源代码的好处在于,如果您不喜欢,可以重写它!
- 出于对称性,添加了RemoveFile。API已经有一个::DeleteFile,但添加一个包装函数很简单,为什么不呢?
 
- 为
- 15/5 2004 
添加了一个演示项目。演示项目仅仅如此,它是一个演示(见图),并没有试图编写一个Explorer的替代品 :-) 请注意,该应用程序将移动和删除目录,并且无法撤销删除目录分支。所以请务必小心,我自己在做一个演示项目时已经有很多疑虑了——我是否能承受有人无意中删除了重要文件?我想我必须这样做,但您已经被警告过了。警告,警告。两次。 
- 24/6 2004 
迟来已久,又一次更新。根据**Amit Pitaru**的反馈,我添加了一个默认构造函数,因为CodeWarrior会抱怨。Amit还创建了CodeWarrior版本的演示项目(包含在下载文件中)。这就是社区精神——非常感谢他的帮助!很容易忘记MFC可以在其他环境中使用。 最后,我为类和演示项目都包含了一个HTML文档。 
- 6/8 2004 
- 向SetSystemErrorMessage的默认参数添加了_T()宏**(nuhi)**。
- 将驱动器缓冲区的大小从_MAX_DRIVE更改为_MAX_PATH**(jkaspzyk)**。
 
- 向
- 25/3 2005 
在小型演示应用程序的列表框中添加了浏览按钮**(WREY)**。这允许例如连接到其他计算机运行。 
- 17/4 2005 
**Allen Rossouw**向类添加了一些很好的改进: - EnumFilesInDirectoryWithFilter按字母顺序返回文件列表。
- 添加了DirectoryExists,如果给定目录存在,则返回TRUE。
- 添加了一个允许复制到文件(并重命名)的CopyFile版本。
- 添加了FileInformation,返回给定文件的BY_HANDLE_FILE_INFORMATION。
 非常**感谢**Allen的帮助! 
- 15/5 2005 
一次bug修复,这次还有两个新成员 - 修正了在CopyFile中使用错误变量的bug**(Lorenzo H. Martín)**。
- 添加了RenameFile**(Lorenzo H. Martín)**。
- 添加了MoveFile。
 
- 修正了在
- 19/6 2005 
- 添加了一个非MFC版本的类,名为CStdDiskObject。该类使用std::string/std::wstring和std::vector代替Cstring和CStringArray,并使用C运行时文件处理函数代替Windows API版本。这一切都要感谢**Webdude**,David Mackay,他让我开始了这项工作,并提供了测试协助。我包含了他的测试文件,该文件将在控制台应用程序中展示许多函数的用法。注意:本次更新仅更新了源代码Zip文件,未更新演示应用程序、文档或其他内容。 
 
- 添加了一个非MFC版本的类,名为
- 16/7 2006 
- 无数小的更正,以及**非常感谢**所有在此处贡献报告的人,以及无与伦比的Webdude。Webdude是为非MFC版本的项目制作的可爱的小测试应用程序的开发者。
 
- 1/10 2006 
- 一些bug修复(尤其是在创建目录功能方面)。
 


