以下代码写入名为 test.txt 的文件(在本例中,在当前目录中)
var
F : TextFile;
begin
AssignFile(F, 'test.txt');
try
Rewrite(F);
//...
finally
CloseFile(F);
end;
end;
如何从F : TextFile
变量中提取完整的文件名?
答案 0 :(得分:2)
解决这个问题有两个步骤:
TextFile
对象后面的文件句柄。对于第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版本,因为更现代的版本在这个领域有很多功能,早期版本没有。