【问题标题】:Qt C++: Moving a file, source and destination paths are on different drivesQt C++:移动文件,源路径和目标路径在不同的驱动器上
【发布时间】:2013-08-28 16:05:04
【问题描述】:

我想在 C++ 中将文件从文件夹(例如驱​​动器 C)移动到另一个文件夹(例如驱​​动器 D)。如果该文件已存在于目标文件夹中,则应覆盖该文件。如何使用 C++ 标准库或 Qt 实现它?

我找到了“重命名”方法,但如果路径位于不同的驱动器上,我不确定它是否会起作用。另外,平台依赖是什么?

【问题讨论】:

  • 我的回答有效吗? :)
  • Qt doc 说 "(bool QFile::rename(const QString & newName)) 如果重命名操作失败,Qt 将尝试将此文件的内容复制到 newName,然后删除此文件,只保留newName.",所以我认为如果驱动器不同,它应该可以工作。

标签: c++ qt file


【解决方案1】:

只需使用QFile::rename()。对于大多数目的,它应该做大约正确的事情。我认为 C++ 标准库没有跨文件系统重命名调用(如果我错了,请在 cmets 中纠正我!),std::rename 只能在单个文件系统内移动。

但是,通常这里唯一(相关)的原子文件操作是在同一文件系统内重命名,其中不涉及文件内容,仅更改目录信息。我不知道支持这个的 C++ 库,所以这里是粗略的伪代码:

if basic rename succeeds
   you're done
else if not moving between file systems (or just folders for simplicity)
   rename failed
else
   try
     create temporary file name on target file system using a proper system call
     copy contents of the file to the temporary file
     rename temporary file to new name, possibly overwriting old file
     remove original file
   catch error
     remove temporary file if it exists
     rename failed

这样做可以确保新位置的文件立即显示为整个文件,最坏的故障模式涉及复制文件而不是移动。

【讨论】:

  • 考虑到 Windows 驱动器号,最好遵循MSDN:“新名称不能是现有文件或目录的名称。您可以使用rename 移动一个通过在 newname 参数中提供不同的路径,将文件从一个 [...] 设备转移到另一个设备。但是,您不能使用 rename 移动目录。"
  • 只是出于好奇,如果目标目录位于已安装的驱动器上,它会起作用吗?我没有资源来验证它:(。
  • @nik_kgp 经过一番研究,看起来 Windows 上的原子文件操作是一个相当复杂(或不可能,尤其是在 Vista 之前的 Windows 版本上)的主题,甚至比 Posix 上的还要复杂。所以一般的解决方法是不用管它,只要检查错误并酌情报告即可。无论如何,依赖确切的文件系统状态是个坏主意,因为其他一些程序可能会同时修改它。关于已安装的驱动器,用户可以随时卸载它(或者如果是外部驱动器,只需拔出电缆)。所以只需使用QFile::rename 并检查返回码。
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多