我必须开发一个应用程序来解析日志文件并将特定数据发送到服务器。它必须在 Linux 和 Windows 上运行。
当我想测试日志滚动系统(它将 .1 附加到名称后会创建一个同名的新系统)时,就会出现问题。在 Windows 上(尚未在 Linux 上测试)我无法重命名使用 std::ifstream() (独占访问?)打开的文件,即使我在“输入模式”(ios::in)下打开它。
是否有跨平台的方式以非独占的方式打开文件?
有没有一种方法以非独占方式打开文件,
是的,使用 Win32,将各种 FILE_SHARE_Xxxx 标志传递给 CreateFile。
是跨平台的吗?
不,它需要特定于平台的代码。
由于烦人的向后兼容性问题(DOS 应用程序是单任务的,假设没有任何东西可以从它们下面删除文件,即它们可以 fclose() 然后 fopen() 不会出现任何问题;Win16 保留了这个假设移植 DOS 应用程序更容易,Win32 保留了这个假设以使移植 Win16 应用程序更容易,这很糟糕),Windows 默认以独占方式打开文件。
底层操作系统基础设施支持删除/重命名打开的文件(尽管我相信它确实有内存映射文件无法删除的限制,我认为这不是 *nix 上的限制),但默认的打开语义不支持。
C++ 没有任何这些概念; C++操作环境与DOS操作环境非常相似——没有其他应用程序同时运行,因此不需要控制文件共享。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)