如何从TextFile变量获取完整的文件名?

时间:2018-03-13 09:03:05

标签: delphi delphi-5

以下代码写入名为 test.txt 的文件(在本例中,在当前目录中)

var
    F : TextFile;
begin
    AssignFile(F, 'test.txt');
    try
        Rewrite(F);
        //...
    finally
        CloseFile(F);
    end;
end;

如何从F : TextFile变量中提取完整的文件名?

3 个答案:

答案 0 :(得分:2)

解决这个问题有两个步骤:

  1. 获取TextFile对象后面的文件句柄。
  2. 从该句柄中获取文件名。
  3. 对于第1步,您使用

    var
      FileHandle: THandle;
    ....
    FileHandle := TTextRec(F).Handle;
    

    对于第2步,该过程在MSDN上列出:Obtaining a File Name From a File Handle

答案 1 :(得分:2)

由于看起来OP要求我最初理解的其他内容,我有以下答案:

{$J+}

USES Windows;

{$IFDEF UNICODE }
FUNCTION FileHandleToFileName(Handle : THandle) : STRING;
  BEGIN
    SetLength(Result,MAX_PATH+1);
    TRY
      SetLength(Result,GetFinalPathNameByHandle(Handle,@Result[LOW(Result)],LENGTH(Result),FILE_NAME_NORMALIZED))
    EXCEPT
      ON E:EExternalException DO SetLength(Result,0) ELSE RAISE
    END;
    IF COPY(Result,1,4)='\\?\' THEN DELETE(Result,1,4)
  END;
{$ELSE }
CONST FILE_NAME_NORMALIZED = $00000000;

FUNCTION GetFinalPathNameByHandleUndefined(hFile : THandle ; lpszFilePath : PChar ; cchFilePath,dwFlags : DWORD) : DWORD; stdcall;
  BEGIN
    StrPCopy(lpszFilePath,'');
    Result:=0
  END;

FUNCTION FileHandleToFileName(Handle : THandle) : STRING;
  TYPE
    TGetFinalPathNameByHandle   = FUNCTION(hFile : THandle ; lpszFilePath : PChar ; cchFilePath,dwFlags : DWORD) : DWORD; stdcall;

  CONST
    GetFinalPathNameByHandle    : TGetFinalPathNameByHandle = NIL;

  VAR
    Err                         : Cardinal;

  BEGIN
    IF NOT Assigned(GetFinalPathNameByHandle) THEN BEGIN
      GetFinalPathNameByHandle:=GetProcAddress(GetModuleHandle('kernel32'),'GetFinalPathNameByHandleA');
      IF NOT Assigned(GetFinalPathNameByHandle) THEN GetFinalPathNameByHandle:=GetFinalPathNameByHandleUndefined
    END;
    SetLength(Result,MAX_PATH+1);
    SetLength(Result,GetFinalPathNameByHandle(Handle,@Result[1],LENGTH(Result),FILE_NAME_NORMALIZED));
    IF COPY(Result,1,4)='\\?\' THEN DELETE(Result,1,4)
  END;
{$ENDIF }

FUNCTION FileNameOf(VAR TXT : TextFile) : STRING;
  VAR
    Handle      : THandle;

  BEGIN
    Handle:=TTextRec(TXT).Handle;
    Result:=FileHandleToFileName(Handle);
    IF Result='' THEN Result:=StrPas(TTextRec(TXT).Name)
  END;

我目前使用UNICODE定义来确定Delphi是否已经有GetFinalPathNameByHandle的导入定义 - 如果我找到实际实现此定义的版本,它可能会被微调。

另请注意,GetFinalPathNameByHandle仅对Windows Vista及以上版本有效。如果尝试在以前的版本上运行,它将回退到简单地提取ASSIGN的文件名。如果您需要支持Vista之前的版本,可以查看David链接到的页面,以获得适用于早期版本的版本。

答案 2 :(得分:0)

您可以使用:

TTextRec(F).Name

从TextFile变量中提取ASSIGN的文件名(上例中的'test.txt')。

如果用“完整文件名”表示你想要它包括完整目录,你需要告诉我们你想要它的Delphi版本,因为更现代的版本在这个领域有很多功能,早期版本没有。