65.9K
CodeProject 正在变化。 阅读更多。
Home

CDiskObject: 简化常见的磁盘操作

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (52投票s)

2004年3月14日

公共领域

7分钟阅读

viewsIcon

237069

downloadIcon

13798

用于常见目录和文件列表操作的类。

Sample Image - diskobject.gif

引言

一些常见的磁盘操作在代码中实现起来非常繁琐:从目录获取所有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()

    发生错误时返回错误字符串。如果构造函数中提供了反馈窗口,错误消息也将在那里显示。

有关其他信息,请参阅可下载的文档。

关注点

首先,一个警告。删除目录子树可不是闹着玩的;如果真的发生了,被删除的不是预期的子树。请小心!

其次,再次发出同样的警告。如果EmtpyDirectoriesRemoveDirectories意外指向了您不希望删除的目录,您将会非常、非常不开心。

这个类本应是一组静态函数,但出于各种原因,我希望为每个对象保留一个单独的错误字符串。我曾尝试过一个版本,增加了更多数据成员,如源目录、目标目录、源文件,以及这些成员的访问器,从而减少了操作的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::wstringstd::vector代替CstringCStringArray,并使用C运行时文件处理函数代替Windows API版本。这一切都要感谢**Webdude**,David Mackay,他让我开始了这项工作,并提供了测试协助。我包含了他的测试文件,该文件将在控制台应用程序中展示许多函数的用法。

      注意:本次更新仅更新了源代码Zip文件,未更新演示应用程序、文档或其他内容。

  • 16/7 2006
    • 无数小的更正,以及**非常感谢**所有在此处贡献报告的人,以及无与伦比的Webdude。Webdude是为非MFC版本的项目制作的可爱的小测试应用程序的开发者。
  • 1/10 2006
    • 一些bug修复(尤其是在创建目录功能方面)。
© . All rights reserved.