6

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

通过使用带有 FILE_ATTRIBUTE_TEMPORARY 标志的 CreateFile(),您可以让系统知道该文件可能是短暂的。临时文件被创建为普通文件。系统需要对文件系统进行最少量的惰性写入,以保持磁盘结构(目录等)一致。这表明文件已写入磁盘。”

使用 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 标志的文件(参见 L. Osterman 的这篇文章)。

所以:

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

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

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

谢谢

4

2 回答 2

7

那么,使用 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); 
于 2009-07-04T17:21:32.403 回答
2

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

MSDN 页面中引用 CreateFile()

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

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

于 2009-07-04T18:29:41.567 回答