当前位置:  开发笔记 > 运维 > 正文

我可以根据ProcessID和ThreadID创建唯一的文件名吗?

如何解决《我可以根据ProcessID和ThreadID创建唯一的文件名吗?》经验,为你挑选了2个好方法。

我有一个delphi(Win32)Web应用程序,可以作为CGI应用程序,ISAPI或Apache DLL运行.我希望能够生成一个唯一的文件名前缀(在给定时刻对所有当前请求都是唯一的),并认为执行此操作的最佳方法是使用processID(处理CGI模式)以及threadID(处理dll模式).

如何在Delphi中获得唯一的进程ID和线程ID?

这些在多核/多处理器情况下(在单个Web服务器机器上)是否是唯一的?

编辑:请注意我被建议不要使用此方法,因此接受的答案使用不同的方法来生成临时文件名



1> X-Ray..:

你在这里有很多好主意.

它是否还创建一个空文件来"锁定"该名称?

没有; 我相信我们依靠Windows来确保自启动时间以来在同一台计算机上永远不会给出相同的临时文件名.

是否有任何冲突的机会,如果有产生的名称和创建文件(如果我需要创建自己的文件)之间的分裂秒的延迟.

没有; 那将是一件非常糟糕的事情.

这是我用来获取临时文件的例程.

function GetTemporaryFileName:string;
var
  Path, FileName: array[0..MAX_PATH] of Char;
begin
  Win32Check(GetTempPath(MAX_PATH, Path) <> 0);
  Win32Check(GetTempFileName(Path, '~EX', 0, FileName) <> 0);
  Result:=String(Filename);
end;

你可以在JCL中使用JclFileUtils.pas中的FileGetTempName().



2> Nick Hodges..:

Windows提供了创建有保证的唯一文件名的功能.无需创建自己的:

这是一个关于该功能的Delphi包装器:

function CreateTempFileName(aPrefix: string): string;
var
  Buf: array[0..MAX_PATH] of Char;
  Temp: array[0..MAX_PATH] of Char;
begin
  GetTempPath(MAX_PATH, Buf);
  if GetTempFilename(Buf, PChar(aPrefix), 0, Temp) = 0 then
  begin
    raise Exception.CreateFmt(sWin32Error, [GetLastError, SysErrorMessage(GetLastError)]);
  end;
  Result := string(Temp);
end;

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有