草庐IT

C - 在内存中创建文件

coder 2023-11-09 原文

我在这里用纯 C 编写小程序。 我需要的是直接在内存中创建一个文件(不写在硬盘上) 目前我可以使用 fopen("filename.txt,"wb") 来写入文件。

我知道在 Linux 中您可以使用 fmemopen()。 win32有没有类似的解决方案?

最佳答案

fdopen 在 POSIX.1-1990 中,Windows 以 _fdopen 的形式支持它。将它与 _get_osfhandle_open_osfhandle 一起使用,它允许从与 C 标准库的其余部分一起使用的 Windows 文件 HANDLE 构建适当的 FILE *。有关此的更多信息,另请参阅问题 Is there a Windows equivalent to fdopen for HANDLEs?

现在,问题的剩余部分是创建一个内存支持的 Windows 文件。事实证明,在 NT 下有不同的方法可以近似于此。最常见的似乎是:

  1. 创建一个临时文件;即非持久性。换句话说,将 CreateFile 与从 GetTempPath 构建的路径一起使用,也可能是 GetTempFileName

  2. ...设置了 FILE_ATTRIBUTE_TEMPORARY 文件属性 [1];即尽可能以内存为后盾。

  3. ...并设置 FILE_FLAG_DELETE_ON_CLOSE 标志 [2];即暗示它永远不需要被写入,除非它不适合内存。

只要有足够的内存将文件保存在内存中(即内存压力足够低),磁盘就不会被使用。请参阅描述此方法的 MSDN blogpost from Larry Osterman。有趣的是,他将此类文件称为“临时”临时文件

请注意,这不是 完全 等同于 fmemopen ,如果文件不适合预定义的内存区域 [3](即 fmemopen 设置一个纯内存备份文件)。然而,对于许多用途来说,它已经足够接近了(有时可能需要磁盘上的潜在支持)。

此外,有关这些文件属性和其他可能方法的一些讨论,请参阅 How to prevent flushing to disk of a memory map opened on a windows temporary delete-on-close file 讨论。

最后,对于结合了这两个部分的完整示例(即创建内存备份文件,然后将其包装在 FILE * 句柄中),请查看 fmem library 中的实现(这是为这个问题提供跨平台解决方案而编写的)或来自 libconfuse library 的解决方案。


[1]

Specifying the FILE_ATTRIBUTE_TEMPORARY attribute causes file systems to avoid writing data back to mass storage if sufficient cache memory is available, because an application deletes a temporary file after a handle is closed. In that case, the system can entirely avoid writing the data. Although it does not directly control data caching in the same way as the previously mentioned flags, the FILE_ATTRIBUTE_TEMPORARY attribute does tell the system to hold as much as possible in the system cache without writing and therefore may be of concern for certain applications.

[2]

The file is to be deleted immediately after all of its handles are closed, which includes the specified handle and any other open or duplicated handles.

[3]

Attempts to write more than size bytes to the buffer result in an error.

关于C - 在内存中创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12249610/

有关C - 在内存中创建文件的更多相关文章

  1. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  2. ruby - 如何在 Ruby 中创建无类 DSL? - 2

    我正在尝试找出如何为我的Ruby项目创建一种“无类DSL”,类似于在Cucumber步骤定义文件中定义步骤定义或在Sinatra应用程序中定义路由。例如,我想要一个文件,其中调用了我的所有DSL函数:#sample.rbwhen_string_matches/hello(.+)/do|name|call_another_method(name)end我认为用我的项目特有的一堆方法污染全局(内核)命名空间是一种不好的做法。因此方法when_string_matches和call_another_method将在我的库中定义,并且sample.rb文件将以某种方式在我的DSL方法的上下文中

  3. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  4. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  5. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  6. ruby-on-rails - 在 Rails 中创建自定义方法 - 2

    我正在尝试找到解决此问题的好方法。假设我有一个包含帖子、标题和不同状态ID的表格。在我的Controller索引中,我有:@posts=Post.all然后在我的模型中我有:defcheck_status(posts)posts.eachdo|post|#logichereendend所以在我的Controller中我有:@posts.check_status(@posts)但我在加载索引时遇到以下错误:undefinedmethodcheck_statusfor有什么想法吗? 最佳答案 它应该是一个类方法,以self.为前缀:de

  7. ruby-on-rails - 为什么我不能在 Rails 的表格中创建一个数组作为列? - 2

    为什么我不能这样做:classCreateModels是否有其他方法可以使数组(“apples”)成为Fruit类实例的属性? 最佳答案 在Rails4中并使用PostgreSQL,您实际上可以在数据库中使用数组类型:迁移:classCreateSomething 关于ruby-on-rails-为什么我不能在Rails的表格中创建一个数组作为列?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/qu

  8. ruby-on-rails - 如何在 Rails 5 中创建 ActiveRecord 无表模型? - 2

    我尝试创建新模型,该模型在数据库中没有表的情况下具有自动类型转换。我试图从ActiveRecord::Base继承它抛出异常ActiveRecord::StatementInvalid:PG::UndefinedTable:ERROR:relation"people"doesnotexist类实现:classPerson堆栈跟踪:ActiveRecord::StatementInvalid:PG::UndefinedTable:ERROR:relation"people"doesnotexistLINE8:WHEREa.attrelid='"people"'::regclass^:SE

  9. ruby - 如何在 Ruby 中创建双向 SSL 套接字 - 2

    我正在构建一个连接到服务器并等待数据的客户端Ruby库,但也允许用户通过调用方法发送数据。我使用的机制是有一个初始化套接字对的类,如下所示:definitialize@pipe_r,@pipe_w=Socket.pair(:UNIX,:STREAM,0)end我允许开发人员调用以将数据发送到服务器的方法如下所示:defsend(data)@pipe_w.write(data)@pipe_w.flushend然后我在一个单独的线程中有一个循环,我从连接到服务器的socket和@pipe_r中选择:defsocket_loopThread.newdosocket=TCPSocket.new

  10. ruby - ENOENT 在 Ruby 中创建 UNIX 套接字时 - 2

    我正在尝试使用Ruby创建套接字require"socket"w=UNIXSocket.new("socket")我不断遇到Nosuchfileordirectory-socket(Errno::ENOENT)这对我来说完全是倒退,因为new()应该创建那个丢失的文件。我错过了什么? 最佳答案 这太老了。请不要再尝试逐字使用它。http://blog.antarestrader.com/posts/153#!/rubyfile='path/to/my/socket'File.unlinkifFile.exists(file)&&Fi

随机推荐