std::ofstream,写入前检查文件是否存在
我正在使用 C++ 在 Qt 应用程序中实现文件保存功能。
我正在寻找一种方法来检查所选文件在写入之前是否已存在,以便我可以向用户提示警告。
我正在使用 std::ofstream
并且我并不是在寻找 Boost 解决方案。
I am implementing file saving functionality within a Qt application using C++.
I am looking for a way to check to see if the selected file already exists before writing to it, so that I can prompt a warning to the user.
I am using an std::ofstream
and I am not looking for a Boost solution.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
文件存在功能
下面是我最喜欢的隐藏功能之一,我随身携带以供多种用途:
我发现此解决方案比在您不打算打开文件时尝试打开文件更有品味流入或流出它。
File Exists Function
Below is one of my favorite tuck-away functions I keep on hand for multiple uses:
I find this solution to be much more tasteful than trying to open a file when you don't intend to stream in or out of it.
我建议
ifstream::good()
以下是使用
fstream
成员函数的示例:该方法简短且可移植。当代码库很简单时,这是一个很好的解决方案(没有双关语)。
I suggest
ifstream::good()
Here is an example of what using the
fstream
member function looks like:The method is short and portable. When the code base is simple this is a good solution to use (no pun intended).
请注意,如果存在现有文件,这将以随机访问模式打开它。如果您愿意,可以关闭它并以追加模式或截断模式重新打开它。
Note that in case of an existing file, this will open it in random-access mode. If you prefer, you can close it and reopen it in append mode or truncate mode.
使用 C 的
std::filesystem::exists
++17:另请参阅
std::error_code
。如果您想检查要写入的路径是否实际上是常规文件,请使用 <代码>std::filesystem::is_regular_file。
With
std::filesystem::exists
of C++17:See also
std::error_code
.In case you want to check if the path you are writing to is actually a regular file, use
std::filesystem::is_regular_file
.尝试
::stat()
(在
中声明)Try
::stat()
(declared in<sys/stat.h>
)其中一种方法是执行
stat()
并检查errno
。示例代码如下所示:
这与流无关。如果您仍然喜欢使用
ofstream
检查,只需使用is_open()
检查。示例:
希望这会有所帮助。
谢谢!
One of the way would be to do
stat()
and check onerrno
.A sample code would look look this:
This works irrespective of the stream. If you still prefer to check using
ofstream
just check usingis_open()
.Example:
Hope this helps.
Thanks!