我有一个delphi(Win32)Web应用程序,可以作为CGI应用程序,ISAPI或Apache DLL运行.我希望能够生成一个唯一的文件名前缀(在给定时刻对所有当前请求都是唯一的),并认为执行此操作的最佳方法是使用processID(处理CGI模式)以及threadID(处理dll模式).
如何在Delphi中获得唯一的进程ID和线程ID?
这些在多核/多处理器情况下(在单个Web服务器机器上)是否是唯一的?
编辑:请注意我被建议不要使用此方法,因此接受的答案使用不同的方法来生成临时文件名
你在这里有很多好主意.
它是否还创建一个空文件来"锁定"该名称?
没有; 我相信我们依靠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().
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;