C - 将一大组文件存储为单个资源

标签 c linux file

如果这个问题有明显的答案,请原谅我;我还没有找到它,因为我不完全确定我在找什么。这很可能重复了我没有找到的问题;对不起。

我有一个使用文本、音频、视频、图标和各种不同文件类型的 C 可执行文件。这些文件存储在本地;文件夹结构又大又深,需要与应用程序一起安装才能正常运行(并不是说我预计它会被分发,我希望打包我自己的工作以方便使用)。

在我看来,如果文件库存储在应用程序仍然可以访问的单个文件中会更方便,例如与 /usr/bin/APPLICATION 一起或在最合适的位置;在需要时由可执行文件访问。

我搜索了类似的问题并找到了指示两个可能选项的建议 Resource Files 似乎是 Windows 原生的, Including files at compile 。第一个问题的答案类似于第二个问题,但没有回答与 linux 可执行文件的资源文件是否存在相关的问题。它(与第二个一样)着眼于在编译过程中包含数据文件。这不是很有用,好像我只想更新我的资源我被迫重新编译整个应用程序(媒体是动态添加的)。

问题:有没有一种方法可以将多种文件类型存储在一个文件中,以供 Linux 中的可执行文件访问?如果可以,您将如何实现?

我最初的想法是创建一个 .zip.gz 文件,它也可能提供压缩作为额外的好处,但我不知道如何(或者如果甚至有可能)即时访问此类文件中的数据。我同样不确定是否有特定的文件类型或库提供了更合适的解决方案。此外,我对 .dat 文件几乎一无所知,这些文件可以在 linux 系统的上下文中使用吗?

最佳答案

我完全不明白您为什么要使用单个文件。考虑到文件提取的复杂性(以及出现错误的可能性增加)和相关的开销,我看不出它会如何“更方便”。

I have a C executable that uses text, audio, video, icons and a variety of different file types.

许多其他 Linux 应用程序也是如此。使用包管理时,通常的方法是将应用程序 /usr/bin/YOURAPP 的体系结构独立数据(图标、音频、视频等)放在 /usr/share 中/YOURAPP/,以及 /usr/lib/YOURAPP 中依赖于体系结构的数据(如辅助二进制文件)。后两者是完整的目录树是非常常见的,有时非常深和宽。

对于本地编译的东西,通常将它们放在 /usr/local/bin/YOURAPP/usr/local/share/YOURAPP//usr/local/share/YOURAPP/,只是为了避免混淆包管理器。 (如果您检查 ./configure 脚本或阅读 Makefile,这是它们支持的 PREFIX 变量的主要目的。)

/usr/bin/YOURAPP 也很常见是一个简单的 shell 脚本,设置环境变量,或检查用户特定的覆盖(来自 $HOME/.YOURAPP/), 以 exec/usr/lib/YOURAPP/YOURAPP.bin [parameters...] 结尾,它用实际的二进制可执行文件替换 shell,而不会将 shell 留在内存中.

例如,我机器上的 /usr/share/octave/ 总共包含 138 个目录(在最多 7 个目录的层次结构中)和 1463 个文件;全部讲述了大约 10 兆字节的“内容”。 LibreOffice、Eagle、Fritzing 和 KiCAD 每个都占用数百兆字节,因此 Octave 在任何方面都不是一个极端的例子。

关于C - 将一大组文件存储为单个资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32150529/

相关文章:

linux - Windows 命令行中 $USER 的等效命令

java - canRead() 和 canWrite() 都返回 false

c - 如何在C中将文本文件读取为矩阵形式

ruby - 将 Ruby 脚本从 Linux 盒子发送到远程 mac mini 以打开和关闭应用程序

c++ - 将对象转换为 dlsym 返回的地址

客户端-服务器回显聊天(多路 I/O + 线程)

c - 在windows上添加openssl c语言库

c - Raspbian 上的 libudev 监控返回 NULL 指针

从文件中读取的 C++ 反向波兰表示法

c - 如何正确释放嵌套数据结构?