代码之家  ›  专栏  ›  技术社区  ›  Graza

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

  •  3
  • Graza  · 技术社区  · 16 年前

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

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

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

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

    7 回复  |  直到 16 年前
        1
  •  5
  •   X-Ray    16 年前

    你在这里提出了许多好主意。

    它是否也会创建一个空文件来“锁定”名称?

    不我相信我们依靠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;
    

        2
  •  5
  •   Nick Hodges    16 年前

    下面是关于该功能的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;
    
        3
  •  4
  •   Jamie    16 年前

    你能不能不用一个电话 GUID 相反

    编辑:第一次应该说,检查以下两个功能

    CreateGuid
    GuidToString
    
        4
  •  3
  •   grieve    16 年前

    进程ID在windows上不保证唯一。在流程的生命周期中,它们当然是唯一的,但一旦流程死亡,它的id就可以立即重用。我对ThreadId没有把握。如果这些是临时文件,您可以使用与tmpfile或tmpnam等效的东西(C函数,但我假设Delphi有一个等效的)。

    Jamie发布的GUID可能更好。

        5
  •  3
  •   Darian Miller    16 年前

    答复:
    注意:确保在实现部分的uses子句中添加“windows”

    implementation
    uses Windows;
    
    procedure MySolution();
    var
      myThreadID:Cardinal;  
      myProcessID:Cardinal;
    begin
      myThreadID := windows.GetCurrentThreadID;
      myProcessID := windows.GetCurrentProcessId;
    end;
    

    2) 在多核/多处理器情况下(在单个Web服务器机器上),这些功能是否唯一?
    回答:是的。

    进程标识符在中有效 创建进程的时间,直到 该进程已终止,正在运行 整个系统独一无二。(不是 专用于处理器)

    在线程终止之前 整个系统中的线程。 (同样,全系统,不是唯一的 处理器)

        6
  •  2
  •   Douglas Mayle    16 年前

    比这两个选项中的任何一个都好,您应该使用系统功能 _tempnam . 它返回目录中不存在的文件的随机文件名。如果愿意,可以为_tempnam提供前缀,以便创建的文件可以识别为您的文件。如果您提供的是唯一的前缀,那么就不必担心有人会打开您的文件。然而,还有另一种解决办法。

    _tempnam仅适用于将文件放入任意目录的情况。如果您不关心该目录是否为系统临时目录,请使用 tempfile_s

    编辑:我投了反对票,因为这是一个C函数。通过将它们导入delphi,您可以访问C运行时。请看一些使用msvcrt.dll的示例 here .

    function _tempnam(const Dir: PChar, const Prefix: PChar): PChar; cdecl;
      external 'msvcrt.dll' name '_tempnam';
    
        7
  •  1
  •   gabr    16 年前

    其他人都给了你一个好的、合理的想法,但仍然-如果你使用文件作为临时存储,并且如果总是先创建这些文件(不管磁盘上是否有同名的剩余文件,反正你会覆盖它),那么processid\u threadid方法是完全有效的。

    使用 GetCurrentProcessID GetCurrentThreadID Win32调用以访问这两个ID。