【问题标题】:How to create temporary file (0x100) to accelerate application如何创建临时文件(0x100)以加速应用程序
【发布时间】:2009-07-04 17:09:58
【问题描述】:

我已经看到 Windows 系统使用临时文件来提高某些任务的性能。当我查看这些文件时,它们被标记为 0x100 属性。我从 Microsoft 收到以下文本:“

通过将 CreateFile() 与 FILE_ATTRIBUTE_TEMPORARY 标志,你让 系统知道该文件是 很可能是短暂的。这 临时文件被正常创建 文件。系统需要做一个最小的 对文件的惰性写入量 系统保持磁盘结构 (目录等)一致。 这使得外观 文件已写入磁盘 。”

使用 Delphi 创建此类临时文件的任何示例?

谢谢。

[编辑]

补充问题:使用此类文件的上下文可能是什么,例如,它是否可以用于日志系统。日志是这个带有 temp 属性的文件吗?当日志变得非常大时,它会更快并且更容易减少内存吗?

[编辑]

好的,我已经使用下面 schnaader 提供的解决方案创建文件,并带有 FILE_ATTRIBUTE_TEMPORARY:

hMyFile := CreateFile(FileName,
                      GENERIC_WRITE,
                      0,
                      nil,
                      CREATE_ALWAYS,
                      FILE_ATTRIBUTE_TEMPORARY,
                      0); 

此类文件在创建时获取 0x120 属性。因此根据系统的临时文件。

我还创建了一个带有 FILE_FLAG_DELETE_ON_CLOSE 标志 (see this article by L. Osterman) 的文件。

所以:

hMyFile := CreateFile(FileName,
                      GENERIC_WRITE,
                      0,
                      nil,
                      CREATE_ALWAYS,
                      FILE_FLAG_DELETE_ON_CLOSE,
                      0);

此文件没有属性,并且在应用程序关闭或销毁时自动删除该文件。

我没有找到如何组合属性和标志。任何的想法?

谢谢

【问题讨论】:

    标签: delphi temporary-files


    【解决方案1】:

    那么,使用 CreateFile() 方法怎么样?

    var
      FileName : PChar;
      hMyFile : THandle;
    
    ...
    
    hMyFile := CreateFile(FileName,
                          GENERIC_WRITE,
                          0,
                          nil,
                          CREATE_ALWAYS,
                          FILE_ATTRIBUTE_TEMPORARY,
                          0); 
    
    if (hMyFile = INVALID_HANDLE_VALUE) then begin
      // Error
    end;
    
    ...
    
    CloseHandle(hMyFile);
    

    要将标志与FILE_FLAG_DELETE_ON_CLOSE 组合,请使用or

    hMyFile := CreateFile(FileName,
                          GENERIC_WRITE,
                          0,
                          nil,
                          CREATE_ALWAYS,
                          FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE,
                          0); 
    

    【讨论】:

    • 好的 - 我需要使用此类文件的上下文,例如,它是否可以用于日志系统。日志是这个带有 temp 属性的文件吗?当日志变得非常大时,它会更快并且更容易减少内存吗? (注意,我已经用这个补充问题编辑了我的初始问题)。谢谢。
    • 只是一个文件。在适合使用文件的地方使用它。性能问题需要进行基准测试和其他分析,尽管可以做出有根据的猜测。
    • 查看已编辑的初始问题。谢谢。
    【解决方案2】:

    临时标志只是表示您希望尽可能晚地写入磁盘。这与您想要的日志文件完全相反,因为您希望将文件的内容安全地写入磁盘,以便即使在系统故障的情况下也可以访问它。

    引用MSDN page fro CreateFile()

    如果有足够的高速缓存可用,指定FILE_ATTRIBUTE_TEMPORARY 属性会导致文件系统避免将数据写回大容量存储,因为应用程序会在句柄关闭后删除临时文件。在这种情况下,系统可以完全避免写入数据。尽管它不像前面提到的标志那样直接控制数据缓存,但FILE_ATTRIBUTE_TEMPORARY 属性确实告诉系统在不写入的情况下尽可能多地保存在系统缓存中,因此可能会引起某些应用程序的关注。

    在我看来,您只会使用它,如果它确实是临时数据,您在完成后无论如何都要删除它,例如你要写到%TEMP% 目录的东西。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    相关资源
    最近更新 更多