声明:本文整理自Ai工具辅助生成的内容,仅供参考
想用wxWidgets开发一个项目,没有参考手册将是寸步难行的,本系列文章借助Ai技术的力量快速制成参考手册,弥补参考资料的不足。
>> wxFileName类详解
1. wxFileName类概述
wxFileName是wxWidgets框架中用于处理文件名和文件路径的类,它提供了跨平台的文件名和路径操作功能。wxFileName不仅可以表示文件名,还可以处理文件路径的各个组成部分,如目录、扩展名等,并提供了丰富的文件系统操作功能。
2. 主要功能和特点
- 跨平台路径处理(Windows/Unix/Mac)
- 路径规范化处理
- 文件系统操作(创建、删除、重命名等)
- 路径组件分解和操作
- 相对路径和绝对路径转换
- 符号链接处理
3. 构造函数
// 默认构造函数
wxFileName();
// 从完整路径构造
wxFileName(const wxString& fullpath, wxPathFormat format = wxPATH_NATIVE);
// 从目录和文件名构造
wxFileName(const wxString& path, const wxString& name, wxPathFormat format = wxPATH_NATIVE);
// 从目录、文件名和扩展名构造
wxFileName(const wxString& path, const wxString& name, const wxString& ext, wxPathFormat format = wxPATH_NATIVE);
4. 常用成员函数
4.1 路径操作
// 获取完整路径
wxString GetFullPath(wxPathFormat format = wxPATH_NATIVE) const;
// 设置完整路径
void Assign(const wxString& fullpath, wxPathFormat format = wxPATH_NATIVE);
// 获取目录部分
wxString GetPath(wxPathFormat format = wxPATH_NATIVE, int flags = wxPATH_GET_VOLUME) const;
// 获取文件名部分(含扩展名)
wxString GetFullName() const;
// 获取文件名(不含扩展名)
wxString GetName() const;
// 获取扩展名
wxString GetExt() const;
// 判断是否为绝对路径
bool IsAbsolute(wxPathFormat format = wxPATH_NATIVE) const;
// 转换为绝对路径
wxFileName MakeAbsolute(const wxString& cwd = wxEmptyString, wxPathFormat format = wxPATH_NATIVE);
// 转换为相对路径
wxFileName MakeRelativeTo(const wxString& pathBase = wxEmptyString, wxPathFormat format = wxPATH_NATIVE);
4.2 文件系统操作
// 检查文件是否存在
bool FileExists() const;
// 检查目录是否存在
bool DirExists() const;
// 创建目录(可递归创建)
bool Mkdir(int perm = wxS_DIR_DEFAULT, int flags = 0) const;
// 删除文件
bool DeleteFile() const;
// 删除目录
bool Rmdir(int flags = 0) const;
// 重命名文件或目录
bool Rename(const wxString& newname, bool overwrite = false);
// 获取文件大小
wxFileOffset GetSize() const;
// 获取文件修改时间
wxDateTime GetModificationTime() const;
4.3 路径组件操作
// 设置目录部分
void SetPath(const wxString& path, wxPathFormat format = wxPATH_NATIVE);
// 设置文件名部分
void SetName(const wxString& name);
// 设置扩展名部分
void SetExt(const wxString& ext);
// 追加目录组件
void AppendDir(const wxString& dir);
// 移除最后一个目录组件
void RemoveLastDir();
// 获取目录组件数量
size_t GetDirCount() const;
// 获取指定位置的目录组件
wxString GetDirs() const;
5. 静态工具函数
// 获取当前工作目录
static wxFileName GetCwd();
// 设置当前工作目录
static bool SetCwd(const wxString& cwd);
// 创建临时文件名
static wxFileName CreateTempFileName(const wxString& prefix, wxFile* fileTemp = NULL);
// 路径规范化
static wxString Normalize(const wxString& path, wxPathFormat format = wxPATH_NATIVE, const wxString& cwd = wxEmptyString, int flags = 0);
6. 实际应用示例
6.1 基本使用示例
// 创建wxFileName对象
wxFileName file("C:\\MyDocs\\report.txt");
// 获取各部分信息
wxLogMessage("Full path: %s", file.GetFullPath());
wxLogMessage("Directory: %s", file.GetPath());
wxLogMessage("Filename: %s", file.GetName());
wxLogMessage("Extension: %s", file.GetExt());
// 修改各部分
file.SetPath("D:\\NewDocs");
file.SetName("summary");
file.SetExt("doc");
wxLogMessage("New path: %s", file.GetFullPath());
6.2 文件操作示例
wxFileName file("data/output.txt");
// 确保目录存在
if (!file.DirExists()) {
if (!file.Mkdir(wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL)) {
wxLogError("Failed to create directory!");
return;
}
}
// 检查文件是否存在
if (file.FileExists()) {
wxLogMessage("File size: %lld bytes", file.GetSize());
// 备份文件
wxFileName backup(file);
backup.SetName(file.GetName() + "_backup");
if (!file.Copy(backup.GetFullPath())) {
wxLogError("Failed to create backup!");
}
} else {
// 创建新文件
wxFile f(file.GetFullPath(), wxFile::write);
if (f.IsOpened()) {
f.Write("Initial content\n");
f.Close();
}
}
6.3 路径操作示例
// 相对路径转换
wxFileName absPath("/usr/local/bin/program");
wxFileName relPath = absPath.MakeRelativeTo("/usr");
wxLogMessage("Relative path: %s", relPath.GetFullPath()); // 输出: local/bin/program
// 路径规范化
wxString normalized = wxFileName::Normalize("C:\\MyDocs\\..\\Temp\\file.txt");
wxLogMessage("Normalized path: %s", normalized); // 输出: C:\Temp\file.txt
// 获取临时文件名
wxFileName tempFile = wxFileName::CreateTempFileName("myprefix");
if (tempFile.IsOk()) {
wxLogMessage("Temporary file: %s", tempFile.GetFullPath());
tempFile.DeleteFile(); // 使用后删除
}
7. 跨平台注意事项
wxFileName在不同平台下会自动处理路径格式差异:
- Windows: 使用反斜杠(
\)和驱动器号(C:) - Unix/Linux: 使用正斜杠(
/) - Mac OS X: 类似Unix风格
可以使用wxPATH_UNIX, wxPATH_WIN, wxPATH_MAC或wxPATH_NATIVE来指定路径格式。
8. 高级用法
8.1 遍历目录
wxFileName dir("/path/to/directory");
if (dir.DirExists()) {
wxDir d(dir.GetFullPath());
wxString filename;
bool cont = d.GetFirst(&filename);
while (cont) {
wxFileName file(dir.GetFullPath(), filename);
wxLogMessage("Found: %s, size: %lld",
file.GetFullName(),
file.GetSize());
cont = d.GetNext(&filename);
}
}
8.2 符号链接处理
wxFileName file("/path/to/link");
if (file.IsLink()) {
wxFileName target;
if (file.GetLinkedFile(&target)) {
wxLogMessage("Link %s points to %s",
file.GetFullPath(),
target.GetFullPath());
}
}
8.3 路径比较
wxFileName file1("/path/to/file");
wxFileName file2("./file");
// 规范化后比较
if (file1.GetFullPath() == file2.MakeAbsolute().GetFullPath()) {
wxLogMessage("Paths refer to the same file");
}
9. 性能考虑
- 频繁的文件系统操作(如Exists()、GetSize()等)会影响性能
- 对于批量操作,考虑缓存结果
- 路径规范化操作可能涉及磁盘访问
10. 错误处理
wxFileName的许多操作返回bool值表示成功或失败,可以使用wxLogSysError获取系统错误信息:
wxFileName file("/invalid/path");
if (!file.Mkdir()) {
wxLogSysError("Failed to create directory %s", file.GetPath());
}
>> wxFileName 文件系统操作详解
wxFileName 类提供了丰富的成员函数来进行文件系统操作,这些操作都是跨平台的,可以在不同操作系统上保持行为一致。下面我将详细介绍如何使用 wxFileName 进行各种文件系统操作。
1. 文件/目录存在性检查
1.1 检查文件是否存在
wxFileName file("C:/path/to/file.txt");
if (file.FileExists()) {
wxLogMessage("文件存在");
} else {
wxLogMessage("文件不存在");
}
1.2 检查目录是否存在
wxFileName dir("C:/path/to/directory");
if (dir.DirExists()) {
wxLogMessage("目录存在");
} else {
wxLogMessage("目录不存在");
}
2. 目录操作
2.1 创建目录
wxFileName newDir("C:/new/directory");
// 创建单级目录
if (newDir.Mkdir()) {
wxLogMessage("目录创建成功");
} else {
wxLogError("目录创建失败");
}
// 递归创建多级目录
if (newDir.Mkdir(wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL)) {
wxLogMessage("多级目录创建成功");
}
参数说明:
- 第一个参数:权限设置(Unix风格权限,Windows忽略)
- 第二个参数:标志位,
wxPATH_MKDIR_FULL表示递归创建
2.2 删除目录
wxFileName dirToRemove("C:/path/to/remove");
// 删除空目录
if (dirToRemove.Rmdir()) {
wxLogMessage("目录删除成功");
}
// 强制删除非空目录(需要额外实现)
if (RemoveDirectoryRecursively(dirToRemove)) {
wxLogMessage("非空目录删除成功");
}
注意:wxWidgets本身不提供递归删除目录的功能,需要自行实现:
bool RemoveDirectoryRecursively(const wxFileName& dir) {
wxDir d(dir.GetFullPath());
wxString filename;
bool cont = d.GetFirst(&filename);
while (cont) {
wxFileName fn(dir.GetFullPath(), filename);
if (fn.IsDir()) {
if (!RemoveDirectoryRecursively(fn)) return false;
} else {
if (!fn.DeleteFile()) return false;
}
cont = d.GetNext(&filename);
}
return dir.Rmdir();
}
3. 文件操作
3.1 创建文件
wxFileName newFile("C:/path/to/newfile.txt");
// 创建空文件
wxFile file(newFile.GetFullPath(), wxFile::write);
if (file.IsOpened()) {
file.Close();
wxLogMessage("文件创建成功");
}
3.2 删除文件
wxFileName fileToDelete("C:/path/to/delete.txt");
if (fileToDelete.DeleteFile()) {
wxLogMessage("文件删除成功");
} else {
wxLogError("文件删除失败");
}
3.3 重命名/移动文件
wxFileName oldFile("C:/path/to/oldname.txt");
wxFileName newFile("C:/path/to/newname.txt");
if (oldFile.Rename(newFile.GetFullPath())) {
wxLogMessage("重命名成功");
}
// 移动文件(实际就是跨目录重命名)
wxFileName movedFile("C:/newpath/to/newname.txt");
if (oldFile.Rename(movedFile.GetFullPath())) {
wxLogMessage("文件移动成功");
}
3.4 复制文件
wxFileName source("C:/path/to/source.txt");
wxFileName dest("C:/path/to/dest.txt");
if (source.Copy(dest.GetFullPath())) {
wxLogMessage("文件复制成功");
}
4. 文件属性操作
4.1 获取文件大小
wxFileName file("C:/path/to/file.txt");
if (file.FileExists()) {
wxFileOffset size = file.GetSize();
wxLogMessage("文件大小: %lld 字节", size);
}
4.2 获取文件时间信息
wxFileName file("C:/path/to/file.txt");
// 获取修改时间
wxDateTime modTime = file.GetModificationTime();
if (modTime.IsValid()) {
wxLogMessage("最后修改时间: %s", modTime.Format());
}
// 获取访问时间
wxDateTime accTime = file.GetAccessTime();
if (accTime.IsValid()) {
wxLogMessage("最后访问时间: %s", accTime.Format());
}
// 获取创建时间
wxDateTime crTime = file.GetCreationTime();
if (crTime.IsValid()) {
wxLogMessage("创建时间: %s", crTime.Format());
}
4.3 设置文件时间
wxFileName file("C:/path/to/file.txt");
wxDateTime newTime = wxDateTime::Now();
// 设置修改时间
if (file.SetTimes(&newTime, NULL, NULL)) {
wxLogMessage("修改时间更新成功");
}
5. 符号链接操作
5.1 检查是否为符号链接
wxFileName file("C:/path/to/link");
if (file.IsLink()) {
wxLogMessage("这是一个符号链接");
}
5.2 获取符号链接目标
wxFileName link("C:/path/to/link");
wxFileName target;
if (link.GetLinkedFile(&target)) {
wxLogMessage("链接指向: %s", target.GetFullPath());
}
5.3 创建符号链接
wxFileName target("C:/path/to/target");
wxFileName link("C:/path/to/link");
if (target.CreateLink(link.GetFullPath())) {
wxLogMessage("符号链接创建成功");
}
6. 实用操作组合
6.1 确保文件目录存在
wxFileName file("C:/path/to/some/deep/file.txt");
// 确保文件所在目录存在
if (!file.DirExists()) {
if (!file.Mkdir(wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL)) {
wxLogError("无法创建目录路径");
return false;
}
}
6.2 获取目录下文件列表
wxFileName dir("C:/path/to/directory");
if (dir.DirExists()) {
wxArrayString files;
wxDir::GetAllFiles(dir.GetFullPath(), &files);
for (size_t i = 0; i < files.GetCount(); i++) {
wxLogMessage("找到文件: %s", files[i]);
}
}
6.3 文件路径操作链式调用
wxFileName file;
file.SetPath("C:/path/to")
.SetName("document")
.SetExt("txt")
.AppendDir("subdir")
.Normalize();
wxLogMessage("最终路径: %s", file.GetFullPath());
7. 错误处理最佳实践
建议对重要的文件系统操作进行错误检查:
wxFileName importantFile("C:/important/data.txt");
if (!importantFile.FileExists()) {
wxLogError("重要文件不存在: %s", importantFile.GetFullPath());
return false;
}
if (!importantFile.Copy("C:/backup/data_backup.txt")) {
wxLogSysError("无法创建备份文件");
return false;
}
总结
wxFileName 提供了完整的文件系统操作接口,包括:
- 文件和目录的存在性检查
- 目录的创建和删除
- 文件的创建、删除、重命名和复制
- 文件属性的获取和设置
- 符号链接操作
- 各种实用组合操作
这些操作都是跨平台的,在Windows、Linux和macOS上表现一致。使用wxFileName而不是直接使用平台特定的API,可以大大提高代码的可移植性。

618

被折叠的 条评论
为什么被折叠?



