微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++:以非独占模式打开文件

我必须开发一个应用程序来分析日志文件并将特定的数据发送到服务器。 它必须在Linux和Windows上运行。

当我想testing日志滚动系统(附加了.1到名称相同的名称创build一个新的)时出现问题。 在Windows上(还没有在Linux上testing过),我不能重命名我用std :: ifstream()(独占访问?)打开的文件,即使我在“input模式”(ios :: in) 。

有没有一个跨平台的方式来打开非排他性的文件

即使文件不可读,Java – file.length()也会返回

在Windows上不断删除超过X小时的文件,最有效的方法是什么?

文件path和随机访问的压缩数组

在不使用scandir()或readdir的情况下映射文件系统

用Java获取Windows中的唯一文件ID?

ZwQueryDirectoryFile恢复

在Windows上,如何限制只有一些应用程序(不是用户)访问文件夹,子文件夹和文件

IOzone输出中的“Min xfer”和“throughput”的含义是什么?

如何检测磁盘满错误并让程序在获得可用磁盘空间后恢复

程序closures后文件能够locking多长时间?

有没有办法以非专有的方式打开文件

是的,使用Win32,将各种FILE_SHARE_Xxxx标志传递给CreateFile。

它是跨平台吗?

不,它需要特定于平台的代码

由于恼人的向后兼容性问题(DOS应用程序,单任务,假设没有任何东西可以从它们下面删除一个文件,也就是说,它们可以在没有任何问题的情况下进行fclose()和fopen(); Win16保留了这个假设移植DOS应用程序更容易,Win32保留了这个假设,使移植Win16应用程序变得更容易,而且很糟糕),Windows认只打开文件

底层的操作系统基础结构支持删除/重命名打开的文件(虽然我相信它确实有限制,内存映射文件不能被删除,我认为这不是在* nix上发现的限制),但认的开放语义不。

C ++没有任何这个概念; C ++的运行环境与DOS操作环境大致相同 – 没有其他应用程序同时运行,因此不需要控制文件共享。

这不是需要独占模式的读取操作,而是重命名,因为这与将文件移动到新位置基本相同。

我不确定,但我不认为这是可以做到的。 请尝试复制该文件,然后在不再读取旧文件删除/替换旧文件

Win32文件系统语义要求重命名文件重命名时不能打开(在任何模式下)。 您将需要关闭文件重命名它,然后创建新的日志文件

Unix文件系统语义允许你重命名一个打开的文件,因为文件名只是一个指向inode的指针。

如果你只是从文件中读取,我知道它可以完成与Windows API CreateFile。 只需指定FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE作为dwShareMode的输入。

不幸的是,这不是跨平台的。 但是Linux可能有类似的东西。

有关CreateFile的更多信息,请参阅msdn 。

编辑:只是一个关于格雷格Hewgill评论快速说明。 我刚刚测试了FILE_SHARE *的东西(也是100%肯定)。 如果打开只读并指定FILE_SHARE *参数,则可以在Windows中删除重命名文件

我会确保你不要打开文件。 这会导致怪异的东西,如果你的应用程序崩溃的例子。 我会做什么:

摘要(读/写/滚动到一个新的文件)到一个类,并安排关闭文件,当你想翻到一个新的类。 (这是最简单的方法,既然你已经有翻阅的代码,那么你已经到了一半了。)

如果您必须拥有多个读/写访问点,需要fstream的所有功能,而不想将其写入完整的封装器,那么唯一可以想到的跨平台解决方案就是在不需要的时候关闭文件,并且在放弃之前需要翻阅时,翻阅代码尝试获得对文件的独占访问。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐